โดยทั่วไปแล้วการค้นพบหน่วยการส่งผ่านสูงสุด (PMTUD) จะเกิดขึ้นทุกครั้งที่โฮสต์คิดว่าแพ็กเก็ตถูกทิ้งเนื่องจากมีขนาดใหญ่เกินไป
นี่อาจเป็นการตอบสนองการกระจายตัวของ ICMP ที่ต้องการ (ประเภท 3 รหัส 4) การตอบสนองอย่างชัดเจนบ่งชี้ว่าแพ็กเก็ตถูกทิ้ง โดยทั่วไปแล้วแพ็คเก็ต IPv4 ทั้งหมดจะถูกตั้งค่าด้วยการตั้งค่าสถานะ "ไม่แฟรกเมนต์" (DF) ดังนั้นแพ็กเก็ตใด ๆ ที่เกินกว่าของ MTU จะล้วงเอาการตอบสนองดังกล่าว IPv6 ไม่รองรับการแตกแฟรกเมนต์เลย
เราเตอร์บางส่วนหรือไฟร์วอลล์โฮสต์วาง ICMP ทั้งหมดบ่อยเพราะเป็นผู้ดูแลระบบไร้เดียงสาเชื่อ ICMP จะเป็นความเสี่ยงด้านความปลอดภัย หรือรูปแบบการรวมลิงค์บางอย่างอาจทำให้การส่ง ICMPไม่สมบูรณ์ วิธีอื่นที่จะค้นพบ MTU ได้รับเกินที่ไม่พึ่งพา ICMP จะถูกนำเสนอในRFC4821
tracepath
เป็นเครื่องมือ Linux ที่ฉันโปรดปรานสำหรับการตรวจสอบ MTU นี่คือตัวอย่างจากโฮสต์ที่มี 9001 MTU บน LAN แต่ต้องผ่าน IPsec VPN เพื่อเข้าถึง 10.33.32.157:
$ tracepath -n 10.33.32.157
1?: [LOCALHOST] pmtu 9001
1: 10.1.22.1 0.122ms pmtu 1500
1: 169.254.3.1 1.343ms pmtu 1422
1: 10.255.254.61 23.790ms
2: no reply
^C [this host won't return an ICMP port unreachable, so tracepath won't terminate]
ข้อผิดพลาด ICMP สามารถสังเกตได้ด้วยtcpdump
:
$ sudo tcpdump -p -ni eth0 'icmp and icmp[0] == 3 and icmp[1] == 4'
14:46:57.313690 IP 10.1.22.1 > 10.1.22.194: ICMP 10.33.32.157 unreachable - need to frag (mtu 1500), length 36
14:46:57.315080 IP 169.254.3.1 > 10.1.22.194: ICMP 10.33.32.157 unreachable - need to frag (mtu 1422), length 556
การค้นพบของ MTU ถูกแคช ใน Linux สามารถสังเกตและล้างด้วยip
(ระวังการเปลี่ยนแปลงตั้งแต่ Linux 3.6 ):
$ ip route get 10.33.32.157
10.33.32.157 via 10.1.22.1 dev eth0 src 10.1.22.194
cache expires 591sec mtu 1422
$ sudo ip route flush cache
$ ip route get 10.33.32.157
10.33.32.157 via 10.1.22.1 dev eth0 src 10.1.22.194
cache
สำหรับ TCP เกิน MTU อาจถูกหลีกเลี่ยงเป็นส่วนหนึ่งของการตั้งค่าการเชื่อมต่อ สิ่งที่รวมอยู่ใน SYN ที่ส่งโดยปลายแต่ละด้านจะมีขนาดเซ็กเมนต์สูงสุด (MSS) ส่วนหัวของ TCP (20 ไบต์ไม่รวมตัวเลือก ) และส่วนหัวของ IP (20 ไบต์) หมายถึง MSS และ MTU มีความเกี่ยวข้องกับความแตกต่างของ 40 ไบต์
นี่คือตัวอย่างของการตั้งค่าการเชื่อมต่อระหว่างสองโฮสต์นี้เมื่อทำการโอนย้ายไฟล์ขนาดใหญ่ด้วยscp
:
$ sudo tcpdump -p -ni eth0 'host 10.33.32.157 and tcp[13]&2 == 2'
IP 10.1.22.194.45853 > 10.33.32.157.22: Flags [S], seq 634040018, win 26883, options [mss 8961,sackOK,TS val 10952240 ecr 0,nop,wscale 7], length 0
IP 10.33.32.157.22 > 10.1.22.194.45853: Flags [S.], seq 1371736848, ack 634040019, win 26847, options [mss 1379,sackOK,TS val 10824267 ecr 10952240,nop,wscale 7], length 0
ในแพคเก็ตแรกโฮสต์ท้องถิ่นเสนอ MSS 8961 นี่คือการกำหนดค่า 9001 MTU น้อยกว่า 40 ไบต์ SYN / ACK ที่ส่งคืนมามี MSS 1379 หมายถึง MTU ที่ 1419 ฉันรู้ว่าในเครือข่ายนี้โฮสต์ระยะไกลก็ส่ง 8961 ด้วย แต่เราเตอร์ได้ทำการแก้ไขค่าเนื่องจากรู้เส้นทางรวมถึงเส้นทางอินเทอร์เน็ต ( MTU 1500) โอเวอร์เฮดจากอุโมงค์ IPsec เราเตอร์นี้ยังแก้ไข MSS ที่ส่งของเราจำนวน 8961 ให้ปรากฏเป็น 1419 ที่โฮสต์อื่น นี้เรียกว่าMSS หนีบ
ดังนั้นในแง่หนึ่ง PMTUD จึงเกิดขึ้นตลอดเวลา ในทางปฏิบัติมันอาจเกิดขึ้นจริง ๆ ไม่เคยถ้า MSS clamping เกิดขึ้นและทราฟฟิกทั้งหมดที่เกิดขึ้นบน TCP หรือถ้าเราเตอร์ใดไม่มี MTU ที่เล็กกว่าสิ่งที่กำหนดค่าไว้บนอุปกรณ์ปลายทาง แม้จะไม่มี MSS clamping มันอาจเกิดขึ้นได้ยากเพียงเล็กน้อยเมื่อแคชหมดอายุ