본문 바로가기

work/network

IP (Internet Protocol)헤더의 구조

0                                                                                  15 16                                                                               31

4bit

version

4-bit header

length

8-bit type of services

(TOS)

16-bit total length (in bytes)


16-bit identification

3-bit

flags

13-bit fragment offset


8-bit time to live

(TTL)

8-bit protocol

16-bit header checksum

20 bytes

32-bit source IP address


32-bit destination IP address


option (if any)


data


4bit version: 버전을 나타냄. 현재는 IPv4를 사용하고 있지만 보안상 문제가 많아 이를 해결하기 위해서 IPv6가 보편화 될것임  

4bit header length: 데이터 영역을 제외한 순수 헤더의 길이. 아래에서 옵션은 일반적으로는 잘 사용되지 않는 부분이다. 그래서 대부분 5가 된다.(단위는 4byte이다. 4*5=20bytes) 만약 옵션이 사용될 경우에는 반드시 4byte씩을 채워야 한다.

8bit type of service(TOS): 앞의 3비트는 사용되지 않으며, 나머지 1비트는 0이다.

RFC1349에서 권장하는 서비스별 TOS설정값이다

16bit total length: IP 데이터그램의 길이를 byte로 표시한다. 최대길이는 16비트이므로, 2의16제곱-1=65535bytes가 된다. 이 데이터를 넘게되면 데이터는 분해되어 전송된다. 이것을 단편화(Fragmentation)라고 부른다.  

16bit Identification: IP가 중복되지 않는 값으로 IP 헤더를 구별할 수 있는 값이다. 이값은 계속적으로 증가되며 최대 65535까지 증가하고 이후 다시 처음으로 돌아와서 증가하기 시작한다.  

3bit flages: 위에서 말했던 단편화와 관련이 있는 플래그이다. 먼저 첫 번째 플래그는 0이다. 두 번째 플래그는 DF(Don't Fragment)로, 단편화를 하지 않는다는 뜻으로 설정되는 비트이다. 세 번째 플래그는 MF(More Fragment)로 단편화를 한다는 뜻이다.  

13bit fragment offset:

MF되었을 때 그 위치 값을 나타내는 값이다. 쉽게 말하면 쪼개고 나서 다시 조립할 때 상대적인 위치를 나타낸다. 각 조각난 패킷은 동일한 IP헤더를 가지게 된다. 다만 offset값만 다르다. 이 값은 후에 패킷을 받는 쪽에서 재조립을 할 때 사용하기 위해서 패킷의 크기를 알려주는 값이 된다. 패킷이 조각나면 A, B는 IP헤더의 MF값을 1로 설정한다. 그리고 마지막 패킷인 C는 0으로 설정된다. 이 값으로 패킷이 모두 도착했음을 알리게 되는 것이다. 패킷을 쪼갤 수 있는 최소크기는 8bytes이다. 물론 최대크기는 자신의 자신의 MTU를 넘지 못한다. 하지만 요즘의 많은 OS에서는 16바이트 이하로 패킷을 생성하면 전송되지 않는 경우를 볼 수 있다. 전송하고 하는 데이터가 전송 버퍼보다 큰 경우 이 패킷을 적당한 크기로 분할하게 된다. 또는 라우터를 지나면서 라우터가 자신의 능력(MTU)에 맞게끔 패킷을 다시 분할하기도 한다. 하지만 패킷이 너무 많이 쪼개지면 통신량이 많아지고 효율성이 떨어지므로 문제가 될 수도 있다. 또한 중간의 조각난 패킷이 손실되면 해당 데이터는 조립이 불가능하므로 나머지를 모두 버리는 상황이 발생할 수 있다.  

패킷의 도착순서는 알 수가 없다. 네트워크의 상황에 따라서 먼저 출발한 패킷이 나중에 올 수도 있기 때문이다. 모든 패킷이 동일한 네트워크를 따라서 움직이지 않을 수 있다는 말이다.

-패킷의 조립과정: 패킷이 도착하면 오프셋 값을 이용하여 차례대로 패킷을 재조립하게 된다. 이때 ID(Identification)값은 동일하기 때문에 ID값에 대해서 오프셋 값을 적용하여 패킷을 재조립하는 과정을 거치게 된다.


<------504 Octet------>

<------504 Octet------>

<------504 Octet------>

IP헤더








IP헤더

Data Fragment A








IP헤더

Data Fragment B








IP헤더

Data Fragment C

(Identificaton은 모두 같고 offset으로 Data순서를 구분시킨다. 나머지 IP헤더는 같다. Data Fragment는 data.)

8bit time to live(TTL):

네트워크 상에서 얼마나 오랫동안 살아남을 수 있을지 결정하는 수치. 라우터 하나를 지날 때마다 이 값은 1씩 줄어든다. 만약 값이 0이 되면 패킷은 버려진다. TTL 값이 0이 되면 그 결과를 ICMP패킷으로 출발지에 되돌려준다.(라우터무한반복을 피하기 위한 TTL)

8bit Protocol:

수신할 상위 계층을 나타내기 위해서 사용한다. 이 필드가 사용되는 가장 큰 이유는 다중화의 지원이다. 한 IP 주소를 가진 컴퓨터에서 여러 가지 서비스를 동시에 하기 위해서 반드시 필요한 부분이 될 것이다. TCP는 6번, UDP는 17번, ICMP는 1번 값을 사용한다.

16bit header checksum:

IP헤더에만 사용된다. 헤더를 구성하는 16개 비트각각의 1의 보수를 더한다. 그런 다음 합계의 1의 보수를 구한다. 이 필드는 TTL필드가 라우터에서 감소되므로, 각 라우터에서 다시 계산되며 그에 따라 IP 헤더도 수정된다(16개의 비트가 전체 IP헤더를 나타낸다)

32bit Source IP address, 32bit Destination IP address:

출발지와 목적지의 IP 주소값을 가진다. IP 네트워크가 무연결 네트워크이기 때문에 모든 IP 데이터그램은 출발지와 목적지 주소 값을 가지고 보내진다.

<RFC1349에서 권장하는 서비스별 TOS 설정값>

Application

Minimize

delay

Maximize

throughput

Maximize

reliability

Minimize

monetary

cost

Hex

value

Telnet/Rlogin

1

0

0

0

0x10

FTP






control

1

0

0

0

0x10

data

0

1

0

0

0x08

any bulk data

0

1

0

0

0x08

TFTP

1

0

0

0

0x10

SMTP






command phase

1

0

0

0

0x10

data phase

0

1

0

0

0x08

DNS






UDP query

1

0

0

0

0x10

TCP query

0

0

0

0

0x00

zone transfer

0

1

0

0

0x08

ICMP






error

0

0

0

0

0x00

query

0

0

0

0

0x00

any IGP

0

0

1

0

0x04

SNMP

0

0

1

0

0x04

BOOTP

0

0

0

0

0x00

NNTP

0

0

0

1

0x02