상세 컨텐츠

본문 제목

네트워크 프로그래밍 - IP[Header, Datagrams, Fragmentation]

개발/Network

by 2021. 11. 23. 20:26

본문

반응형

IPv4 (Internet Protocol Version4)

TCP/IP 5 layer 중 Transport layer에 TCP이외에 UDP가 있다.

 

Header format

위 그림은 UDP header이며 보통 8byte의 크기로 발신 port number와 목적지 port number가 담겨있고, 전체 길이 및 checksum이 있다. window size, control field, sequence number 등 여러가지가 있던 TCP header보다는 간략하다.

 

이번 포스팅에서는 Network layer의 IP에 대해서 알아보도록 한다.

 

Datagrams

Network layer에서 패킷을 datagrams라고 부른다고 했었다. 가변적인 header를 가지고 있어 옵션 사용여부에 따라 20~60까지의 길이를 가질 수 있다.

VER bit의 들어가는 버전이 4인지 6인지에 따라 header format이 다르다. 

HLEN의 경우 TCP header와 마찬가지로 최대 길이인 60까지 표현해야하기에 6bit가 필요하지만 4배수로 계산하여 4bit만을 사용한다. 받는쪽에서는 HLEN에 *4를 하여 header 길이를 알아낸다.

Service type은 잘 사용하지 않으므로 생략한다. 

 

Total length

위 Header format에서 Total length는 header와 data를 포함한 datagrams의 전체 길이이다.

위 그림에서 L2에 해당하는 양쪽 부분은 frame에 해당하고, 안의 Payload에는 data + TCP header + IP header인 상태이다. TCP 20byte, IP 20byte하였을 때, 나머지 data의 크기를 합하여 최소 46byte가 되어야한다. 

총 크기가 46byte가 되지 못하면 나머지를 Padding으로 채워주는데, 만약 data가 1byte라서 총 41byte라면, Padding에 5byte로 채워진다. 

46byte보다 총 Payload길이가 작은 경우에는 header의 Total length를 통해 Padding이 얼마나 차지하는지를 알아내야한다. 

 

Time to live

Time to live(TTL)은 패킷이 router를 통해서 전송될 때, 경로가 잘못되어 같은 경로를 순환하는 loop가 발생할 수 있다. Time to live에는 Maximum hop count가 있어 hop count 이상으로 hop-to-hop전송이 이루어지면 패킷을 버린다.

 

Protocol

Network layer와 Transport layer가 있다. Network layer의 서로다른 프로토콜 ICMP, IGMP, OSPF는 모두 IP 헤더를 포함하고 있다. 

 

따라서 위와 같은 table을 통해 다른 프로토콜에서 받거나 전송할 때 어떤 프로토콜인지 구분하고, 변환하여 보내는 데 사용한다. 

 

 

example

IP packet header의 첫 8bit가 위와 같다고 한다. 첫 4bit는 VER bit이고, 그 다음 4bit는 HLEN이다. 

HLEN 4bit는 값이 2이므로 4를 곱하여 8byte가 나온다. 하지만 기본적으로 header는 최소 20byte이기 때문에 올바르지 못한 패킷이므로 버린다. 

 

example

IP packet의 HELN이 이진수 1000이라고 하자. 십진수로 8이므로 *4 하며 32byte가 header의 길이이다. 

기본헤더가 20byte이므로 option으로 12byte를 사용하고 있다.

 

example

IP packet의 HLEN 값이 16진수로 5이며, total length가 16진법으로 0028이라고 한다.

header의 길이는 5 * 4 = 20byte이고, 

total length 0028은 십진법으로 40byte이다. header length가 20byte이므로 Payload는 20byte이다. 

 

example

IP packet의 처음 bit 몇 개의 16진수가 다음과 같다고 한다. 이 packet이 몇 개의 hop을 거쳐갈 수 있는지 maximum hop count를 알아보려한다.

16진수는 한 자리당 4bit이므로 처음 4bit (4)는 VER bit,

다음 4bit (5)는 HLEN,

다음 8bit (00)은 Service type,

다음 16bit (0028)은 total length 이다.

 

Maximum hop count는 Time to live에 들어있으므로, Time to live를 찾기위해 시작부터 64bit 즉 8byte를 건너뛰고 8bit를 구하면 된다.

16진수로 2자리가 1byte이므로 총 16자리를 건너뛰면 값은 01이다.

따라서 십진수로 1이므로 해당 packet은 1개의 hop만을 지나갈 수 있다.

 

 

Fragmentation

앞에서 Frame의 Payload부분의 minimum값은 46이라고 했었다. 추가로 Payload의 Maximum으로 MTU가 존재한다. MTU는 physical network마다 다르다. 즉 네트워크마다 허용가능한 IP datagram의 크기가 다르다. 

 

Flags field

위 header format에서 Flags에 해당하는 것을 보자.

 

flags field 3bit 중 첫 번째는 사용하지 않고 뒤의 2bit만 사용한다.

D에 해당하는 bit는 패킷을 분할하는 경우에 분할하지 않도록 설정하는 것이다. 만약 분할하지 않은 크기가 전송할 수 없는 크기라면 패킷을 버린다. 

M에 해당하는 bit는 분할했던 패킷을 재조합할 때 사용되며, 1로 설정된 경우 뒤에 분할된 패킷이 더 남아있다는 것, 0인 경우 마지막 패킷이라는 의미로 사용된다.

 

Fragmentation example

실제로 어떻게 분할되는지 알아보자.

분할과 관련하여 Header format 중 Fragmentation offset을 사용한다. 

Fragmentation offset은 13bit이므로 2^13인 약 8000정도까지 표현할 수 있다. 하지만 Total length는 16bit로 표현되므로 13bit로는 모두 표현할 수 없다. 

부족한 3bit만큼 즉 8배수 만큼 차이가 나므로 HLEN과 마찬가지로 Fragmentation offset에 *8한 값으로 Total length를 표현한다.

 

위 그림과 같이 1400byte의 경우 8로 나눈 175를 offset에 저장한다. 

이렇게 나눈 값이 각각 패킷의 datagram으로 들어가기 위해서는 자른 byte 크기와 Header length의 합이 MTU에 해당해야한다. 

Payload가 1400byte이고 header가 기본 20byte이므로 위 그림과 같은 상황에서 패킷의 MTU는 1420이라고 알 수 있다.

 

Detailed fragmentation example

Header format에서 Identification은 TCP에서의 sequence number와 비슷한 용도이다. 패킷의 재조합을 목적으로 사용한다. 

 

위와 같이 분할되는 경우 재조합 할 때 Identification이 14,567로 같은 것을 모아 재조합한다. 

Fragment 1의 경우 MTU가 1420이므로 1400만큼 분할하고 첫 번째 byte수를 8로 나누어 fragmentation offset으로 저장한다. header의 길이 20byte를 포함하여 total length는 1420이다.

 

Fragment 2도 마찬가지로 1400byte 만큼 분할하고 Identification은 동일하다. 첫 byte인 1400을 8로 나눈 175가 offset에 저장된다. payload 1400byte에 header 20byte로 total length는 1420이다.

 

Fragment 3는 1400으로 분할하고 남은 1200byte가 되고, Fragment 3의 경우 마지막 패킷이므로 flags field의 More fragment를 0으로 설정한다. 첫 byte 2800을 8로 나눈 350이 offset으로 저장되고, payload 1200byte + header 20byte로 1220byte이다. 

 

특정 상황에서 Fragment 2가 도달하는 네트워크의 MTU가 1420보다 작을 수 있다. 이 경우 Fragment 2.1로 분할된 값의 total length를 보아 MTU가 820임을 알 수 있다. Fragment 2.1은 800byte로 분할되고 offset은 첫 byte 1400/8로 175이다.

Fragment 2.2는 분할하고 남은 600byte로 구성되고, 첫 byte 2200을 8로 나누어 275가 offset이다. Fragment 2.2 뒤에는 Fragment 3가 있으므로 Fragment 2.2의 flags field More fragment는 1이다. 

 

 

example

packet의 flags field M bit가 0이라고 한다. M bit가 0인 경우 분할된 패킷이라면 마지막 패킷이고, 그렇지 않다면 하나의 패킷인 경우이다.

 

example

packet의 flags field M bit가 1인 경우, 뒤에 분할된 패킷이 더 있다라는 뜻이므로, 처음 패킷인지 중간의 패킷인지 알 방법이 없다.

example

packet의 flags field M bit가 1이고 offset이 0이라면, 가장 앞에있는 패킷임을 알 수 있다. 

example

packet의 offset이 100이라고 한다. 해당 packet의 first byte와 last byte를 알아보자.

offset이 100인 경우 *8하여 800이 packet의 시작 byte임을 알 수 있지만, last byte는 알 수 없다.

example

packet의 offset이 100이고, total length가 100이라고 한다.

이 경우 header는 20byte이므로 payload는 80byte이다. offset이 100이므로 first byte는 100*8 = 800이고, 800byte에서 80byte만큼 지난 879byte가 last byte이다. 

반응형

관련글 더보기