Dalam diskusi yang dipacu oleh pertanyaan lain di situs ini , saya menyadari bahwa saya tidak memiliki pemahaman yang kuat tentang kapan Penemuan MTU (PMTUD) Path dilakukan.
Saya tahu apa fungsinya - temukan MTU terendah di jalur dari Client ke Server).
Saya tahu bagaimana melakukannya - mengirim paket yang semakin besar dengan set bit "Don't Fragment" mereka, dan lihat seberapa besar paket yang bisa Anda lewati tanpa mendapatkan kesalahan "ICMP Need to Fragment".
Pertanyaan saya secara khusus, kapan tuan rumah melakukan PMTUD?
Saya mencari kasus tertentu. Bukan hanya sesuatu yang generik seperti "ketika tuan rumah ingin menemukan jalur MTU". Poin bonus jika Anda dapat memberikan tangkapan paket dari tuan rumah yang melakukannya, atau memberikan instruksi untuk menghasilkan tangkapan paket tersebut.
Juga, saya secara khusus mengacu pada IPv4. Saya tahu di router sementara IPv6 tidak bertanggung jawab atas fragmentasi, dan dapat membayangkan bahwa PMTUD terjadi jauh lebih umum. Tetapi untuk saat ini, saya sedang mencari contoh spesifik PMTUD di IPv4. (walaupun jika satu-satunya paket yang dapat Anda kumpulkan dari PMTUD adalah IPv6, saya masih ingin melihatnya)
Jawaban:
Jawabannya sederhana: kapan pun tuan rumah mau. Sangat. Sesederhana itu.
Penjelasan di bawah ini mengasumsikan lingkungan IPv4-only, karena IPv6 menghilangkan fragmentasi pada router (memaksa host untuk selalu berurusan dengan fragmentasi dan penemuan MTU).
Tidak ada aturan ketat yang mengatur kapan (atau bahkan jika) suatu host melakukan Path MTU Discovery. Alasan PMTUD muncul adalah karena fragmentasi dianggap berbahaya karena berbagai alasan. Untuk menghindari fragmentasi paket, konsep PMTUD dihidupkan sebagai solusi. Tentu saja, sistem operasi yang bagus harus menggunakan PMTUD untuk meminimalkan fragmentasi.
Jadi, tentu saja, semantik yang tepat ketika PMTUD digunakan tergantung pada sistem operasi pengirim - khususnya, implementasi soket. Saya hanya dapat berbicara untuk kasus spesifik Linux, tetapi varian UNIX lainnya mungkin tidak jauh berbeda.
Di Linux, PMTUD dikendalikan oleh
IP_MTU_DISCOVER
opsi soket. Anda dapat mengambil statusnya saat ini dengangetsockopt(2)
menentukan levelIPPROTO_IP
danIP_MTU_DISCOVER
opsi. Opsi ini hanya berlaku untukSOCK_STREAM
soket (SOCK_STREAM
soket adalah soket dua arah, berorientasi koneksi, dan dapat diandalkan; dalam praktiknya soket TCP, meskipun protokol lain dimungkinkan), dan ketika disetel, Linux akan menjalankan PMTUD persis seperti yang didefinisikan dalam RFC 1191.Perhatikan bahwa dalam praktiknya, PMTUD adalah proses yang berkelanjutan; paket dikirimkan dengan set bit DF - termasuk paket jabat tangan 3 arah - Anda dapat menganggapnya sebagai properti koneksi (meskipun suatu implementasi mungkin bersedia menerima tingkat fragmentasi tertentu di beberapa titik dan berhenti mengirim paket dengan DF) bit diatur). Dengan demikian, PMTUD hanyalah konsekuensi dari kenyataan bahwa segala sesuatu pada koneksi tersebut sedang dikirim dengan DF.
Bagaimana jika Anda tidak mengatur
IP_MTU_DISCOVER
?Ada nilai default. Secara default,
IP_MTU_DISCOVER
diaktifkan diSOCK_STREAM
soket. Ini bisa dibaca atau diubah dengan membaca/proc/sys/net/ipv4/ip_no_pmtu_disc
. Nilai nol berartiIP_MTU_DISCOVER
diaktifkan secara default di soket baru; bukan-nol berarti sebaliknya.Bagaimana dengan soket tanpa koneksi?
Ini rumit karena koneksi, soket yang tidak dapat diandalkan tidak mentransmisikan kembali segmen yang hilang. Ini menjadi tanggung jawab pengguna untuk mengemas data dalam potongan berukuran MTU. Selain itu, pengguna diharapkan membuat pengiriman ulang yang diperlukan jika terjadi kesalahan pada Pesan . Jadi, intinya kode pengguna harus mengimplementasikan ulang PMTUD. Namun demikian, jika Anda siap menghadapi tantangan, Anda bisa memaksa bit DF dengan mengedarkan
IP_PMTUDISC_DO
flag kesetsockopt(2)
.Garis bawah
sumber
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:Kesalahan ICMP dapat diamati dengan
tcpdump
:Penemuan MTU di-cache. Di Linux ini dapat diamati dan memerah
ip
(waspadalah terhadap perubahan sejak Linux 3.6 ):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
: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.
sumber
PMTUD digunakan untuk menghitung MSS terbaik untuk sesi TCP. Salah satu contohnya adalah implementasi BGP pada router Cisco atau Juniper.
http://www.juniper.net/techpubs/en_US/junos12.1/topics/usage-guidelines/routing-configuring-mtu-discovery-for-bgp-sessions.html
Terima kasih.
sumber