📌 MTU(Maximum Transmission Unit)
- 패킷으로 쪼개질때 MTU를 기반으로 쪼개짐
- 네트워크에 연결된 장치가 받아들일 수 있는 최대 데이터패킷의 크기
- 이 크기를 기준으로 데이터는 쪼개져서 패킷화됨
- 네트워크 경로 상에 있는 장치의 MTU보다 패킷이 크면 그 패킷은 분할 될 수 있음(
단편화
)
⭐ 패킷이 분할되지 않는 경우
- 패킷을 분할할 수 없어 네트워크 경로 상에 있는 어떠한 라우터나 장치의 MTU를 초과할 때 분할해서 전달하는 것이 아닌 전달을 아예 하지 않을 수 있다
- IPv6 : 분할 허용 X
- IPv4 : flags라는 필드의 bit가 1이 되면 분할 불가능
⭐ 분할과정
- IP 패킷의 크기를 다음 라우터의 MTU와 비교
- 다음 라우터의 MTU보다 크면 페이로드를 두개 이상의 패킷으로 분할 후 각각 헤더를 붙여줌
- 이때 패킷에 순서를 정하게 됨
📌 MSS(Maximum Segment Size)
- TCP 세그먼트의 크기
- MTU는 IP헤더와 TCP헤더의 크기까지 합치지만, MSS는 데이터의 크기(payload)만을 가리킨다.
- 일반적으로 MTU는 1500바이트, MSS는 1460바이트이다. 따라서, 데이터를 보낼때 1460바이트 이하의 크기로 보내야 전달이 가능하다.(TCP의 경우임, 아래 예제는 ICMP여서 값이 다름)
⭐ MTU 확인
ping www.google -f -l 1500
ping www.google -f -l 1472
- DF는 "Don't Fragment"를 의미
- ping은 IP헤더(20바이트) + ICMP헤더(8바이트)로 요청을 보내는 것이기 때문에 1500 - 28 = 1472바이트 데이터는 올바르게 송수신 가능
netsh interface ipv4 show interfaces
📌 PMTUD(Path MTU Discovery)
- 수신자와 송신자의 경로 상에서 장치가 패킷을 누락한 경우 테스트 패킷의 크기를 낮추면서 MTU에 맞게끔 반복해서 보내는 과정
- IPv4와 IPv6 사용에 따라 작동 방식이 다름
⭐ IPv4
- IPv4는 분할을 허용하므로, PMTUD에서는 Don't Fragment 플래그를 켠 시험 패킷을 경로에 보냄
- 이후 패킷이 누락되면 ICMP 메세지와 MTU를 같이 돌려 보내고, 소스 장치는 MTU를 낮추고 다른 시험 패킷을 보냄
- 패킷이 누락되지 않고 전체 네트워크를 통과할 수 있을때까지 반복
⭐ IPv6
- IPv6는 Don't Fragment옵션이 없으므로 해당 플래그를 사용하지 않음
- 시험 패킷을 전송, 누락되면 ICMP 메세지를 전송
- 이 후 전체 네트워크를 통과할 때 까지 MTU를 줄이는 과정을 반복