คำขอเล็ก ๆ ทำงานได้ การดาวน์โหลดขนาดใหญ่ค้าง และมีคนเสนอการจำกัด MSS ข้อเสนอนั้นถูกบ่อยพอที่จะคุ้มค่าลองตามลำดับที่ถูกต้อง และผิดบ่อยพอที่จะเสียเวลาครึ่งวันถ้านำไปใช้แบบไม่คิด การตรวจสามข้อด้านล่างแยกปัญหาขนาด TCP จริงออกจากปัญหา UDP จากการค้นหา path-MTU ที่เสีย และจากคลัมป์ที่ไม่เคยเห็นการจับมือที่ควรเขียนใหม่

เริ่มจากรูปร่างของความล้มเหลว

ความล้มเหลวด้านขนาดมีลายเซ็น: การเชื่อมต่อสร้างสำเร็จ การพิสูจน์ตัวตนและการตอบกลับเล็ก ๆ สำเร็จ จากนั้นการถ่ายโอนหยุดค้างไม่จำกัดเมื่อต้องการเซกเมนต์ขนาดเต็ม หน้าที่โหลดข้อความได้แต่ไม่เคยทำรูปภาพเสร็จคือความล้มเหลวเดียวกันในขนาดเล็กกว่า ถ้าไม่มีอะไรเชื่อมต่อเลย ปัญหาอยู่ก่อนหน้านั้นในเส้นทาง และการจำกัด MSS จะไม่ช่วย คลัมป์ไม่สามารถซ่อมการจับมือที่ไม่เคยมาถึง

ลายเซ็นนี้มีอยู่เพราะการจับมือคือจุดที่ตกลงขนาดเซกเมนต์ แต่ละฝ่ายประกาศขนาดเซกเมนต์สูงสุดเป็นออปชัน TCP และผู้ส่งเคารพการประกาศของอีกฝ่าย หากเส้นทางไม่สามารถบรรทุกเซกเมนต์ใหญ่ขนาดนั้นได้ ความล้มเหลวจะปรากฏทีหลัง เมื่อผู้ส่งลองสักตัวในที่สุด

จับตาการขนส่งไว้ขณะอ่านอาการนั้น การจำกัด MSS คือการเขียนออปชัน TCP ใหม่ ดังนั้นการโทรเสียงหรือวิดีโอที่ค้างใต้อุโมงค์เดียวกันไม่ใช่ปัญหา MSS และจะไม่ดีขึ้นจากการจำกัดนี้ จดการขนส่งไว้ก่อนแตะออปชัน TCP

ประเมินราคาเส้นทาง แล้วเปรียบเทียบกับอุโมงค์

ตัวเลขสองตัวสำคัญและมักสับสน path-MTU คือแพ็กเก็ตใหญ่ที่สุดที่เส้นทางบรรทุกได้โดยไม่แบ่งส่วน และ MSS ที่ประกาศสำหรับ IPv4 คือค่านั้นลบ 40 ไบต์ของส่วนหัว IP และ TCP หรือลบ 60 สำหรับ IPv6 การห่อหุ้มอุโมงค์กินงบประมาณส่วนหนึ่งก่อนที่แพ็กเก็ตชั้นในจะเริ่ม

ping -M do -s 1400 198.51.100.20
tracepath 198.51.100.20

ping ที่มีบิต do-not-fragment บอกว่าแพ็กเก็ตขนาดเพย์โหลดนั้นอยู่รอดหรือไม่ ปรับขนาดจนกว่าจะล้มเหลวและคุณพบขีดจำกัดเส้นทางจากการทดลองแล้ว เอาต์พุตของ tracepath รายงาน MTU ที่ค้นพบตลอดเส้นทาง ซึ่งเร็วกว่าเมื่อทำงานได้และเชื่อถือได้น้อยกว่าเมื่อฮอปกลางกรองการตรวจ

ตอนนี้ลบภาระส่วนเกินของอุโมงค์ ส่วนหัว IP ชั้นนอก ส่วนหัว UDP และส่วนหัวเฉพาะอุโมงค์ล้วนมาจาก 1500 ไบต์เดียวกัน ดังนั้น MTU ชั้นในที่ใช้ได้บนโครงข่ายอีเทอร์เน็ตทั่วไปจึงต่ำกว่าที่ลิงก์กายภาพบอกเป็นนัย หาก MTU ชั้นในที่คำนวณได้ต่ำกว่าที่เพื่อนของคุณประกาศ คุณพบผู้สมัครคลัมป์จริง ไม่ใช่การเดา หากค่าที่คำนวณได้สูงกว่าการประกาศของเพื่อนอยู่แล้ว ให้หยุดตรงนี้และมองที่อื่น

วางคลัมป์ตรงที่การจับมือผ่าน

คลัมป์ทำงานโดยเขียนออปชัน MSS ในแพ็กเก็ต SYN และ SYN-ACK ใหม่ขณะข้ามเกตเวย์ หากกฎอยู่บนอินเทอร์เฟซที่ไม่มีทิศทางใดผ่านเลย การเจรจาจะเสร็จสิ้นโดยไม่เปลี่ยนและอาการยังอยู่ ดังนั้นตำแหน่งจึงตัดสินผลมากกว่าค่า

SymptomWhat it points toNext check
Handshake completes, large transfer stallsSegment size larger than the path can carryPath MTU against the tunnel's effective MTU
Nothing connects, small or largeRouting, firewall or keying failureNot MSS; look at the tunnel state
Only UDP applications stallDatagram size or a dropped ICMP errorPlatform-specific UDP handling, not clamping
Fixed after reconnect, returns laterClamp applied to one direction or one interfaceRule placement and the handshake path

ทิศทางคืออีกครึ่งหนึ่ง การจำกัดทิศทางเดียวซ่อมครึ่งหนึ่งของโฟลว์และปล่อยที่เหลือล้มเหลวในลักษณะที่ดูเหมือนเป็นช่วง ๆ ดังนั้นใช้กับทั้งสองทิศทางของการรับส่งที่ส่งต่อ รูปแบบคลาสสิกใน Linux สำหรับอินเทอร์เฟซอุโมงค์คือกฎ mangle ที่ตรงกับแพ็กเก็ต SYN:

iptables -t mangle -A FORWARD -o tun0 -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu

สังเกตว่า --clamp-mss-to-pmtu ทำอะไรจริง ๆ: มันได้ค่ามาจาก MTU ของเส้นทาง ซึ่งไม่ใช่ งบประมาณเพย์โหลดจริงของอุโมงค์เสมอไป บนอุโมงค์ที่อิงเส้นทางซึ่งเส้นทางชั้นในและเส้นทางชั้นนอกต่างกัน ค่าที่ชัดเจนซึ่งคำนวณในการตรวจก่อนหน้าคาดเดาได้มากกว่าค่าอัตโนมัติ

ยืนยันด้วยการเชื่อมต่อใหม่ และรักษาข้อมูลป้อนกลับให้มีชีวิต

การเชื่อมต่อที่สร้างแล้วจะเก็บ MSS ที่เจรจาไว้ การทดสอบในเซสชันเดิมจึงไม่พิสูจน์อะไร เปิดการเชื่อมต่อใหม่หลังการเปลี่ยนแปลงและอ่านค่าที่เจรจาโดยตรง แทนที่จะอนุมานจากการถ่ายโอนที่บังเอิญเสร็จ

ss -tin dst 198.51.100.20
iptables -t mangle -S | grep TCPMSS

คำสั่งแรกแสดง MSS ของซ็อกเก็ตพร้อมสถานะการคัดค้าน ซึ่งเป็นการยืนยันเร็วที่สุดว่าคลัมป์มีผล คำสั่งที่สองยืนยันว่ากฎที่คุณคิดว่าเพิ่มไปคือกฎที่มีอยู่จริง ในตารางที่วางไว้

จากนั้นปกป้องกลไกที่คุณไม่ได้ซ่อม path-MTU อาศัยข้อความ ICMP fragmentation-needed ไปถึงผู้ส่ง ดังนั้นไฟร์วอลล์ที่ทิ้งข้อความเหล่านี้จะทำลายการถ่ายโอนขนาดใหญ่ต่อไปแม้มีคลัมป์ที่ถูกต้อง อนุญาตข้อความเหล่านี้สำหรับเส้นทางอุโมงค์ หรือยอมรับว่าการจำกัด MSS กำลังชดเชยนโยบายที่คุณเลือกเอง

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

จด path-MTU ที่วัดได้ ภาระส่วนเกินอุโมงค์ที่ลบออก กฎที่เพิ่ม และ MSS ที่เห็นหลังจากนั้น ตัวเลขสี่ตัวทำให้เหตุการณ์ครั้งหน้าเป็นการค้นหาแทนการสอบสวน

บทความที่เกี่ยวข้อง