ลองค้นหาเส้นทาง MTU ระหว่างสอง Debian host ที่คั่นด้วยเราเตอร์ Debian ที่รันกฎ iptables ที่สร้างโดย Shorewall แต่ละโฮสต์ทั้งสองใช้ลิงค์อีเทอร์เน็ตเดี่ยวในขณะที่เราเตอร์ใช้ VLAN ที่ติดแท็กผ่านลิงก์อีเทอร์เน็ตรวมสองตัว
ใช้วิ่งหนี :
root@kitandara:/home/jm# scamper -I "trace -M 10.64.0.2"
traceroute from 10.1.0.5 to 10.64.0.2
1 10.1.0.1 0.180 ms [mtu: 6128]
2 10.64.0.2 0.243 ms [mtu: 6128]
ดี: 6128 ไบต์เป็นผลลัพธ์ที่คาดหวัง (อะแดปเตอร์ Realtek อีเธอร์เน็ตราคาถูกไม่สามารถจัดการเฟรมจัมโบ้ในขนาดที่เหมาะสม)
ตอนนี้ให้iperfทำการทดสอบปริมาณงานและบอกเราเกี่ยวกับ MTU โดยวิธี:
root@kitandara:/home/jm# iperf -c 10.64.0.2 -N -m
------------------------------------------------------------
Client connecting to 10.64.0.2, TCP port 5001
TCP window size: 66.2 KByte (default)
------------------------------------------------------------
[ 3] local 10.1.0.5 port 59828 connected with 10.64.0.2 port 5001
[ ID] Interval Transfer Bandwidth
[ 3] 0.0-10.0 sec 1011 MBytes 848 Mbits/sec
[ 3] MSS size 6076 bytes (MTU 6116 bytes, unknown interface)
6116 ไบต์? ทำไม
และตอนนี้สำหรับบางสิ่งที่แตกต่างอย่างสิ้นเชิงเรามาดูว่าการรับส่งข้อมูลของเซสชันนี้มีอะไรบ้าง:
root@kitandara:/home/jm# tshark -i eth0 -R "(ip.dst == 10.64.0.2) || (ip.src == 10.64.0.2)" | head
Capturing on eth0
1.308557 10.1.0.5 -> 10.64.0.2 TCP 74 60310 > 5001 [SYN] Seq=0 Win=5340 Len=0 MSS=534 SACK_PERM=1 TSval=101928961 TSecr=0 WS=16
1.308801 10.64.0.2 -> 10.1.0.5 TCP 74 5001 > 60310 [SYN, ACK] Seq=0 Ack=1 Win=18328 Len=0 MSS=6088 SACK_PERM=1 TSval=3764064056 TSecr=101928961 WS=64
6088 ไบต์ MSS ซึ่งหมายถึง 6128 MTU ... ดี แต่ทำไม iperf ถึงประกาศ 6116 ไบต์ MTU
เมื่อถึงจุดนั้นการเรียกร้องอย่างละเอียดถี่ถ้วนถึงสิ่งที่เกิดขึ้นในระหว่างการติดตามการวิ่งหนี:
root@kitandara:/home/jm# tshark -i eth0 -R "(ip.dst == 10.64.0.2) || (ip.src == 10.64.0.2)"
Capturing on eth0
0.000000 10.1.0.5 -> 10.64.0.2 UDP 58 Source port: 43870 Destination port: 33435
0.000175 10.1.0.1 -> 10.1.0.5 ICMP 86 Time-to-live exceeded (Time to live exceeded in transit)
0.050358 10.1.0.5 -> 10.64.0.2 UDP 58 Source port: 43870 Destination port: 33436
0.050592 10.64.0.2 -> 10.1.0.5 ICMP 86 Destination unreachable (Port unreachable)
0.099790 10.1.0.5 -> 10.64.0.2 UDP 6142 Source port: 43870 Destination port: 33437
0.100912 10.64.0.2 -> 10.1.0.5 ICMP 590 Destination unreachable (Port unreachable)
แพ็คเก็ตทั้งหมดนั้นมี udp.length 24 ยกเว้นสองอันสุดท้ายที่มี udp.length ของ 6108 ... แต่แล้ว scamper บอกเราได้อย่างไรว่าเส้นทาง MTU คือ 6128?
6108, 6116, 6128 ... MTU ให้เลือกมากมาย!