Permintaan kecil berhasil, unduhan besar macet, dan seseorang menyarankan MSS clamping. Saran itu cukup sering benar sehingga layak dicoba dalam urutan yang tepat, dan cukup sering salah sehingga menghabiskan satu sore jika diterapkan tanpa pikir. Tiga pemeriksaan di bawah memisahkan masalah ukuran TCP yang nyata dari masalah UDP, dari penemuan path-MTU yang rusak, dan dari clamp yang tidak pernah melihat handshake yang seharusnya ditulis ulang.

Mulai dari bentuk kegagalannya

Kegagalan ukuran punya tanda tangan: koneksi terbentuk, autentikasi dan respons kecil berhasil, lalu transfer berhenti tanpa batas begitu membutuhkan segmen berukuran penuh. Halaman yang memuat teks tetapi tidak pernah menyelesaikan gambar adalah kegagalan yang sama pada skala lebih kecil. Jika tidak ada yang terhubung sama sekali, masalahnya lebih awal di jalur dan clamping tidak akan membantu. Clamp tidak dapat memperbaiki handshake yang tidak pernah tiba.

Tanda tangan itu ada karena handshake adalah tempat ukuran segmen disepakati. Setiap pihak mengumumkan ukuran segmen maksimum sebagai opsi TCP, dan pengirim menghormati pengumuman pihak lain. Jika jalur tidak dapat membawa segmen sebesar itu, kegagalan muncul kemudian, ketika pengirim akhirnya mencoba satu.

Perhatikan transport saat membaca gejala itu. Clamping adalah penulisan ulang opsi TCP, jadi panggilan suara atau video yang macet di bawah terowongan yang sama bukan masalah MSS dan tidak akan membaik karenanya. Catat transport sebelum menyentuh opsi TCP.

Hitung biaya jalur, lalu bandingkan dengan terowongan

Dua angka penting dan sering tertukar. path-MTU adalah paket terbesar yang dibawa jalur tanpa fragmentasi, dan MSS yang diumumkan untuk IPv4 adalah nilai itu dikurangi 40 byte header IP dan TCP, atau dikurangi 60 untuk IPv6. Enkapsulasi terowongan memakan sebagian anggaran sebelum paket dalam mulai.

ping -M do -s 1400 198.51.100.20
tracepath 198.51.100.20

Ping dengan bit do-not-fragment memberi tahu apakah paket sebesar muatan itu bertahan; ubah ukurannya sampai gagal dan Anda telah menemukan batas jalur secara empiris. Keluaran tracepath melaporkan MTU yang ditemukan di sepanjang rute, yang lebih cepat saat berhasil dan kurang andal saat hop perantara menyaring probe.

Sekarang kurangi beban terowongan. Header IP luar, header UDP, dan header khusus terowongan semuanya keluar dari 1500 byte yang sama, jadi MTU dalam yang dapat dipakai pada landasan Ethernet biasa lebih rendah daripada yang disiratkan tautan fisik. Jika MTU dalam yang dihitung lebih rendah dari yang diumumkan rekan Anda, Anda menemukan kandidat clamp yang nyata, bukan dugaan. Jika nilai yang dihitung sudah di atas pengumuman rekan, berhentilah di sini dan cari di tempat lain.

Tempatkan clamp di tempat handshake lewat

Clamp bekerja dengan menulis ulang opsi MSS dalam paket SYN dan SYN-ACK saat melewati gateway. Jika aturan berada di antarmuka yang tidak pernah dilewati oleh kedua arah, negosiasi selesai tanpa perubahan dan gejalanya bertahan, karena itu penempatan menentukan hasil lebih dari nilainya.

SymptomWhat it points toNext check
Handshake completes, large transfer stallsSegment size larger than the path can carryPath MTU against the tunnel's effective MTU
Nothing connects, small or largeRouting, firewall or keying failureNot MSS; look at the tunnel state
Only UDP applications stallDatagram size or a dropped ICMP errorPlatform-specific UDP handling, not clamping
Fixed after reconnect, returns laterClamp applied to one direction or one interfaceRule placement and the handshake path

Arah adalah separuh lainnya. Clamping satu arah memperbaiki separuh aliran dan membiarkan sisanya gagal dengan cara yang tampak berselang-seling, jadi terapkan pada kedua arah lalu lintas yang diteruskan. Bentuk Linux klasik untuk antarmuka terowongan adalah aturan mangle yang mencocokkan paket SYN:

iptables -t mangle -A FORWARD -o tun0 -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu

Perhatikan apa yang benar-benar dilakukan --clamp-mss-to-pmtu: ia menurunkan nilai dari MTU rute, yang tidak selalu merupakan anggaran muatan nyata terowongan. Pada terowongan berbasis rute di mana rute dalam dan jalur luar berbeda, nilai eksplisit yang dihitung pada pemeriksaan sebelumnya lebih dapat diprediksi daripada nilai otomatis.

Verifikasi dengan koneksi baru, dan jaga umpan balik tetap hidup

Koneksi yang sudah terbentuk mempertahankan MSS yang dinegosiasikan, jadi pengujian pada sesi yang sama tidak membuktikan apa pun. Buka koneksi baru setelah perubahan dan baca nilai yang dinegosiasikan secara langsung alih-alih menyimpulkannya dari transfer yang kebetulan selesai.

ss -tin dst 198.51.100.20
iptables -t mangle -S | grep TCPMSS

Perintah pertama melaporkan MSS soket bersama status kongestinya, yang merupakan konfirmasi tercepat bahwa clamp berlaku. Yang kedua memastikan aturan yang Anda pikir telah ditambahkan adalah aturan yang ada, di tabel tempat ia ditempatkan.

Lalu lindungi mekanisme yang tidak Anda perbaiki. Penemuan path-MTU bergantung pada pesan ICMP fragmentation-needed yang mencapai pengirim, jadi firewall yang membuangnya akan terus merusak transfer besar bahkan dengan clamp yang benar. Izinkan pesan itu untuk jalur terowongan, atau terima bahwa clamping mengompensasi kebijakan yang Anda pilih.

Terakhir, tahan dorongan untuk memperlakukan clamp sebagai tombol penyetel. Ia membatasi ukuran segmen, yang mengorbankan throughput pada jalur yang tidak pernah membutuhkannya. Diterapkan setelah tiga pemeriksaan, ia adalah perbaikan yang terarah; diterapkan lebih dulu, ia adalah perubahan yang menyembunyikan kesalahan asli dan menambah variabel kedua pada setiap pengujian berikutnya. Pertukaran itu layak dilakukan dengan sengaja, bukan secara default.

Catat path-MTU yang Anda ukur, beban terowongan yang Anda kurangi, aturan yang Anda tambahkan, dan MSS yang Anda lihat sesudahnya. Empat angka membuat insiden berikutnya menjadi pencarian, bukan penyelidikan.

Artikel terkait