Warum stimmen Iterf-, Scamper- und Pfad-MTU-Erkennungspaketerfassungen nicht mit der MTU des Pfads überein?


11

Lassen Sie uns eine Pfad-MTU-Erkennung zwischen zwei Debian-Hosts durchführen, die durch einen Debian-Router getrennt sind, auf dem Shorewall-generierte iptables-Regeln ausgeführt werden. Jeder der beiden Hosts verwendet eine einzelne Ethernet-Verbindung, während der Router getaggte VLANs über zwei aggregierte Ethernet-Verbindungen verwendet.

Mit 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]

Gut: 6128 Bytes sind das erwartete Ergebnis (billige Realtek-Ethernet-Adapter können keine Jumbo-Frames mit einer anständigen Größe verarbeiten).

Lassen Sie jetzt iperf einen Durchsatztest durchführen und uns übrigens etwas über die MTU erzählen:

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 Bytes? Warum ?

Und nun zu etwas völlig anderem, lassen Sie uns sehen, was der Verkehr in dieser Sitzung tatsächlich enthielt:

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 Bytes MSS, was 6128 MTU bedeutet ... Gut. Aber warum kündigt iperf dann eine 6116-Byte-MTU an?

An diesem Punkt erfordert Gründlichkeit einen genaueren Blick darauf, was während der Scamper-Trace-Sitzung passiert:

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)

Alle diese Pakete haben eine udp.Länge von 24, mit Ausnahme der beiden letzten, die eine udp.Länge von 6108 haben ... Aber wie sagt uns Scamper dann, dass der Pfad MTU 6128 ist?

6108, 6116, 6128 ... So viele MTUs zur Auswahl!


Hat dir eine Antwort geholfen? Wenn ja, sollten Sie die Antwort akzeptieren, damit die Frage nicht für immer auftaucht und nach einer Antwort sucht. Alternativ können Sie Ihre eigene Antwort bereitstellen und akzeptieren.
Ron Maupin

Antworten:


4

Sehr interessant.

MSS (maximale Segmentgröße) = MTU - IP-Header = 6076.

6076 + 40 = 6116.

Könnte es sein, dass Debian die IP-Optionsfelder im IP-Header verwendet? Das könnten die zusätzlichen 12 Bytes sein ...


Ist es möglich, dass der TCP-Handshake eine MTU mit 6128 Bytes erstellt und iperf dann herausfindet, dass er nicht mehr als 6116 Bytes gleichzeitig übertragen hat - was eine Art empirische MTU wäre, die nichts mit der "offiziellen" zu tun hat?
Jean-Marc Liotier

Gibt es unabhängig von den IP-Optionen keine Auffüllung, die sicherstellt, dass die Länge (IP-Optionen + Auffüllung) = 32 Bit beträgt?
Jean-Marc Liotier

12 Bytes… Meinten Sie nicht "TCP-Optionen" anstelle von "IP-Optionen"?
Jean-Marc Liotier

Ich habe die TCP-Optionen der iperf-Sitzung abgetastet: anscheinend immer 12 Bytes (nur die Zeitstempel)
Jean-Marc Liotier

2
In github.com/jasonrm/iperf/blob/… heißt es in einem Kommentar "// Lesegrößen verfolgen -> gibt einen Hinweis auf die MTU-Größe" und in github.com/jasonrm/iperf/blob/… in einem anderen Kommentar "Bericht" die MSS und MTU, angesichts der MSS (oder einer Vermutung davon) "- seltsam, wenn man bedenkt, dass iperf die tatsächliche Path MTU Discovery unterstützen soll.
Jean-Marc Liotier

3

tshark gibt die Ethernet-Frame-Größe an: 6142 - 14 (Ethernet-Header) = 6128 IP-Bytes.

scamper führt eine Traceroute mit kleinen Paketen durch, bevor große Pakete auf MTU-Erkennung geprüft werden (aus diesem Grund werden kleine Pakete gefolgt von großen Paketen angezeigt). Dies ist nützlich, um zwischen allen verworfenen / nicht reagierenden Paketen und nur den großen Paketen zu unterscheiden.

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.