Mengapa paket IPU iperf, lari cepat, dan jalur MTU tidak menyetujui MTU jalur?

11

Mari kita lakukan beberapa penemuan jalur MTU antara dua host Debian yang dipisahkan oleh router Debian yang menjalankan aturan iptables yang dihasilkan Shorewall. Masing-masing dari dua host menggunakan tautan Ethernet tunggal sementara router menggunakan VLAN yang ditandai di atas dua tautan Ethernet agregat.

Menggunakan scamper :

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]

Bagus: 6128 byte adalah hasil yang diharapkan (adapter Realtek Ethernet yang murah tidak dapat menangani bingkai jumbo dengan ukuran yang layak).

Sekarang, biarkan iperf melakukan tes throughput dan beri tahu kami tentang 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 byte? Mengapa

Dan sekarang untuk sesuatu yang sama sekali berbeda, mari kita lihat apa yang sebenarnya mengandung lalu lintas sesi ini:

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 byte MSS, yang berarti 6128 MTU ... Bagus. Tapi mengapa iperf mengumumkan MTU 6116 byte?

Pada titik itu, teliti menuntut untuk melihat lebih dekat apa yang terjadi selama sesi jejak lari cepat:

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)

Semua paket memiliki udp.length 24 kecuali dua yang terakhir memiliki udp.length 6108 ... Tapi lalu bagaimana scamper memberi tahu kita bahwa path MTU adalah 6128?

6108, 6116, 6128 ... Begitu banyak MTU untuk dipilih!

Jean-Marc Liotier
sumber
Apakah ada jawaban yang membantu Anda? jika demikian, Anda harus menerima jawabannya sehingga pertanyaan tidak terus muncul selamanya, mencari jawaban. Atau, Anda bisa memberikan dan menerima jawaban Anda sendiri.
Ron Maupin

Jawaban:

4

Sangat menarik.

MSS (ukuran segmen maksimum) = MTU - IP header = 6076.

6076 + 40 = 6116.

Mungkinkah Debian menggunakan bidang opsi IP di header IP? Itu mungkin 12 byte tambahan ...

Peter Tavenier
sumber
Mungkinkah jabat tangan TCP menetapkan MTU 6128 byte dan kemudian iperf mengetahui bahwa ia gagal mengirimkan lebih dari 6116 byte sekaligus - yang akan menjadi semacam MTU empiris yang tidak terkait dengan yang "resmi"?
Jean-Marc Liotier
Apa pun opsi IP, bukankah ada padding yang memastikan panjang (IP options + padding) = 32 bit?
Jean-Marc Liotier
12 byte ... Bukankah maksud Anda "opsi TCP" dan bukan "opsi IP"?
Jean-Marc Liotier
Saya mencicipi opsi TCP dari sesi iperf: tampaknya selalu 12 byte (hanya cap waktu)
Jean-Marc Liotier
2
Di github.com/jasonrm/iperf/blob/… komentar mengatakan "// melacak ukuran baca -> memberikan beberapa indikasi ukuran MTU" dan di github.com/jasonrm/iperf/blob/… yang lain berkata "Laporkan MSS dan MTU, mengingat MSS (atau tebakannya) "- aneh mengingat iperf seharusnya mendukung Path MTU Discovery yang sebenarnya.
Jean-Marc Liotier
3

tshark melaporkan ukuran bingkai ethernet: 6142 - 14 (header ethernet) = 6128 byte IP.

scamper melakukan traceroute dengan paket kecil sebelum mencari dengan paket besar untuk penemuan MTU (itulah sebabnya Anda melihat paket kecil diikuti oleh yang besar). ini berguna untuk membedakan antara semua paket yang dibuang / tidak merespons dan hanya yang besar.

https://www.usenix.org/conference/imc-05/inferring-and-debugging-path-mtu-discovery-failures

Matthew Luckie
sumber