본문 바로가기

CS38

내 패킷은 몇 개의 라우터를 거칠까? 오늘 교수님께서 이러한 질문을 하셨다. "패킷이 미국까지 도달하려면 얼마나 많은 라우터를 거쳐야 할까?" 아무것도 모르던 나는 수백개의 라우터를 거쳐야 할 것이라 생각했는데, 예상 외로 수십개 정도만 거치면 된다는 답변을 듣고 실제로 그러한지 알아보기로 했다. tracert 명령어를 통해 미국의 at&t 서버로 가는 경로를 찾아보았다. 실제로 내 패킷이 att.com까지 도달하는 데에는 22홉밖에 걸리지 않았다. 구글 dns 서버인 8.8.8.8까지도 11홉만에 도달할 수 있었다. 세상에 라우터가 얼마나 많은데 고작 열댓개로 미국까지 패킷을 보낼 수 있다니... 세상물정을 모르고 살았나보다. 참고로 tracert는 ping과 동일하게 icmp 프로토콜을 사용하므로 rtt를 구할 수 있다. 2023. 3. 8.
빅 엔디안과 리틀 엔디안을 직접 확인해보자 메모리는 바이트 단위로 주소를 할당하고 저장한다. 다만 CPU 아키텍쳐마다 바이트를 저장하는 순서가 다르고 이를 빅 엔디언과 리틀 엔디언이라는 명칭으로 구분하고 있다. 빅 엔디언은 큰 자릿수부터 저장하는 것으로, 우리가 평소 16진수를 읽는 순서와 동일하다. 그리고 리틀 엔디언은 그 반대로 이해할 수 있다. 왜 방식이 나뉘었는지를 논하자면 여러 이유가 있겠으나, 나는 간단히 빅 엔디언은 사람이 다루기 쉽고 리틀 엔디언은 머신이 다루기 쉽기 때문으로 이해하고 있다. 위 사진처럼 0x12345678을 저장하는 경우, 빅 엔디안은 읽는 순서 그대로 저장되므로 사람이 다루기가 쉽다. 그러나 리틀 엔디안은 오른쪽부터 읽어야하므로 조금 불편하게 느껴진다. 그래도 머신 입장에서는 리틀 엔디안과 같은 형태가 가산 등의.. 2023. 2. 4.
공유기의 원리와 NAT 요약 1. ip는 사설(private) ip와 공인(public) ip의 두 종류로 나뉜다. 사설 ip는 말그대로 private하여 로컬에서만 사용할 수 있고, 인터넷 상에서는 사용할 수 없다. 반대로 공인 ip는 인터넷 상에서 나를 대표하는 유일한 주소이다. 2. 우리는 인터넷 공급자(KT, SKT 등)로부터 하나의 공인 ip를 부여받는다. 그러나 하나의 ip를 여러 기기들이 동시에 사용할 수는 없으므로(ip 충돌), 공유기를 활용해야 한다. 3. 공유기를 연결하면, 공인 ip는 공유기가 사용하게 된다. 그리고 그 공유기와 공유기에 연결된 기기들은 사설 ip를 부여받는다. (따라서 공유기는 사설과 공인 ip를 동시에 가진다) 사설 ip는 주로 192.168.x.x로 약속되어 있으며, 그 중에서도 공유기는 주.. 2023. 1. 12.
핑(ping)이란 무엇인가 온라인 게임을 하다보면 핑이라는 단어를 쉽게 접할 수 있다. 이제는 거의 국민 게임이라고 할 수 있는 리그 오브 레전드에서도 핑을 찾아볼 수 있다. 네트워크 용어임에도 불구하고, 핑은 반응 속도와 직결된 문제로서 굉장히 예민하게 다루어지곤 한다. 다만, 많은 사람들이 착각하는 부분인데, 핑은 반응 속도 자체를 일컫는 말이 아니다. 핑은 반응 속도를 측정하기 위한 수단이다. 핑을 실행하는 예시로, cmd에 ping google.com을 입력하면 아래와 같은 화면이 나온다. (네이버는 모종의 이유로 핑을 막아놨는데, 흔히 있는 일이다) 하단의 왕복 시간을 보면 우리가 게임 상에서 보던 익숙한 단위와 숫자들이 나오는데, 이는 RTT(Round Trip Time)라는 것으로, ICMP 프로토콜을 통해 구글 서버.. 2022. 12. 8.
C#으로 구현한 스핀락 스핀락은 그냥 공회전이라고 생각하면 된다. 특별히 하는건 없지만, 굳이 자원을 소모해가며 스레드의 주도권을 유지하는 것이다. 물론 그렇게 하는 데에는 이유가 있다. 스핀락으로 인한 낭비와 컨텍스트 스위치로 인한 낭비를 비교했을 때 전자가 더 저렴한 경우가 존재하기 때문이다. 예를 들어, 임계 구역에서의 작업이 단시간에 끝나는 경우 모니터락보다 스핀락이 더 효율적일 수 있다. C#에는 이미 내장된 SpinLock 클래스가 존재하지만, 뭐든지 몸소 체득하는 편이 빠르므로 스핀락을 직접 구현해보기로 하였다. 스핀락의 대기는 무한루프로 이루어진다. 따라서 코드를 아래와 같이 작성할 수 있다. class MySpinLock { int flag = 0; //0 = unlocked, 1 = locked public .. 2022. 11. 22.
부동소수점의 정밀도 문제에 대하여 부동소수점이란, 임의의 실수를 가수부와 지수부로 나누어 표현하는 방법이다. 소수점이 떠다니듯 움직여서 부동(浮動, float)이라고 하는데, 예를 들어 1.23 * 10^2과 12.3 * 10^1이 동일한 값을 나타내듯 소수점의 위치를 임의로 조정할 수 있기 때문에 붙여진 이름으로 추측된다. 부동소수점은 컴퓨터가 실수를 근사하여 표현하는 데에 사용된다. float 자료형의 경우, 국제 표준인 IEEE 754에 의거하여 부호 1비트, 지수 8비트, 가수 23비트로 총 32비트를 사용하는데, 여기서 지수는 bias = 127을 더함으로써 0~255의 범위가 아닌 -127~128의 범위를 가진다. 이에 float의 크기는 대략 2^-127 ~ 2^128, 즉 10^-38 ~ 10^38으로 굉장히 넓은 범위를 .. 2022. 10. 28.
다익스트라 알고리즘의 증명 알고리즘에 대한 설명은 생략하겠다. 이 글에서는 다익스트라 알고리즘의 증명만, 그것도 최대한 간단하게 설명할 것이다. 증명은 귀류법으로 진행된다. 1. 다익스트라 알고리즘이 정당하다면, 한번 결정된 최단거리가 갱신되는 일은 없어야 한다. 만약 갱신된다면 그것은 '진짜' 최단거리가 아니기 때문이다. 2. 증명을 위해, 다익스트라 알고리즘이 정당하지 않다고 가정하자. 이는 최단거리가 갱신될 수 있다는 뜻이다. 3. 다익스트라 알고리즘에 의하면, 한 노드의 최단거리가 결정되는 시점은 해당 노드를 방문할 때가 된다. 따라서 최단거리의 갱신은 그 이후에, 즉 아직 방문하지 않은 노드에 의해서만 이루어질 수 있다. 4. 그러나 이는 불가능하다. 다익스트라 알고리즘은 매 반복마다 가장 가까운 노드를 방문하는데, 어떻.. 2022. 10. 14.
간단히 알아보는 트리 트리 그래프를 계층화시킨 형태 루트 노드라는 최상위 노드가 존재하고, 이는 유일하다 사이클이 존재해서는 안 된다 용어 루트 노드 (Root node) : 부모 노드가 없는 노드 *위 그림에서는 0번 노드를 루트 노드로 설정하였다 리프 노드 (Leaf node) : 자식 노드가 없는 노드 *4, 5, 6, 7, 8번 노드는 자식 노드가 없으므로 리프 노드이다 노드의 차수 (Degree) : 자식 노드의 개수 *1번 노드의 차수는 2이다 노드의 깊이 (Depth) : 루트 노드로부터의 거리 *8번 노드의 깊이는 3이다 노드의 높이 (Height) : 리프 노드로부터의 최대 거리 *0번 노드의 높이는 3이다 (2가 아님에 주의하자) 트리의 차수/깊이/높이 : 트리 내의 노드가 가질 수 있는 최대 차수/깊이/높.. 2022. 10. 10.