일반적으로 PMTUD (Path Maximum Transmission Unit Discovery)는 호스트가 너무 커서 패킷이 삭제되었다고 생각할 때마다 발생합니다.
이는 패킷이 삭제되었음을 명시 적으로 나타내는 ICMP 조각화 필요 (유형 3, 코드 4) 응답에 대한 응답 일 수 있습니다. 일반적으로 모든 IPv4 패킷은 "DF (Do n't Fragment)"플래그 설정으로 설정되므로 MTU를 초과하는 패킷은 이러한 응답을 유발합니다. IPv6은 조각화를 전혀 지원하지 않습니다.
순진한 관리자 가 ICMP를 보안 위험 요소로 생각 하기 때문에 일부 라우터 또는 호스트 방화벽은 모든 ICMP를 자주 삭제합니다 . 또는 일부 링크 집계 체계로 인해 ICMP 배달이 중단 될 수 있습니다 . ICMP에 의존하지 않는 MTU를 발견하기위한 대체 메커니즘이 RFC4821 에서 제안되었다 .
tracepath
MTU를 조사하는 데 가장 좋아하는 Linux 도구입니다. 다음은 LAN에서 9001 MTU가있는 호스트의 예이지만 10.33.32.157에 도달하려면 IPsec VPN을 통과해야합니다.
$ tracepath -n 10.33.32.157
1?: [LOCALHOST] pmtu 9001
1: 10.1.22.1 0.122ms pmtu 1500
1: 169.254.3.1 1.343ms pmtu 1422
1: 10.255.254.61 23.790ms
2: no reply
^C [this host won't return an ICMP port unreachable, so tracepath won't terminate]
ICMP 오류는 다음과 tcpdump
같이 볼 수 있습니다 .
$ sudo tcpdump -p -ni eth0 'icmp and icmp[0] == 3 and icmp[1] == 4'
14:46:57.313690 IP 10.1.22.1 > 10.1.22.194: ICMP 10.33.32.157 unreachable - need to frag (mtu 1500), length 36
14:46:57.315080 IP 169.254.3.1 > 10.1.22.194: ICMP 10.33.32.157 unreachable - need to frag (mtu 1422), length 556
MTU 감지가 캐시됩니다. Linux에서는이를 관찰하고 플러시 할 수 있습니다 ip
( Linux 3.6 이후 의 변경 사항에 주의 ).
$ ip route get 10.33.32.157
10.33.32.157 via 10.1.22.1 dev eth0 src 10.1.22.194
cache expires 591sec mtu 1422
$ sudo ip route flush cache
$ ip route get 10.33.32.157
10.33.32.157 via 10.1.22.1 dev eth0 src 10.1.22.194
cache
TCP의 경우 연결 설정의 일부로 MTU를 초과하지 않도록 할 수 있습니다. 각 끝에서 전송 된 SYN에는 최대 세그먼트 크기 (MSS)가 포함됩니다. TCP 헤더 ( 옵션을 제외한 20 바이트 )와 IP 헤더 (20 바이트)는 MSS와 MTU가 40 바이트의 차이로 관련됨을 의미합니다.
다음을 사용하여 큰 파일을 전송할 때이 두 호스트 간의 연결 설정 예는 다음과 scp
같습니다.
$ sudo tcpdump -p -ni eth0 'host 10.33.32.157 and tcp[13]&2 == 2'
IP 10.1.22.194.45853 > 10.33.32.157.22: Flags [S], seq 634040018, win 26883, options [mss 8961,sackOK,TS val 10952240 ecr 0,nop,wscale 7], length 0
IP 10.33.32.157.22 > 10.1.22.194.45853: Flags [S.], seq 1371736848, ack 634040019, win 26847, options [mss 1379,sackOK,TS val 10824267 ecr 10952240,nop,wscale 7], length 0
첫 번째 패킷에서 로컬 호스트는 8961의 MSS를 제안합니다. 이것은 40 바이트 미만으로 구성된 9001 MTU입니다. 반환 된 SYN / ACK의 MSS는 1379이며 MTU는 1419입니다.이 네트워크에서 원격 호스트도 8961을 보냈지 만 라우터에 의해 경로가 인터넷 경로를 포함한다는 것을 알기 때문에 값이 수정되었습니다 ( MTU 1500) IPsec 터널의 오버 헤드 이 라우터는 또한 전송 된 MSS 8961을 다른 호스트에서 1419로 표시하도록 수정했습니다. 이를 MSS 클램핑 이라고 합니다.
어떤 의미에서 PMTUD는 항상 일어나고 있습니다. 실제로, MSS 클램핑이 있고 TCP를 통해 모든 트래픽이 발생하거나 엔드 포인트에 구성된 것보다 작은 MTU를 가진 라우터가없는 경우 실제로 발생하지 않을 수 있습니다. MSS 클램핑 없이도 캐시가 만료 될 때 거의 발생하지 않을 수 있습니다.