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.