Dove si trova il "tempo di andata e ritorno" di Ping nell'intestazione IP?


9

Se utilizziamo ICMP ping, conosciamo il TTL e round-trip timesono memorizzati nell'intestazione IP. Nella seguente mappa dell'intestazione IP conosciamo la posizione di TTL, ma dov'è il tempo di andata e ritorno ?

Inserisci qui la descrizione dell'immagine

È memorizzato in Options?

Risposte:


23

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 dataparte 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 .


3
AIUI il campo "identificazione" viene utilizzato per identificare i pacchetti per il riassemblaggio dei frammenti. Le richieste di eco sono associate alle risposte dell'eco dai campi id e seq nell'intestazione ICMP.
Peter Green,

Grazie per averlo sottolineato: ho chiarito che è l'ID ICMP e non IP (e seq, come dici tu).
jonathanjo,

Sono abbastanza sicuro che ci sia almeno un'implementazione di pingsu Linux che memorizza il timestamp nella Datasezione 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.
Kasperd,

Hai ragione, ovviamente, e ho aggiornato la risposta per dire questo; sebbene naturalmente sia il tempo assoluto di invio in base all'orologio del mittente che viene memorizzato, non RTT stesso.
jonathanjo,

3

Almeno con l' pingutilità 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 pingdell'utilità (sotto "DETTAGLI PACCHETTO ICMP"):

Se lo spazio dati ha almeno le dimensioni del struct timevalping, 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 pingdi 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.


1
Sembra che sia un bug del programma che non possono visualizzare RTT quando si imposta la dimensione dei dati su un valore inferiore a 16. Ma i punti positivi.
canadadry,

@canadadry, Beh, mettere il timestamp nel pacchetto stesso è ovvio: l'unica situazione che serve è quando arriva il pacchetto di risposta, quindi non c'è motivo di memorizzarlo localmente. Naturalmente, il programma sembra essere derivato dall'originale BSD degli anni '80, quindi potrebbe anche avere qualcosa a che fare con i tempi. Ad ogni modo, non sono esattamente sicuro del motivo per cui qualcuno vorrebbe usare pacchetti così piccoli. Si noti che anche la dimensione minima del frame Ethernet è abbastanza grande da adattarsi alle intestazioni Ethernet, IP e ICMP e un timestamp a 16 byte. (Anche se con 2 byte rimasti, quindi non c'è molto spazio per qualsiasi ulteriore estensione.)
ilkkachu

@ilkkachu grazie per avermi ricordato dove è stato spesso memorizzato il tempo; Ho aggiornato la mia risposta. Per piccoli pacchetti: molti problemi di rete si differenziano per la dimensione dei pacchetti.
jonathanjo,

@ikkachu Ho dato uno sguardo ai pacchetti ping di Cisco: hanno anche il tempo, come conteggio a 64 bit di millisecondi.
jonathanjo,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.