TCP MSS ใน Linux ต้องมีอย่างน้อย 88 (รวม / net / tcp.h):
/* Minimal accepted MSS. It is (60+60+8) - (20+20). */
#define TCP_MIN_MSS 88U
คำถามของฉันคือ: พวกเขามากับ "60 + 60 + 8" แล้วทำไม ฉันได้ 20 + 20 มาจาก IP header + header TCP
แก้ไข: หลังจากดูส่วนหัวอย่างละเอียดสูตรจะมองหาฉันเช่นนี้:
(MAX_IP_HDR + MAX_TCP_HDR + MIN_IP_FRAG) - (MIN_IP_HDR + MIN_TCP_HDR)
คำถามที่ยังคงยืน: ทำไม ? เหตุใดเคอร์เนล Linux จึงใช้สูตรนี้จึงห้ามไม่ให้เซ็กเมนต์ TCP บังคับให้พูดว่า (20 ไบต์) คิดว่า iperf ที่นี่
EDIT2: นี่คือกรณีการใช้งานของฉัน โดยการบังคับให้ MSS ต่ำบนซ็อกเก็ต / การเชื่อมต่อแพ็คเก็ตทั้งหมดที่ส่งโดยสแต็คจะมีขนาดเล็ก ฉันต้องการตั้ง MSS ต่ำเมื่อทำงานกับ iperf สำหรับแพ็กเก็ต / การทดสอบครั้งที่สอง ฉันไม่สามารถรับแพ็กเก็ต IP ที่มีขนาดเล็กกว่า 128 ไบต์ (เฟรมอีเทอร์เน็ตที่ 142 ไบต์) เนื่องจากการ จำกัด MSS ที่ต่ำกว่านี้! ฉันอยากจะใกล้เคียงกับขนาดเฟรมอีเธอร์เน็ตที่ 64 ไบต์ต่อ RFC 2544 ในทางทฤษฎีสิ่งนี้น่าจะเป็นไปได้: 18 + 20 + 20 <64
TCP_MIN_MSS
เป็นคำตอบที่ถูกต้องในกรณีที่ใช้เคอร์เนล
TCP_MIN_MSS
แต่ฉันไม่สามารถเพราะของ ทำไมถึงเป็น 1 ไม่ได้ RFC ใดที่จะพัง มันจะทำให้เกิดปัญหาเชิงทฤษฎี / การปฏิบัติอะไร คุณแน่ใจหรือว่ามันเป็น "นอกสเป็ค" "แตกต่างกันเล็กน้อย" มีความสนใจขั้นต่ำเพียงครั้งเดียวที่นี่: MSS ที่เล็กที่สุดที่เคอร์เนลอนุญาต