TCP MSS di Linux minimal harus 88 (termasuk / net / tcp.h):
/* Minimal accepted MSS. It is (60+60+8) - (20+20). */
#define TCP_MIN_MSS 88U
Pertanyaan saya adalah: dari mana mereka datang dengan "60 + 60 + 8" dan mengapa? Saya mendapatkan bahwa 20 + 20 berasal dari header IP + header TCP.
EDIT: Setelah melihat lebih dekat pada header, rumusnya terlihat seperti ini:
(MAX_IP_HDR + MAX_TCP_HDR + MIN_IP_FRAG) - (MIN_IP_HDR + MIN_TCP_HDR)
Pertanyaannya masih ada: mengapa ? Mengapa kernel Linux menggunakan rumus ini, sehingga melarang (aliran paksa) segmen TCP, katakanlah, 20 byte? Pikirkan iperf di sini.
EDIT2: Ini kasus penggunaan saya. Dengan memaksa MSS rendah pada soket / koneksi, semua paket yang dikirim oleh stack akan memiliki ukuran kecil. Saya ingin menetapkan MSS rendah ketika bekerja dengan iperf untuk paket / pengujian kedua. Saya tidak bisa mendapatkan paket IP yang lebih kecil dari 128 byte (frame Ethernet 142 byte) pada kabel karena batas bawah ini untuk MSS! Saya ingin mendapatkan sedekat mungkin dengan ukuran frame Ethernet 64 byte seperti RFC 2544. Secara teoritis ini harus dimungkinkan: 18 + 20 + 20 <64.
sumber
TCP_MIN_MSS
.TCP_MIN_MSS
. Kenapa tidak bisa 1? RFC apa yang akan pecah? Teori / masalah praktis apa yang akan ditimbulkannya? Apakah Anda yakin itu "di luar spesifikasi"? "Minima berbeda"? Hanya ada satu minimum minat di sini: MSS terkecil yang diizinkan oleh kernel.Jawaban:
Diperlukan implementasi untuk mendukung header TCP dan IP berukuran maksimum, yang masing-masing adalah 60 byte.
Suatu implementasi harus mendukung datagram 576-byte, yang bahkan dengan header-maksimum berarti lebih dari 8 byte data dalam datagram. Untuk mengirim datagram dengan lebih dari 8 byte data, fragmentasi IP harus memasukkan setidaknya 8 byte data di setidaknya satu paket yang mewakili fragmen datagram. Jadi implementasi harus mendukung setidaknya 8 byte data dalam satu paket.
Menyatukan ini, implementasi harus mendukung paket 60 + 60 + 8 byte.
Ketika kami mengirim paket yang merupakan bagian dari aliran TCP, mereka memiliki header IP 20-byte (opsi plus) dan header TCP 20-byte (opsi plus). Yang tersisa minimal (60 + 60 + 8) - (20 + 20) byte tersisa untuk data dan opsi. Karenanya ini adalah maksimum yang dapat kita asumsikan dengan aman dari TCP MSS implementasi.
sumber
60
pertunjukannya muncul dua kaliSaya tidak tahu dari mana nomor itu berasal, tetapi saya dapat memberitahu Anda bahwa nomor itu di luar spesifikasi. MTU minimum yang didukung untuk jaringan IP adalah 576 byte, yaitu 512 byte data ditambah hingga 64 byte untuk header IP + TCP dan opsi TCP. Nilai itu dipilih untuk memberikan overhead rendah yang layak dalam kasus khas.
Pembacaan saya terhadap kode kernel menunjukkan bahwa nilai yang Anda tampilkan tidak sembarang. Ada praktik yang lebih tua untuk hanya menggunakan konstanta mentah di tempat
TCP_MIN_MSS
. Oleh karena itu, saya berasumsi ada beberapa jaringan IP-over-Foo yang aneh yang ditemukan oleh para pengembang kernel yang membuat mereka memutuskan mereka dapat meningkatkan nilai sesuai dengan yang Anda lihat.Apa tipe jaringan yang tidak standar itu, saya tidak bisa mengatakannya.
sumber