Risposte:
Il tempo di andata e ritorno non è effettivamente memorizzato da nessuna parte. L'host di invio ricorda l'ora in cui invia ogni messaggio di richiesta echo ICMP, utilizzando i campi identificativo e sequenza ICMP a 16 bit. Quando ottiene la risposta echo ICMP, rileva l'ora corrente, trova l'ora in cui ha inviato il pacchetto di richiesta corrispondente identificato dalla risposta, calcola la differenza e la riporta.
In genere il ping utilizza il campo di identificazione di ICMP per differenziare più ping simultanei e il campo sequenza per differenziare i singoli pacchetti.
Spetta all'implementazione decidere dove archiviare il tempo in uscita per un determinato pacchetto: invece di memorizzarlo sull'host in una tabella, in genere lo invia nella richiesta in uscita e utilizza la copia nella risposta per calcolare il tempo. (Grazie ai commentatori per averlo sottolineato.) Viene inviato in qualsiasi modo sia conveniente per l'implementazione e, naturalmente, deve fidarsi del lato remoto e di qualsiasi attrezzatura interveniente, per copiare correttamente i dati. Alcuni sistemi sono noti per rappresentare il tempo in 16 byte con risoluzione di microsecondi, alcuni come 8 byte con risoluzione di millisecondi.
Il formato all'interno della data
parte del pacchetto IP è il messaggio di richiesta / risposta echo ICMP, copiato qui da RFC 792 "Internet Control Message Format" (p14).
Type
è 8 per Richiesta, 0 per Risposta; Code
è 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. Per essere chiari, il campo di identificazione dell'intestazione IP è normalmente impostato su un valore arbitrario, diverso per ogni pacchetto in uscita, utilizzato per il riassemblaggio di qualsiasi frammentazione e non ha lo stesso valore di qualsiasi cosa nel corpo dell'ICMP.
Inoltre, sebbene sia stato definito un meccanismo per inserire i timestamp nell'intestazione IP come opzione, questo non è il normale meccanismo per il ping perché molti router sono configurati per non passare determinate opzioni IP. Vedere le specifiche RFC 781 dell'opzione Data / ora protocollo Internet.
Infine, sebbene tutto qui sia stato scritto da una prospettiva IPv4, secondo la domanda originale; ma il ping in IPv6 è estremamente simile, vedi ICMPv6 RFC 4443 .
ping
su Linux che memorizza il timestamp nella Data
sezione del payload ICMP. Ciò ha portato a un messaggio di errore piuttosto interessante quando le risposte dell'eco hanno attraversato uno scambio Internet che stava corrompendo un po 'in quella posizione in ogni pacchetto.
Almeno con l' ping
utilità comune su Linux, il momento in cui il pacchetto è stato inviato viene memorizzato nella parte dati del pacchetto di richiesta echo, ovvero dopo le intestazioni IP e ICMP. La parte di dati viene mantenuta intatta quando il destinatario risponde con una risposta eco, in modo che il mittente possa calcolare il tempo di andata e ritorno.
Questo è descritto nella pagina man ping
dell'utilità (sotto "DETTAGLI PACCHETTO ICMP"):
Se lo spazio dati ha almeno le dimensioni del
struct timeval
ping, utilizza i byte iniziali di questo spazio per includere un timestamp che utilizza nel calcolo dei tempi di andata e ritorno. Se lo spazio dati è più breve, non vengono indicati i tempi di andata e ritorno.
Sulla mia macchina sizeof(struct timeval)
è 16, quindi l'impostazione della dimensione dei dati del pacchetto su 15 impedisce ping
di mostrare i tempi di andata e ritorno:
$ 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
Naturalmente, anche la memorizzazione del timestamp di invio all'interno dell'utilità, come descrive la risposta di @ jonathanjo, sarebbe una possibile implementazione. Anche l'utility Linux ha bisogno di una contabilità interna, poiché rileva pacchetti duplicati.