通常、パスの最大伝送単位の検出(PMTUD)は、ホストが大きすぎるためにパケットがドロップされたと判断した場合に発生します。
これは、パケットがドロップされたことを明示的に示すICMPフラグメンテーション要求(タイプ3、コード4)応答への応答である可能性があります。通常、すべてのIPv4パケットは「do n't fragment」(DF)フラグが設定された状態で設定されるため、MTUを超えるパケットはそのような応答を誘発します。IPv6はフラグメンテーションをまったくサポートしていません。
素朴な管理者はICMPがセキュリティリスクであると考えているため、一部のルーターまたはホストファイアウォールはすべてのICMPを頻繁にドロップします。または、一部のリンク集約スキームがICMP配信を中断する場合があります。RFC4821では、ICMPに依存しないMTUを発見するための代替メカニズムが提案されています。
tracepath
MTUを調べるための私のお気に入りのLinuxツールです。以下は、LAN上に9001 MTUを持つホストからの例ですが、IPsec VPNを通過して10.33.32.157に到達する必要があります。
$ 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バイトの差で関連付けられていることを意味します。
以下に、大きなファイルを転送するときのこれら2つのホスト間の接続設定の例を示します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を提案します。これは、設定された9001 MTUで、40バイト未満です。返されたSYN / ACKのMSSは1379で、MTUは1419です。このネットワークでは、リモートホストも8961を送信したことがわかりますが、パスにインターネットパスが含まれていることがわかっているため、ルーターによって値が変更されています( MTU 1500)IPsecトンネルからのオーバーヘッド。このルーターは、送信された8961のMSSを変更して、他のホストで1419として表示します。これはMSSクランプと呼ばれます。
ある意味で、PMTUDは常に発生しています。実際には、MSSクランプが設定されており、すべてのトラフィックがTCPを介して発生している場合、またはエンドポイントで設定されたものよりもMTUが小さいルーターが存在しない場合、実際に発生することはありません。MSSクランプがなくても、キャッシュの有効期限が切れる場合、まれにしか発生しません。