큰 IP 패킷들이 적은 MTU(Maximum Transmission Unit)를 갖는 링크를 통하여 전송되려면 여러개의 작은 패킷으로 쪼개어/조각화 되어 전송돼야 한다.
즉, 목적지까지 패킷을 전달하는 과정에 통과하는 각 라우터마다 전송에 적합한 프레임으로 변환이 필요하다.
일단 조각화되면, 최종 목적지에 도달할 때까지 재조립되지 않는 것이 일반적이다.
IPv4에서는 발신지 뿐만 아니라 중간 라우터에서도 IP 조각화가 가능
IPv6에서는 IP 단편화가 발신지에서만 가능
재조립은 항상 최종 수신지에서만 가능
*IPv4 프로토콜은 20byte이다. (최대 60byte)
11,980byte의 데이터를 최대 전송단위(MTU) 3,300byte에 맞춰 잘게 쪼개려고 한다.
IPv4 프로토콜 까지 합친 값이 MTU 값임.
쪼개진 데이터의 크기가 3,28byte인 이유 : IPv4 프로토콜(20byte)도 같이 보내므로.
MF(More Fragment) : Fragment가 더 있는지 표시
Offset : 패킷이 기준점(앞의 데이터)으로부터 떨어진 거리. 8로 나눈 값.
id값과 mf, offset을 이용해 데이터를 합침
실제 전송되는 프레임(2계층의 PDU)은 1514byte.
MTU가 거르는 시점 : IPv4가 붙고 나서!
4bit 단위로 자르면 0010이 되므로 16진수로 변환하면 2가 된다. (2진수 4자리당 16진수 1자리)
ICMP는 마지막 패킷에만 붙는다.
크기가 4800인 데이터를 보내면 어떻게 쪼개질까?
첫번째 패킷의 데이터: 1480
마지막 패킷의 데이터: 360
첫번째 패킷: 14(Eth) + 20(IPv4) + 1480(Data) = 1514
마지막 패킷: 14(Eth) + 20(IPv4) + 8(ICMP) + 360(Data) = 402
cmd에서 ping ip -l 4800 명령어 입력
와이어 샤크로 확인해보면 패킷이 총 4개의 조각으로 전달된 걸 확인할 수 있음.
왼쪽이 첫번째 프레그먼트, 오른쪽이 두번째 프레그먼트이고 둘의 id값이 886으로 같은 걸 확인할 수 있음. 두번째 프레그먼트의 offset값은 첫번째 데이터의 크기인 1480을 4로 나눈 b9(10진수로 185)
마지막 프레그먼트는 ICMP가 붙어있음