본문 바로가기

네트워크/네트워크 용어 (DICT)

네트워크와 관련된 넓고 얕은 지식 (IP 프로토콜 편)

반응형
찾고 싶은 내용이 있으시면 Ctrl + F로 찾아보시는 것을 추천해요. 
혹여나 틀린 내용이 있다면, 댓글이나 이메일로 알려주시면 감사하겠습니다.

 

IP 프로토콜

  IP 프로토콜은 OSI 7 Layer에서 3계층에 존재하는 프로토콜로 사실상 유일한 3계층의 프로토콜이다. IP 프로토콜의 철학..? 은 바로 Best Effort Service 이다. 뭔가 사람에게서나 나올법한 이야기같지만, 말그대로 IP 프로토콜은 자신이 구현된 설계대로 목표를 온전히 "수행"함에 초점을 둔다는 의미인 것 같다. IP 프로토콜이 다루는 패킷은 상대 호스트에게 온전히 도착한다는 보장이 없다. 다만 IP 정보를 이용해서 보내면 되는 것. 그게 IP 프로토콜의 사명인가보다. (물론 상위 레이어에서 이를 보장해줄 수 있다.)

Best Effort Service 철학에 맞게,

IP 프로토콜은 Unreliable하고

 

손실된 패킷을 복구하려하지 않고, 

 

Connectionless 이다.

 

받는 패킷들은 모두 독립적으로 처리되며, 패킷의 순서또한 인지하지 못한다.

여기서 말하는 패킷의 순서란 서로 다른 호스트 간의 이야기로, 아래 나올 Fragment를 조합하는 순서와는 다른 이야기 이다.

 

IP Header

ip header

IP Header는 중요한 내용이 많으니, 하나하나 짚고 넘어가보자.

version : IP의 버전을 의미한다. 통상 우리가 사용하고 있는 32bit의 주소는 IPv4에 해당한다. 값은 4

header length : 말 그대로 header의 길이를 의미한다. 다만, 4byte단위로 계산하므로 보통 20byte인 header length의 경우 값이 5로 들어간다.

DS : Differentiated Service 약자로, 패킷에 우선순위를 둘 수 있는 기능인데 현재는 인터넷에서 사용되지 않는다.

ECN : Explicit Congestion Notification의 약자로, 네트워크 상에 Delay (congestion)가 발생하는 경우 패킷에 명시적으로 표시해주기 위한 필드

total length : header와 payload의 길이를 합친 값. header의 최소 길이가 20byte이므로 total length는 20byte < total length < 2^16 의 크기를 갖는다.

identification : 말 그대로 패킷의 식별자 역할을 하는 16bit. 주로 Fragmentation된 패킷들이 어디로 통합되어야 하는지 구분할 때 사용한다.

Flags : 위의 그림에서는 0 / DF / MF 필드에 해당한다. 그래서 총 3bit로 이루어져있고, 앞의 0으로 세팅된 필드는 그냥 0이다... 그냥 0이다.. 정말로..

 

진짜로..

다음 bit인 DF는 Don't Fragment의 약자로 1로 세팅되어져 있으면, 패킷을 Fragment 하지 말라는 의미이다.

마지막 MF는 More Fragment의 약자로 1로 세팅되어있는 경우,

이 패킷은 Fragment된 패킷이고 동시에 첫번째 패킷일 수도, 중간 패킷일 수도 있음을 의미한다. ( = 마지막 패킷은 아니다.)

MF가 0으로 세팅되어있는 경우.

이 패킷은 Fragmentation이 아닌 단일 패킷일 수도, 아니면 Fragmentation된 패킷의 마지막 Fragment일 수도 있다.

이를 정확히 판단하기 위해서는 다음 필드와 함께 봐야한다.

Fragment Offset : 패킷이 Fragmentation 된 경우, 수신지에서는 패킷들을 어디에 붙여야하는지 알 수 있어야하는데, 이 필드를 보고 파악할 수 있다. 일단 그림으로 이해하는게 빠를 것 같다. 

 

Fragmentation

패킷이 Fragmentation 되는 경우, 각 Fragment에는 별도로Header가 붙는다. 이 각 기 Header 속 Fragment Offset 필드에는 이전 패킷의 byte 위치가 들어간다. 첫 번째 Fragment는 0이 들어갈테고, 두 번째 패킷으로 예를 들어보자.

 

2번째 Fragment

Fragment Offset에는 185라고 적혀져있다. 분명 byte의 위치라면 1480이어야하는데.. 왜 굳이 185라고 적혀있을까? 이유는 이 필드의 사이즈와 연관이 있다. Fragment Offset은 13bit 인데 반해, total length를 보면 16bit로 약 65536byte 크기이다.

그래서 13bit 의 offset 필드로 65535byte를 다 명시할 수 없어서 8로 나눈 값을 사용한다. 이전 Fragment가 1480byte 였으므로, 2번째 Fragment가 붙어야하는 위치는 1480 / 8 = 185 byte이다.

 

3번째 Fragment

3번째도 마찬가지, header를 제외하고 붙어야하는 byte 위치는 1480 + 1200 = 2680, 2680 / 8 = 335 byte 이다.

이어서 다음 필드를 보자.

TTL : time-to-live의 약자로 패킷이 거쳐갈 수 있는 hop수를 의미한다. hop은 라우터를 거칠 때 마다 1 씩 감소한다. 특정 상황에서 패킷이 루핑에 빠지는 것을 예방할 수 있다.

protocol : 상위 프로토콜을 의미한다. 6 = tcp / 1 = ICMP 등...

Checksum : header 정보를 이용해서 만든 것으로, 패킷의 내용이 다르면 다른 Checksum을 갖는데, 이를 이용해서 내용의 변조를 체크할 수 있다.

Source / Destination IP Address : 말그대로 송신지, 수신지 IP 주소가 들어간다. 각각 32bit 이다.

반응형