ขนาดแพ็คเก็ตสูงสุดสำหรับการเชื่อมต่อ TCP คืออะไรหรือฉันจะได้รับขนาดแพ็คเก็ตสูงสุดได้อย่างไร
ขนาดแพ็คเก็ตสูงสุดสำหรับการเชื่อมต่อ TCP คืออะไรหรือฉันจะได้รับขนาดแพ็คเก็ตสูงสุดได้อย่างไร
คำตอบ:
ข้อ จำกัด ที่แน่นอนของขนาดแพ็คเก็ต TCP คือ 64K (65535 bytes) แต่ในทางปฏิบัตินี่เป็นขนาดที่ใหญ่กว่าขนาดของแพ็คเก็ตใด ๆ ที่คุณเห็นเพราะชั้นล่าง (เช่นอีเทอร์เน็ต) มีขนาดแพ็คเก็ตที่ต่ำกว่า
MTU (Maximum Transmission Unit) สำหรับอีเธอร์เน็ตเช่น 1500 ไบต์ เครือข่ายบางประเภท (เช่นโทเค็นริง) มี MTU ที่ใหญ่กว่าและบางประเภทมี MTU ที่เล็กกว่า แต่ค่าจะได้รับการแก้ไขสำหรับแต่ละเทคโนโลยีทางกายภาพ
นี่เป็นคำถามที่ยอดเยี่ยมและฉันใช้งานจริงมาก มีคำตอบ "ถูกต้องทางเทคนิค" มากมายเช่น 65k และ 1500 ฉันได้ทำการเขียนอินเตอร์เฟซเครือข่ายจำนวนมากและการใช้ 65k นั้นโง่และ 1500 ก็สามารถทำให้คุณประสบปัญหาใหญ่ได้ งานของฉันทำงานบนฮาร์ดแวร์ / แพลตฟอร์ม / เราเตอร์ที่แตกต่างกันมากมายและตามจริงแล้วที่ที่ฉันเริ่มต้นคือ 1,400 ไบต์ หากคุณต้องการมากกว่า 1,400 คุณสามารถเริ่มที่จะเพิ่มขึ้นคุณอาจจะไปที่ 1,450 และบางครั้งถึง 1480'ish? หากคุณต้องการมากกว่านั้นแน่นอนคุณต้องแบ่งเป็น 2 แพ็คเก็ตซึ่งมีหลายวิธีที่ชัดเจนในการทำ ..
ปัญหาคือคุณกำลังพูดถึงการสร้างแพ็กเก็ตข้อมูลและเขียนมันออกมาทาง TCP แต่แน่นอนว่ามีข้อมูลส่วนหัวติดอยู่เรื่อย ๆ ดังนั้นคุณมี "สัมภาระ" ที่ทำให้คุณเหลือ 1500 หรือมากกว่านั้น .. และยังเป็น ฮาร์ดแวร์จำนวนมากมีขีด จำกัด ต่ำกว่า
หากคุณ "ผลักดัน" คุณจะได้รับสิ่งแปลก ๆ เกิดขึ้น ข้อมูลที่ถูกตัดทอนหรือลดลงอย่างเห็นได้ชัดที่ฉันไม่ค่อยเห็น ข้อมูลที่เสียหายยังไม่ค่อยมี แต่จะเกิดขึ้นอย่างแน่นอน
send()
หากสะดวก
1480'ish
1460
ส่วนหัวของ IP และส่วนหัวของ TCP ใช้เวลาถึง 20 ไบต์แต่ละอย่างน้อย (ยกเว้นสาขาหัวตัวถูกนำมาใช้) และทำให้สูงสุดของ (กรอบไม่ใช่จัมโบ้) 1500 - 20 -20 = 1460
อีเธอร์เน็ต
ที่ระดับแอปพลิเคชันแอปพลิเคชันใช้ TCP เป็นโปรโตคอลที่มุ่งเน้นกระแส TCP มีเซ็กเมนต์และสรุปรายละเอียดของการทำงานกับแพ็กเก็ต IP ที่ไม่น่าเชื่อถือ
TCP จัดการกับเซกเมนต์แทนแพ็กเก็ต แต่ละเซ็กเมนต์ TCP มีหมายเลขลำดับซึ่งอยู่ภายในส่วนหัว TCP ข้อมูลจริงที่ส่งในเซ็กเมนต์ TCP เป็นตัวแปร
มีค่าสำหรับgetsockoptที่รองรับในบางระบบปฏิบัติการที่คุณสามารถใช้เรียกว่า TCP_MAXSEG ซึ่งดึงขนาดเซ็กเมนต์ TCP สูงสุด (MSS) ไม่รองรับในทุกระบบปฏิบัติการ
ฉันไม่แน่ใจว่าสิ่งที่คุณกำลังพยายามทำ แต่ถ้าคุณต้องการลดขนาดบัฟเฟอร์ที่ใช้คุณสามารถดู: SO_SNDBUF และ SO_RCVBUF
ตามhttp://en.wikipedia.org/wiki/Maximum_segment_sizeขนาดเริ่มต้นที่ใหญ่ที่สุดสำหรับแพ็กเก็ต IPV4 บนเครือข่ายคือ 536 octets (ไบต์ขนาด 8 บิต) ดูRFC 879
ไม่มีแพ็กเก็ตใน TCP API
มีแพ็คเก็ตในโปรโตคอลพื้นฐานบ่อยครั้งเช่นเมื่อ TCP ทำผ่าน IP ซึ่งคุณไม่สนใจเพราะพวกเขาไม่มีส่วนเกี่ยวข้องกับผู้ใช้ยกเว้นการเพิ่มประสิทธิภาพที่ละเอียดอ่อนมากซึ่งคุณอาจไม่สนใจ (อ้างอิงจาก การกำหนดคำถาม)
หากคุณถามจำนวนไบต์สูงสุดที่คุณสามารถทำได้send()
ในการเรียก API หนึ่งครั้งการดำเนินการนี้ขึ้นกับการตั้งค่า คุณมักจะโทร send () สำหรับชิ้นงานที่มีขนาดไม่เกินหลายกิโลไบต์และพร้อมเสมอที่ระบบจะปฏิเสธที่จะยอมรับทั้งหมดหรือบางส่วนซึ่งในกรณีนี้คุณจะต้องจัดการแยกชิ้นส่วนด้วยตัวเองเล็ก ๆ เพื่อป้อนข้อมูลของคุณลงใน TCP send () API
โดยทั่วไปจะขึ้นอยู่กับอินเทอร์เฟซที่ใช้ในการเชื่อมต่อ คุณอาจใช้ ioctl () เพื่อรับ MTU และถ้าเป็นอีเธอร์เน็ตคุณมักจะได้ขนาดแพ็คเก็ตสูงสุดโดยการลบขนาดของส่วนหัวของฮาร์ดแวร์จากนั้นคือ 14 สำหรับอีเทอร์เน็ตที่ไม่มี VLAN
นี่เป็นกรณีเฉพาะถ้า MTU นั้นมีขนาดใหญ่อย่างน้อยในเครือข่าย TCP อาจใช้การค้นพบพา ธ MTU เพื่อลด MTU ที่มีประสิทธิภาพของคุณ
คำถามคือทำไมคุณสนใจ
หากคุณอยู่กับเครื่อง Linux "ifconfig eth0 mtu 9000 up" เป็นคำสั่งเพื่อตั้งค่า MTU สำหรับอินเตอร์เฟส อย่างไรก็ตามฉันต้องบอกว่า MTU ขนาดใหญ่มีข้อเสียบางอย่างถ้าการส่งผ่านเครือข่ายไม่เสถียรและอาจใช้หน่วยความจำพื้นที่เคอร์เนลมากขึ้น
ดูเหมือนว่าเว็บไซต์ส่วนใหญ่ในอินเทอร์เน็ตใช้ 1460 ไบต์สำหรับค่าของ MTU บางครั้งอาจเป็น 1452 และถ้าคุณใช้ VPN มันจะลดลงมากขึ้นสำหรับส่วนหัวของ IPSec
ขนาดหน้าต่างเริ่มต้นจะแตกต่างกันไปเล็กน้อยถึง 65535 ไบต์ ฉันใช้http://tcpcheck.comเพื่อดูค่า IP ต้นทางของฉันเองและเพื่อตรวจสอบว่าผู้ขายอินเทอร์เน็ตรายอื่นกำลังใช้งานอะไรอยู่
วิธีแก้ปัญหาหนึ่งคือการตั้งค่าตัวเลือกซ็อกเก็ต TCP_MAXSEG ( http://linux.die.net/man/7/tcp ) เป็นค่าที่ "ปลอดภัย" ด้วยเครือข่ายพื้นฐาน (เช่นตั้งค่าเป็น 1400 เพื่อความปลอดภัยบนอีเธอร์เน็ต) จากนั้น ใช้บัฟเฟอร์ขนาดใหญ่ในการส่งการเรียกระบบ วิธีนี้อาจมีการเรียกระบบน้อยซึ่งมีราคาแพง เคอร์เนลจะแบ่งข้อมูลให้ตรงกับ MSS
วิธีนี้คุณสามารถหลีกเลี่ยงข้อมูลที่ถูกตัดทอนและแอปพลิเคชันของคุณไม่ต้องกังวลเกี่ยวกับบัฟเฟอร์ขนาดเล็ก
ขนาดแพ็คเก็ตสำหรับการตั้งค่า TCP ในโปรโตคอล IP (Ip4) สำหรับฟิลด์นี้ (TL) จะมีการจัดสรร 16 บิตดังนั้นขนาดสูงสุดของแพ็กเก็ตคือ 65535 ไบต์: รายละเอียดโปรโตคอล IP