Biasanya, jalur penemuan unit transmisi maksimum (PMTUD) terjadi setiap kali host berpikir paket dijatuhkan karena terlalu besar.
Ini mungkin sebagai respons terhadap respons ICMP yang diperlukan (tipe 3, kode 4) yang secara eksplisit menunjukkan paket dijatuhkan. Pada praktiknya, semua paket IPv4 diatur dengan set flag "jangan fragmen" (DF), sehingga paket apa pun yang melebihi MTU akan mendapat respons seperti itu. IPv6 tidak mendukung fragmentasi sama sekali.
Beberapa router atau firewall tuan rumah sering menjatuhkan semua ICMP karena administrator yang naif percaya ICMP sebagai risiko keamanan . Atau, beberapa skema agregasi tautan dapat memutus pengiriman ICMP . Mekanisme alternatif untuk menemukan MTU telah terlampaui yang tidak bergantung pada ICMP diusulkan dalam RFC4821 .
tracepath
adalah alat Linux favorit saya untuk menyelidiki MTU. Berikut ini adalah contoh dari host dengan MTU 9001 di LAN, tetapi yang harus melintasi IPsec VPN untuk mencapai 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]
Kesalahan ICMP dapat diamati dengan 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
Penemuan MTU di-cache. Di Linux ini dapat diamati dan memerah ip
(waspadalah terhadap perubahan sejak 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
Untuk TCP, melebihi MTU dapat dihindari sebagai bagian dari pengaturan koneksi. Termasuk dalam SYN yang dikirim oleh setiap ujung adalah ukuran segmen maksimum (MSS). Header TCP (20 byte tidak termasuk opsi ) dan header IP (20 byte) berarti MSS dan MTU terkait oleh perbedaan 40 byte.
Berikut adalah contoh pengaturan koneksi antara dua host ini ketika mentransfer file besar dengan 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
Dalam paket pertama, host lokal mengusulkan MSS 8961. Ini adalah MTU 9001 yang dikonfigurasi, kurang dari 40 byte. SYN / ACK yang dikembalikan memiliki MSS 1379, menyiratkan MTU 1419. Saya kebetulan tahu di jaringan ini host jarak jauh juga mengirim 8961, tetapi nilainya telah dimodifikasi oleh router karena ia tahu jalurnya termasuk jalur internet ( MTU 1500) overhead dari terowongan IPsec. Router ini juga memodifikasi MSS kami yang dikirim dari 8961 untuk tampil sebagai 1419 di host lain. Ini disebut penjepit MSS .
Jadi dalam arti tertentu, PMTUD terjadi setiap saat. Dalam praktiknya, ini mungkin sebenarnya tidak pernah terjadi, jika penjepitan MSS ada dan semua lalu lintas terjadi melalui TCP, atau jika tidak ada router yang memiliki MTU yang lebih kecil daripada yang dikonfigurasikan pada titik akhir. Bahkan tanpa MSS clamping, itu mungkin jarang terjadi, ketika cache berakhir.