การปฏิบัติสูงสุด (เทียบกับทางทฤษฎี) ขีด จำกัด สูงสุดของขนาดแพ็คเก็ต TCP


1

ฉันเป็นนักพัฒนาเว็บที่ค่อนข้างใหม่สำหรับอุตสาหกรรม ฉันถูกเสนอด้วยความท้าทายในการเขียนโค้ดสำหรับการสัมภาษณ์งานที่ฉันต้องการออกแบบระบบการส่งข้อความและออกแบบระบบสำหรับการจัดการกับข้อความ, ข้อความที่มีรูปแบบไม่ถูกต้อง, ประเภทข้อความที่แตกต่างกัน, การบันทึกสถานะและอื่น ๆ ...

คำถามของฉันเกี่ยวกับขนาดแพ็คเก็ตผ่าน TCP

ข้อความที่เข้ามามีอัตรา 10,000 ข้อความ / วินาทีที่ขนาด 2KB ต่อข้อความ ฉันพยายามค้นหาข้อ จำกัด ขนาดแพ็คเก็ตสูงสุดปลอดภัยสูงสุดหรือเป็นประโยชน์สูงสุด ฉันเคยเห็นในสถานที่ที่ไม่ได้ยืนยันหลายแห่ง (เช่นไม่ใช่ในเอกสารทางเทคนิค) ว่าขนาดทางทฤษฎีสูงสุดคือ 64KB ถูกต้องไหม ในกรณีนั้นตัวอย่างของฉันในการส่งข้อความ 2KB อาจจะพอดีกับแพ็กเก็ตเดียวและลดความซับซ้อนของระบบนี้

หาก 64KB เป็นหมายเลขที่ไม่ถูกต้องหมายเลขที่ถูกต้องจะเป็นอย่างไร นอกจากนี้ฉันไม่เพียงแค่พยายามเข้าใจขนาดทฤษฏีสูงสุด แต่ขนาดที่ใช้ได้จริงสูงสุด ฉันต้องการที่จะครอบคลุมกรณีขอบที่ข้อความอาจมีขนาดใหญ่กว่า 2KB เป้าหมายเล็กน้อยเช่นเดียวกับออกจากห้องสำหรับส่วนหัวต่างๆที่ TCP ต้องการ

คำตอบ:


3

อีเธอร์เน็ตมีอิทธิพลต่อขนาดแพ็คเก็ต TCP / IP เสมอ อีเธอร์เน็ตมี MTU มาตรฐานขนาด 1500 ไบต์ซึ่งหลังจากค่าใช้จ่ายส่วนหัว IPv4 ทั่วไป 20 ไบต์และค่าใช้จ่ายส่วนหัว TCP สมัยใหม่แบบทั่วไปที่ 32 ไบต์ (เคยเป็น 20 ไบต์ แต่เราเพิ่มตัวเลือกการประทับเวลา 12 ไบต์ในปัจจุบัน) ส่งผลให้ TCP ขนาดเซ็กเมนต์ที่สูงสุดของ1448 ไบต์

PPPoE ซึ่งเป็นที่นิยมในหมู่ผู้ให้บริการอินเทอร์เน็ต DSL-based เพิ่มอีก 8 ไบต์ของค่าใช้จ่ายเพื่อการเชื่อมต่อ TCP ที่ตัดการเชื่อมโยง PPPoE จบลงด้วย TCP MSS ของ1440 ไบต์ เทคโนโลยีอื่น ๆ อาจเพิ่มค่าใช้จ่ายเพิ่มเติม

สแต็ค TCP / IP ที่ทันสมัยส่วนใหญ่ใช้ "Path MTU Discovery" (PMTUD) เพื่อให้พวกเขาไม่ต้องพึ่งพาการกระจายตัวของ IP น่าเสียดายที่บางไซต์ปิดกั้นข้อความ ICMP ที่จำเป็นสำหรับ PMTUD ให้ทำงานโดยไม่ตั้งใจสร้าง "PMTUD หลุมดำ" ซึ่ง PMTUD ไม่ทำงาน เพื่อให้คนที่อยู่เบื้องหลังหลุมดำ PMTUD ยังคงเชื่อมต่อกับบริการของตนไซต์ Google เลือกที่จะเจรจา TCP MSS ที่มีความละเอียด1380 ไบต์ (ครั้งที่ฉันตรวจสอบครั้งล่าสุด)

ดังนั้นฉันจึงบอกได้ว่าเราสามารถโต้แย้งได้ว่าถ้าคุณต้องการปรับแต่งวิธีการที่แอปพลิเคชันของคุณเขียนเพื่อให้แน่ใจว่าพวกเขาเติมเพียงครั้งเดียวแพ็คเก็ตส่วนใหญ่ทำให้การเขียนของคุณไม่ใหญ่กว่า 1448 ไบต์และอาจไม่ ใหญ่กว่า 1,380 ไบต์

IPv4 ดาต้าแกรมอาจมีขนาดใหญ่เท่ากับ 64 KibiBytes แต่มีเพียงไม่กี่เส้นทางในอินเทอร์เน็ตที่มี 64KiB MTU ดังนั้นจำนวนนั้นไม่เกี่ยวข้องกับการวางแผนขนาดแพ็คเก็ตส่วนใหญ่ เซิร์ฟเวอร์โปรโตคอลข้อความทางทฤษฎีของคุณอาจเชื่อมต่อกับเครือข่ายที่เหมือน Ethernet ซึ่งอาจใช้เฟรมมาตรฐาน 1500 ไบต์ดังนั้นสแต็ก IP ของเซิร์ฟเวอร์ของคุณจะต้องแยกส่วนที่ 64KiB เขียนเป็น 46 แพ็กเกจแยกกันก่อนที่จะเริ่มส่งสัญญาณได้ ในการกระโดดครั้งแรก แม้แต่เครือข่ายอีเทอร์เน็ตที่ตั้งค่าให้ใช้ "จัมโบ้เฟรม" ที่ไม่ได้มาตรฐานมักจะสูงสุดที่ 9000 ไบต์ MTUs ฉันไม่สามารถตั้งชื่อเทคโนโลยีการเชื่อมโยงทางกายภาพ / ดาต้า (เลเยอร์ 1/2) ที่อนุญาตให้ 64KiB MTUs ได้ อาจเป็น IP มากกว่า Thunderbolt


ดังนั้นคุณกำลังพูดว่าในขณะที่ TCP สามารถบรรจุข้อมูลได้มากถึง 64KB ในทางทฤษฎีแล้ว
MBak

@ MBaka IP ดาตาแกรมเดียวสามารถเป็น 64KiB แต่เครือข่ายส่วนใหญ่จะต้องการเลเยอร์ IP ในการแยกส่วนดาตาแกรมออกเป็นแพ็คเก็ตขนาดเล็กจำนวนมากและส่งด้วยวิธีดังกล่าวด้วยซอฟต์แวร์ระบบเครือข่ายเลเยอร์ IP บนโฮสต์ปลายทาง 64KiB ดาต้าก่อนที่จะผ่านมันขึ้นไปบนกอง
Spiff

เข้าใจแล้ว! แต่ถ้าเป็นเช่นนั้นเหตุใดดาต้าแกรม IP จึงได้รับการออกแบบเช่นนั้นหากเครือข่ายไม่สามารถรองรับได้โดยไม่แยกส่วนออกไปอีก
MBak

@MBaka ทศวรรษที่ผ่านมาเมื่อ IPv4 ได้รับการออกแบบนักออกแบบคิด MTUs จะเติบโตและออกจากห้องเพื่อการเติบโตนั้น เป็นเรื่องที่น่าแปลกใจที่ MTU ขนาด 1500 ไบต์ของอีเธอร์เน็ตติดขัดและมีอิทธิพลยาวนาน
Spiff

นั่นทำให้รู้สึก ขอบคุณสำหรับการตอบสนองและความรู้!
MBak
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.