✔Unrealiable and Connectionless datagram protocol이다.
즉 패킷의 완전한 전달을 보장하지 않으면서 전송전에 미리 연결을 설정하지 않는다. 또한 error & flow control 기능이 전혀 없는 best-Effort 서비스이다. 데이터그램 서비스는 독립적으로 전송되며 각 네트위크 상에 접속해 있는 노드의 주소를 지정해서 데이터를 전송할 목적지를 지정하고 목적지의 주소를 가지고 패킷을 전송하기 위해 최적의 경로를 설정해주는 역할을 한다.
단편화를 위해서 필요한 3가지 필드이다. 예를 들어서 Fragmetation을 확인해 보자면 데이터그램의 크기가 4000byte이고 MTU는 1500byte라고 하자.
데이터그램의 크기가 4000Byte이므로 (IP Header: 20 byte, Payload: 3980byte)라고 이해할 수 있다. 이 데이터그램이 최대 1500Byte로 쪼개져야 한다. 그러나 1500Byte로 쪼개진 각 데이터그램에도 "헤더"가 각각 붙어야 한다. 따라서 1500Byte는 (헤더 20바이트 + Payload 1480 바이트)로 구성되어야 한다.
데이터 필드의 부분인 3980 Byte를 1480 Byte로 쪼갠다면 1480, 1480, 1020 Payload 크기를 가진 데이터그램 세 조각으로 나눌 수 있다. 세 조각으로 나누어진 데이터그램 하나하나를 자세히 살펴보자.
첫 번째 데이터그램의 Length는 1480+20(헤더)가 붙은 1500이 된다. ID는 특정 값인 'X'를 가지며 마지막 조각이 아니기 때문에 Flag의 값은 M='1'이 된다. 첫 번째 데이터그램이기 때문에 Offset은 0이다.
두 번째 데이터그램의 Length는 1480+20(헤더)가 붙은 1500이 된다. ID는 특정 값인 'X'를 가지며 마지막 조각이 아니기 때문에 Flag의 값은 M='1'이 된다. 첫번째 데이터그램에서 이미 원래 데이터그램인 1480Byte를 전송했다. 두번째 데이터그램의 시작 부분은 1480부터이다. 그러나 표현할 때는 1480이라 표현하지 않고 이를 8로 나눈 수인 1480/8=185로 표현한다. (8로 나누는 이유는 그냥 오프셋 단위가 8이기 때문이다.)
세 번째 데이터그램의 Length는 1040+20(헤더)가 붙은 1060이 된다. ID는 특정 값인 'X'를 가지며 마지막 조각이기 때문에 Flag의 값은 M='0'이다. 앞선 데이터그램에서 2960 Byte를 전송했다. 세 번째 데이터그램은 2960Byte를 표현하기 위해 2960/8=370이 된다.
각 datagram은 헤더가 20byte씩을 차지한다. 즉 처음 datagram도 헤더가 20byte를 차지하므로 Payload는 3980byte이다. 또한 MTU는 1500byte이므로 1500, 1500, 1040으로 쪼개서 보내는 게 효율적이다. 1500+1500+1040은 4040인데 계산이 잘못된 거 아니냐고 할 수 있지만, 각 datagram이 모두 20byte의 헤더를 포함한다는 것을 생각하면 된다. 처음 datagram의 datafield가 3980이므로 1480+1480+1020=3980으로 딱 맞는다.
이렇게 세 개의 조각을 받은 수신자는 이를 Offset 순서에 맞춰 재결합하여 원래의 데이터그램으로 복원시킨다. 해당 각각 쪼개지는 데이터그램에 각각 헤더를 붙여야 하기 때문에 MTU-20Byte를 해줘야한다는 사실을 꼭 염두해야 한다.
추가로 중간의 Fragment를 또 쪼갤 수도 있다. 두번째 데이터그램를 1480byte짜리를 800byte와 680byte 두개로 더 쪼갠다고 해보자. 그렇게 됬을때 800byte짜리는 flag는 M='1', offset은 185이다. 680byte짜리는 flag는 M='1', offset은 285이다.
만약 중간의 데이터 그램이 사라진다면 처음 데이터그램을 받았을때 타이머를 구동하였는데 시간이 끝날동안 안오게 되면 받았던 데이터그램도 모두 discard한다.