ดำเนินการ Path MTU Discovery โดยไม่ต้องอาศัยข้อผิดพลาด ICMP ซึ่งมักไม่ได้จัดส่ง
โปรแกรมนี้ดำเนินการ Packetization Layer Path MTU Discovery ตามที่อธิบายไว้ใน RFC 4821 ซึ่งเป็นวิธีที่เชื่อถือได้มากกว่าในการตรวจจับขนาด MTU ต่อหน้าหลุมดำ ICMP
แม้ว่าการเชื่อมต่อ TCP จะปรับขนาด MTU โดยอัตโนมัติเมื่อเวลาผ่านไป โดยขึ้นอยู่กับตัวบ่งชี้ต่างๆ (ประสิทธิภาพของเครือข่าย การสูญเสียแพ็กเก็ต ข้อความแสดงข้อผิดพลาด ICMP ...) นี่ไม่ใช่กรณีของโปรโตคอลที่ไม่มีการเชื่อมต่อ
เมื่อประสิทธิภาพเป็นสิ่งสำคัญ ปริมาณงาน การ กระจายตัวของแพ็กเก็ต และ ความน่าเชื่อถือของเส้นทาง เป็นตัวบ่งชี้หลักสามประการที่ต้องวิเคราะห์เพื่อเพิ่มประสิทธิภาพการสตรีม เนื่องจากความน่าเชื่อถือของเส้นทางไม่ได้ขึ้นอยู่กับเราเสมอไป เราควรพยายามเพิ่มปริมาณการรับส่งข้อมูลสูงสุดในขณะที่ ไม่ดำเนินการกระจายตัวของแพ็กเก็ต ซึ่งสามารถลดประสิทธิภาพลงอย่างรุนแรง [1]
ข้อเสนอเดิมสำหรับ Path MTU Discovery อาศัยแพ็กเก็ต ICMP Fragmentation Needed
ที่จะจัดส่งเมื่อแพ็กเก็ต IPv4 ที่มีชุดฟิลด์ Don't Fragment มีขนาดใหญ่เกินกว่าจะเผยแพร่ได้ น่าเสียดายที่เราเตอร์บางตัวไม่ได้สร้างข้อผิดพลาดประเภทนี้ แต่เลือกที่จะเพิกเฉยต่อแพ็กเก็ตขนาดใหญ่แทน ไคลเอ็นต์ไม่มีวิธีการระบุสาเหตุของการสูญหายของแพ็กเก็ต
เนื่องจากโฮสต์ทั้งหมดได้รับคำสั่งให้สนับสนุนการสืบค้น ICMP_ECHO เราจึงสามารถใช้ประโยชน์จากข้อเท็จจริงที่ว่าข้อความ ICMP ยอมรับข้อมูลจำนวนเท่าใดก็ได้และส่งแพ็กเก็ตที่มีขนาดแตกต่างกันไปยังเซิร์ฟเวอร์ของเรา หากเราเปิดช่อง Don't Fragment ในแพ็กเก็ต IPv4 และรับฟังการตอบสนอง เรา กำลัง รอ ACK (ในรูปแบบของแพ็กเก็ต ICMP_ECHOREPLY) เพื่อยืนยันว่าขนาด MTU นี้ถูกต้อง
ตอนนี้เราเพียงแค่ต้องทำการค้นหาแบบไบนารี่ตามขนาดของแพ็กเก็ตเพื่อค้นหาขนาด MTU สูงสุดที่เส้นทางนี้รองรับ
เมื่ออยู่ในโหมด ICMP คำขอ ICMP_ECHO บางคำขอที่มีขนาดต่างกันจะถูกสร้างขึ้น
ICMP Fragmentation Needed
) ขนาด MTU ดังกล่าวจะถูกประกาศว่าไม่ถูกต้องและเกณฑ์จะลดลงข้อกำหนดเพียงอย่างเดียวของ โหมด ICMP คือโฮสต์ต้องสามารถตอบกลับข้อความ Ping ได้
อัลกอริธึมเดียวกันนี้ใช้กับแพ็กเก็ต UDP แต่คุณต้องเรียกใช้เซิร์ฟเวอร์ ( udp_server.py ) บนโฮสต์ที่รับของคุณเพื่อส่งข้อความตอบรับกลับ
โปรแกรมนี้ควรทำงานได้ดีบน Linux และ OSX ส่วนใหญ่
gcc -Wall -Wextra mtu_discovery.c mtu.c -o plpmtu
ไม่ควรรายงานคำเตือน/ข้อผิดพลาด ถ้าเป็นเช่นนั้นโปรดเปิดประเด็น
หากคุณต้องการรันใน โหมดประเภท ICMP :
sudo ./plpmtu -p icmp -s <server-ipaddr>
หากคุณต้องการเรียกใช้ โหมด UDP แทน:
sudo ./plpmtu -p udp -s <server-ipaddr:port>
จำเป็นต้องมีสิทธิ์ผู้ดูแลระบบเพื่อใช้ซ็อกเก็ตดิบ
ตัวระบุ | คำอธิบาย |
---|---|
-p {icmp/udp} | เลือกโหมดที่จะใช้งาน |
-s <addr[:พอร์ต]> | ระบุที่อยู่ของเซิร์ฟเวอร์ หากทำงานในโหมด UDP คุณต้องระบุพอร์ตปลายทางด้วยการต่อท้าย ':port' (เช่น -s 8.8.8.8:12345 ) |
-l <addr:พอร์ต> | ไม่จำเป็น. เลือกที่อยู่ที่จะผูก (); ใช้ในโหมด UDP; อาจถูกลบออก |
-t <หมดเวลา> | ไม่จำเป็น. เลือกเวลาสูงสุดเพื่อรอการตอบกลับจากเซิร์ฟเวอร์ ค่าเริ่มต้นคือ 1 วินาที เวลาแสดงเป็นมิลลิวินาที |
-r <สูงสุด-reqs> | ไม่จำเป็น. เลือกจำนวนสูงสุดของความพยายามที่ล้มเหลวที่จำเป็นในการประกาศว่าขนาด MTU ไม่ถูกต้อง ค่าเริ่มต้นคือ 3 ครั้ง |
sudo ./plpmtu -p icmp -s 184.12.26.131
ทำการค้นหา MTU (โหมด ICMP) ด้วย 184.12.26.131
sudo ./plpmtu -p udp -s 184.12.26.131:24000 -t 1500 -r 5
ดำเนินการค้นหา MTU (โหมด UDP) ด้วย 184.12.26.131 บนพอร์ต 24000 หากไม่ได้รับการตอบกลับภายใน 1.5 วินาทีเป็นเวลา 5 ครั้งติดต่อกัน ให้ลดเกณฑ์ MTU