TCP MSS ที่น้อยที่สุดใน Linux


9

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 เซกเมนต์ 20 ไบต์ได้อย่างไร
David Schwartz

MSS ย่อมาจากขนาดเซ็กเมนต์สูงสุดมันเป็นขีด จำกัด บน (ไม่ต่ำกว่า) สำหรับขนาดเซ็กเมนต์ในการเชื่อมต่อโดยเฉพาะ TCP_MIN_MSS ระบุขอบเขตล่างสำหรับขีด จำกัด นี้ ดังนั้นจึงไม่ได้ห้ามกลุ่มใด ๆ ที่มีน้อยกว่า 88 ไบต์เพียงระบุว่า MSS สำหรับการเชื่อมต่อใด ๆ ควร> = 88 ไบต์
gelraen

แน่นอน! ขออภัยที่ยังไม่ชัดเจนพอ โปรดดูการแก้ไขล่าสุด
Mircea Gherzan

ทำไมคุณถึงปล่อยให้เงินรางวัลหมดอายุ? คำตอบของเดวิดล้างสิ่งต่าง ๆ ตามความพอใจของฉันอย่างน้อย ความแตกต่างระหว่างคำตอบของเขากับของฉันคือเรากำลังพูดถึง minima ที่แตกต่างกัน สำหรับสิ่งที่คุ้มค่ามีขั้นต่ำที่สามคือ 41 หรือ 20 + 20 + 1 ไบต์ของข้อมูล TCP ขนาดแพ็กเก็ตขั้นต่ำนั้นขึ้นอยู่กับเหตุผลที่คุณถาม ผมคาดว่า 68 TCP_MIN_MSSเป็นคำตอบที่ถูกต้องในกรณีที่ใช้เคอร์เนล
Warren Young

ฉันยังไม่พอใจกับคำตอบ ฉันยังคงไม่เห็นเหตุผลที่เคอร์เนลไม่ให้ฉันกำหนด MSS ขนาดเล็กโดยใช้ arbirary ให้กับแอป ฉันชอบที่จะมี (กระแสคงที่ของ TCP โหลด) IP แพ็กเก็ต 41 ไบต์ TCP_MIN_MSSแต่ฉันไม่สามารถเพราะของ ทำไมถึงเป็น 1 ไม่ได้ RFC ใดที่จะพัง มันจะทำให้เกิดปัญหาเชิงทฤษฎี / การปฏิบัติอะไร คุณแน่ใจหรือว่ามันเป็น "นอกสเป็ค" "แตกต่างกันเล็กน้อย" มีความสนใจขั้นต่ำเพียงครั้งเดียวที่นี่: MSS ที่เล็กที่สุดที่เคอร์เนลอนุญาต
Mircea Gherzan

คำตอบ:


5

จำเป็นต้องมีการติดตั้งเพื่อรองรับส่วนหัว TCP และ IP ขนาดสูงสุดซึ่งมีขนาด 60 ไบต์

การใช้งานต้องรองรับดาต้าแกรม 576- ไบต์ซึ่งแม้แต่ส่วนหัวสูงสุดหมายถึงข้อมูลมากกว่า 8 ไบต์ในดาตาแกรม ในการส่งดาต้าแกรมที่มีข้อมูลมากกว่า 8 ไบต์การแตกแฟรกเมนต์ IP ต้องใส่ข้อมูลอย่างน้อย 8 ไบต์ในแพ็กเก็ตอย่างน้อยหนึ่งแพ็กเกจที่แสดงแฟรกเมนต์ของดาตาแกรม ดังนั้นการดำเนินการจะต้องสนับสนุนข้อมูลอย่างน้อย 8 ไบต์ในแพ็คเก็ต

การนำสิ่งนี้มารวมกันการใช้งานจะต้องสนับสนุนแพ็คเก็ต 60 + 60 + 8 ไบต์

เมื่อเราส่งแพ็กเก็ตที่เป็นส่วนหนึ่งของกระแสข้อมูล TCP พวกเขามีส่วนหัว IP 20- ไบต์ (ตัวเลือกบวก) และส่วนหัว TCP 20 ไบต์ (บวกตัวเลือก) นั่นจะเหลือขั้นต่ำ (60 + 60 + 8) - (20 + 20) ไบต์ที่เหลือสำหรับข้อมูลและตัวเลือก ดังนั้นนี่คือจำนวนสูงสุดที่เราสามารถสันนิษฐานได้ว่า TCP MSS ของการนำไปใช้งานอย่างปลอดภัย


1
MSS ไม่ได้รวมส่วนหัวไว้ (เป็นเพียงส่วนของข้อมูล) และการ60แสดงสองครั้ง
Michael Mrozek

การใช้งานต้องสามารถรองรับแพ็คเก็ตที่มีส่วนหัวที่มีขนาดสูงสุด แต่เราไม่ได้ส่งส่วนหัวที่มีขนาดสูงสุด ดังนั้นความแตกต่างระหว่างค่าสูงสุดและค่าที่เราส่งจริงจึงควรมีการเพิ่มลงใน MSS
David Schwartz

ตกลงดังนั้นคุณได้อธิบาย 8 ไบต์ ฉันไม่รู้ว่าคุณหมายถึงอะไรโดยหัว "TCP / IP" ฉันรู้ของส่วนหัว IP และ TCP หนึ่ง และในขณะที่ไมเคิลชี้ให้เห็น 60 ปรากฏขึ้นสองครั้ง และ RFC จะกล่าวถึง "MSS ที่มีประสิทธิภาพ" เท่านั้นและไม่ใช่อย่างน้อย
Mircea Gherzan

60 แสดงสองครั้งหนึ่งครั้งสำหรับส่วนหัว IP และอีกครั้งสำหรับส่วนหัว TCP
David Schwartz

68 เป็นเพียงการแยกส่วน "60 + 60 + 8" อาจแยกส่วนแล้วทำไมต้องสนใจเรื่องการแยกส่วน แม้แต่ "68 + 20" ก็อาจแยกส่วน และทำไม "ต้อง" อีกด้าน "ยอมรับ" "60 + 60 + 8" "ยอมรับ" เหมือนใน "โดยไม่มีการกระจายตัว"? บรรทัดล่าง: ทำไมฉันไม่ได้รับอนุญาตให้ส่งข้อมูล "20 + 20" + 10 ไบต์?
Mircea Gherzan

3

ฉันไม่รู้ว่ามาจากไหน แต่ฉันบอกได้เลยว่ามันอยู่นอกสเป็ค MTU ขั้นต่ำที่รองรับสำหรับเครือข่าย IP คือ 576 ไบต์ซึ่งเป็นข้อมูล 512 ไบต์บวกได้ถึง 64 ไบต์สำหรับส่วนหัว IP + TCP และตัวเลือก TCP ค่าดังกล่าวถูกเลือกเพื่อให้ค่าใช้จ่ายต่ำอย่างเหมาะสมในกรณีทั่วไป

การอ่านบิตของเคอร์เนลรหัสของฉันแนะนำว่าค่าที่คุณแสดงไม่ได้โดยพลการ มีการปฏิบัติที่มีอายุมากกว่าที่จะเพียงแค่ใช้อย่างต่อเนื่องดิบ 64 TCP_MIN_MSSในสถานที่เป็น ดังนั้นฉันคิดว่ามีเครือข่าย IP-over-Foo ที่แปลกประหลาดที่นักพัฒนาเคอร์เนลพบซึ่งทำให้พวกเขาตัดสินใจว่าพวกเขาสามารถเพิ่มมูลค่าให้กับสิ่งที่คุณเห็นได้

อย่างไรก็ตามเครือข่ายที่ไม่ได้มาตรฐานนั้นเป็นสิ่งที่ฉันไม่สามารถพูดได้


576 เป็น MTU สำหรับดาต้าแกรม ในกรณีนี้มันเป็นข้อ จำกัด ของแพ็กเก็ตที่สำคัญไม่ใช่ขีด จำกัด ของเดตาแกรมเนื่องจากแพ็กเก็ต TCP ตั้งค่าบิต DF
David Schwartz

MTU ขั้นต่ำที่กำหนดไว้สำหรับ IP ดาตาแกรมและแพ็คเก็ต TCP ก็เป็น IP ดาตาแกรม
gelraen

ถูกต้อง แต่ข้อ จำกัด TCP นี้มีไว้สำหรับแพ็กเก็ตไม่ใช่ดาตาแกรมเนื่องจาก TCP ดาตาแกรมจะไม่แยกส่วน ความรู้สึกเดียวที่กฎดาตาแกรม 576- ไบต์มีความสำคัญคือมันหมายถึงการติดตั้งจะต้องสามารถรองรับข้อมูลอย่างน้อย 8 ไบต์ในแพ็คเก็ต (ดังนั้น 8 ในสูตร) มิฉะนั้นจะเป็นไปไม่ได้ที่จะแยกส่วนดาตาแกรม 576 ไบต์
David Schwartz
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.