Antworten:
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 data
Teils des IP-Pakets ist die ICMP-Echoanforderungs- / Antwortnachricht, die hier aus RFC 792 "Internet Control Message Format" (S. 14) kopiert wurde .
Type
ist 8 für Anfrage, 0 für Antwort; Code
ist 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 .
ping
Linux mindestens eine Implementierung gibt, die den Zeitstempel im Data
Abschnitt 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.
Zumindest mit dem allgemeinen ping
Dienstprogramm 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 ping
Dienstprogramms beschrieben (unter "ICMP PACKET DETAILS"):
Wenn der Datenraum mindestens die Größe von
struct timeval
Ping 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 ping
Umlaufzeiten 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.