Wo ist Pings "Roundtrip-Zeit" im IP-Header gespeichert?

9

Wenn wir ICMPs verwenden ping, kennen wir die TTL und round-trip timewerden im IP-Header gespeichert. In der folgenden IP-Header-Karte kennen wir den Standort von TTL, aber wo ist die Umlaufzeit ?

Geben Sie hier die Bildbeschreibung ein

Ist es in gespeichert Options?

Flugzeug
quelle

Antworten:

23

Die Umlaufzeit wird eigentlich nirgendwo gespeichert. Der sendende Host merkt sich die Zeit, zu der er jede ICMP-Echoanforderungsnachricht sendet, unter Verwendung der 16-Bit-ID- und Sequenzfelder von ICMP. Wenn die ICMP-Echoantwort abgerufen wird, wird die aktuelle Uhrzeit notiert, die Uhrzeit ermittelt, zu der das durch die Antwort identifizierte übereinstimmende Anforderungspaket gesendet wurde, die Differenz berechnet und gemeldet.

Typischerweise verwendet Ping das ICMP-Identifikationsfeld, um mehrere gleichzeitige Pings zu unterscheiden, und das Sequenzfeld, um einzelne Pakete zu unterscheiden.

Es liegt an der Implementierung, zu entscheiden, wo die ausgehende Zeit für ein bestimmtes Paket gespeichert werden soll: Anstatt sie auf dem Host in einer Tabelle zu speichern, sendet sie sie normalerweise in der ausgehenden Anforderung und verwendet die Kopie in der Antwort, um die Zeit zu berechnen. (Vielen Dank an die Kommentatoren, die darauf hingewiesen haben.) Es wird auf jede für die Implementierung geeignete Weise gesendet und muss natürlich dem anderen Ende und allen dazwischen liegenden Geräten vertrauen, um die Daten ordnungsgemäß zu kopieren. Es ist bekannt, dass einige Systeme die Zeit in 16 Bytes mit einer Auflösung von Mikrosekunden darstellen, andere als 8 Bytes mit einer Auflösung von Millisekunden.

Das Format innerhalb des dataTeils des IP-Pakets ist die ICMP-Echoanforderungs- / Antwortnachricht, die hier aus RFC 792 "Internet Control Message Format" (S. 14) kopiert wurde .

Typeist 8 für Anfrage, 0 für Antwort; Codeist 0.

    0                   1                   2                   3
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |     Type      |     Code      |          Checksum             |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |           Identifier          |        Sequence Number        |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |     Data ...
   +-+-+-+-+-

PS. Um klar zu sein, wird das Identifikationsfeld des IP-Headers normalerweise auf einen beliebigen Wert gesetzt, der für jedes ausgehende Paket unterschiedlich ist, zum Zusammensetzen einer Fragmentierung verwendet wird und nicht den gleichen Wert wie irgendetwas im ICMP-Body hat.

Obwohl ein Mechanismus zum Einfügen von Zeitstempeln in den IP-Header als Option definiert ist, ist dies nicht der normale Mechanismus zum Pingen, da sehr viele Router so konfiguriert sind, dass bestimmte IP-Optionen nicht übergeben werden. Siehe RFC 781- Spezifikation der Internetprotokoll-Zeitstempeloption.

Schließlich, obwohl hier alles aus einer IPv4-Perspektive geschrieben wurde, gemäß der ursprünglichen Frage; Ping in IPv6 ist jedoch sehr ähnlich, siehe ICMPv6 RFC 4443 .

Jonathanjo
quelle
3
AIUI Das Feld "Identifikation" wird verwendet, um Pakete für den Zusammenbau von Fragmenten zu identifizieren. Echoanforderungen werden mit Echoantworten durch die Felder id und seq im ICMP-Header abgeglichen.
Peter Green
Vielen Dank für den Hinweis: Ich habe klargestellt, dass es sich um die ICMP-IP-ID handelt (und nicht um die IP-ID, wie Sie sagen).
Jonathanjo
Ich bin mir ziemlich sicher, dass es unter pingLinux mindestens eine Implementierung gibt, die den Zeitstempel im DataAbschnitt der ICMP-Nutzdaten speichert . Dies führte zu einer recht interessanten Fehlermeldung, wenn die Echoantworten einen Internetaustausch durchliefen, der in jedem Paket an dieser Stelle etwas beschädigt war.
Kasperd
Sie haben natürlich Recht, und ich habe die Antwort aktualisiert, um dies zu sagen. obwohl natürlich die absolute Sendezeit gemäß der Uhr des Absenders gespeichert ist, nicht RTT selbst.
Jonathanjo
3

Zumindest mit dem allgemeinen pingDienstprogramm unter Linux wird die Zeit, zu der das Paket gesendet wurde, im Datenteil des Echoanforderungspakets gespeichert, dh nach den IP- und ICMP-Headern. Der Datenteil bleibt erhalten, wenn der Empfänger mit einer Echoantwort antwortet, sodass der Absender die Umlaufzeit berechnen kann.

Dies wird in der Manpage des pingDienstprogramms beschrieben (unter "ICMP PACKET DETAILS"):

Wenn der Datenraum mindestens die Größe von struct timevalPing hat, werden die Anfangsbytes dieses Raums verwendet, um einen Zeitstempel einzuschließen, den er bei der Berechnung der Umlaufzeiten verwendet. Wenn der Datenraum kürzer ist, werden keine Umlaufzeiten angegeben.

Auf meinem Computer sizeof(struct timeval)ist 16, sodass durch Festlegen der Paketdatengröße auf 15 die pingUmlaufzeiten nicht angezeigt werden:

$ ping -s 15 8.8.8.8 
PING 8.8.8.8 (8.8.8.8) 15(43) bytes of data.
23 bytes from 8.8.8.8: icmp_seq=1 ttl=121

Natürlich wäre das Speichern des Sendezeitstempels innerhalb des Dienstprogramms, wie in der Antwort von @ jonathanjo beschrieben, auch eine mögliche Implementierung. Sogar das Linux-Dienstprogramm benötigt eine interne Buchhaltung, da es doppelte Pakete erkennt.

ilkkachu
quelle
1
Es scheint ein Programmfehler zu sein, dass die RTT nicht angezeigt werden kann, wenn Sie die Datengröße auf weniger als 16 einstellen. Aber gute Punkte.
Kanada
@canadadry, Nun, das Einfügen des Zeitstempels in das Paket selbst ist nur offensichtlich: Die einzige Situation, die benötigt wird, ist, wenn das Antwortpaket kommt, sodass es keinen Sinn macht, es lokal zu speichern. Natürlich scheint das Programm vom BSD-Original der 80er Jahre abgeleitet zu sein, daher hat es möglicherweise auch etwas mit der Zeit zu tun. Wie auch immer, ich bin mir nicht ganz sicher, warum jemand solche extra kleinen Pakete verwenden möchte. Beachten Sie, dass selbst die minimale Ethernet-Frame-Größe groß genug ist, um die Ethernet-, IP- und ICMP-Header sowie einen 16-Byte-Zeitstempel aufzunehmen. (Obwohl noch 2 Bytes übrig sind, gibt es nicht viel Platz für eine weitere Erweiterung.)
ilkkachu
@ilkkachu danke, dass du mich daran erinnert hast, wo die Zeit oft gespeichert ist; Ich habe meine Antwort aktualisiert. Zu winzigen Paketen: Viele Netzwerkprobleme unterscheiden sich nach der Paketgröße.
Jonathanjo
@ikkachu Ich habe mir die Ping-Pakete von Cisco angesehen: Sie haben auch die Zeit, als 64-Bit-Millisekunden.
Jonathanjo