CS/네트워크

Internet Protocol - IP 프로토콜

Jshrewd 2022. 12. 1. 19:19
728x90

OSI 5 계층에서 프로토콜 규격

Application layer - SMTP , FTP , TFTP , DNS , SNMP , DHCP

Transport layer - SCTP , TCP , UDP

Network layer - IGMP , ICMP, IP, ARP

Data link layer / Physical layer - Underlying LAN or WAN technology

 

Network layer에서 패킷은 datagram이라고 부른다.

IP datagram

 

Header : 20 ~ 60 bytes

Data : Header 포함 총 65,535 bytes

 

Header format

VER : 4bits HLEN : 4bits Service type : 8bits Total Length : 16bit
Identification : 16bits Flags : 3bits Fragmentation offset : 13bits
Time to live : 8bits protocol : 8bits Header checksum : 16bits
Source IP address
Destination IP Address
                                                                           Options + padding ( 0~40 bytes)

VER : ip version을 판단. 0100 => IPv4 0110 => IPv6

HLEN : header 길이를 판단

Total Length : 헤더를 포함하는 데이터그램의 전체 길이를 정의하는 영역.

최소가 46bytes여야 함. 만약 46bytes보다 작으면 padding을 통해 46바이트보다 크게 만듦. 전송할 때 상대방에게 padding 수를 전달해줘야함.

Identification : 패킷마다 번호를 붙여 분할 / 재조합 용도

Time To Live : TTL. 네트워크에서 경로가 잘못되면 무한루프에 빠질 수 있음. 이를 방지하기 위해 일정 시간이 지나면 소멸될 수 있게 함.

protocol : value가 1이면 ICMP, 2이면 IGMP, 6이면 TCP , 17이면 UDP, 89면 OSPF

 

Ex) IP 패킷이 도착했는데, 처음 8번째 비트가 01000010이였다. 그러나 리시버는 이 패킷을 버렸다. 왜 버렸는가 ?

 

Answer -> IP header format에서 볼 수 있듯이, 맨 처음 4bit는 VER이다. 0100이므로 이는 십진수로 4. IPv4를 의미한다.

다음 4bit는 HLEN이다. 0010이 왔는데 이는 십진수로 2이다. 2*4는 8이므로 헤더의 길이가 8이라는 의미인데, 헤더는 최소 20bytes가 되어야 한다. 그러므로 이 패킷은 전송되는 과정에서 corrupted 되었다고 판단하고 버린다.

 

Ex) IP 패킷이 도착했는데, 처음 16진수 자리가 45000028000100000102였다. TTL 값이 무엇인가 ?

 

Answer -> TTL filed를 찾기 위해 우리는 8bytes를 건너 뛰어야 한다. (Ver 4bits , HLEN 4bits, total length 16bits, identification 16bits, flags 3bits, fragmentation offset 13bits . 즉, 총 32bits)

4bit가 1의 hexadecimal 값 이므로, TTL 값은 01이다.

 

MTU - Maximum Transfer Unit

IP datagram이 MTU보다 크면 패킷을 쪼갠다.

Header format에서 Flags 필드는 3bit이다.  1bit는 쓰이지 않고, D | M 의 2bit가 뒤에 붙어서 3bit인데,

D : Do not fragment. 즉 D = 1 이면 data가 MTU보다 크더라도 쪼개지 않고 패킷을 버리라는 의미.

M : More fragments. 즉 M = 1이면 뒤에 fragmentation 패킷이 더 있으므로 마지막이 아니라는 뜻이고, M = 0이면 마지막 packet이라는 의미.

 

 

Ex) 4000bytes의 데이터가 있다. MTU가 1420일 때, Offset과 Data block을 그려라.

 

Answer -> 처음 offset = 0000/8 = 0   8로 나누는 이유는 Fragmentation offset이 13bit인데, 13bit로 16bit를 표현해야 하기 때문에 8로 나누는 것이다. 수신측에서는 *8을 해야 실질적인 Offset이 나온다 !

MTU가 1420 => Header 길이가 20, Data는 1400.

첫 블락 Offset = 0000/8 = 0 데이터 block은 0000~1399

두번째 블락 Offset = 1400/8 = 185 데이터 block은 1400~2799

세번째 블락 Offset = 2800/8 = 350 데이터 block은 2800~3999

 

Ex) 패킷이 도착했는데, M bit 값이 0이였다. 이것은 처음 조각인가? 마지막 조각인가? 중간 조각인가 ?

 

Answer -> M bit값이 0이므로 마지막 packet이라는 의미이다. 그러나 조각(fragmentation)인지는 알수 없다. 왜냐하면 Fragmentation 되기 전에 original packet도 M bit가 0이기 때문이다. 그러므로 M bit만 봐서는 original packet인지 fragmentation packet인지 알 수 없다.

 

Ex) 패킷이 도착했는데, M bit 값이 1이고, Fragmentation offset 값이 0이였다. 처음 , 마지막 , 중간 조각 중 어느것인가?

 

Answer -> M bit 값이 1이므로, 아직 올게 더 남았다는 뜻이므로 마지막 조각은 아니다. 그 뒤 Fragmentation offset 값이 0이므로 0000 / 8 = 0인 것이므로 처음 조각이다.

 

Option format

Type : 1 -> 00000001은 No operation option. 옵션의 시작이나, 다음 옵션을 알리는 데 자주 활용된다.

Type : 0 -> 00000000은 End of option으로 주로 Padding 목적으로 많이 사용된다.

Type : 7 -> 00000111은 Record-route option으로, 전체길이와 pointer를 사용하여 네트워크 경로에 주소를 실어서 보낸다.

Type: 137 -> 10001001은 Strict-source-route option으로, 전체길이와 pointer를 사용하여 source 주소와 destination 주소를 비교하여 pointer가 가르키는 곳과 destination 주소를 바꾼다. ( 다음에 지나 갈 주소라는 의미 ) 주로 관리자가 경로가 제대로 set-up 되었는지 확인하기 위해 주로 사용한다.

Type: 131 -> 10000011은 Loose-source-route option으로 Strict와 비슷한 옵션이지만, Strict는 반드시 해당하는 그 경로를 지나야 하는 반면에, Loose 옵션은 중간에 다른 지점을 거쳐도 된다. (Flexible)

Type: 68 -> 01000100은 Time-stamp option으로, 전체 길이와 Pointer 및 O-Flow 4bits, Flags 4bits를 사용한다.

Flag가 0이면 timestamp 시간만 기록하고,

Flag가 1이면 들어온 IP 주소와 timestamp 시간을 기록하고,

Flag가 3이면 ip 주소가 도착했을 때 timestamp 시간을 기록한다.

 

728x90