Respostas:
O tempo de ida e volta não é realmente armazenado em nenhum lugar. O host remetente lembra a hora em que envia cada mensagem de solicitação de eco do ICMP, usando os campos de identificação e sequência de 16 bits do ICMP. Quando recebe a resposta de eco do ICMP, observa a hora atual, encontra a hora em que enviou o pacote de solicitação correspondente identificado pela resposta, calcula a diferença e a reporta.
Normalmente, o ping usa o campo de identificação do ICMP para diferenciar vários pings simultâneos e o campo de sequência para diferenciar pacotes individuais.
Cabe à implementação decidir onde armazenar o tempo de saída para um determinado pacote: em vez de armazená-lo no host em uma tabela, ele normalmente o envia na solicitação de saída e usa a cópia na resposta para calcular o tempo. (Agradecemos aos comentaristas por apontar isso.) Ele é enviado da maneira que for mais conveniente para a implementação e, é claro, deve confiar no extremo e em qualquer equipamento intermediário para copiar adequadamente os dados. Sabe-se que alguns sistemas representam o tempo em 16 bytes com resolução de microssegundos, outros como 8 bytes com resolução de milissegundos.
O formato dentro da data
parte do pacote IP é a mensagem ICMP Echo Request / Reply, copiada aqui do RFC 792 "Internet Control Message Format" (p14).
Type
é 8 para solicitação, 0 para resposta; 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. Só para esclarecer, o campo de identificação do cabeçalho IP normalmente é definido como um valor arbitrário, diferente para cada pacote de saída, usado para remontagem de qualquer fragmentação e não possui o mesmo valor que qualquer coisa no corpo do ICMP.
Além disso, embora exista um mecanismo definido para colocar carimbos de data e hora no cabeçalho IP como uma opção, esse não é o mecanismo normal para o ping porque muitos roteadores estão configurados para não passar determinadas opções de IP. Consulte a especificação RFC 781 da opção de carimbo de data / hora do protocolo Internet.
Finalmente, embora tudo aqui tenha sido escrito da perspectiva do IPv4, de acordo com a pergunta original; mas o ping no IPv6 é extremamente semelhante, consulte ICMPv6 RFC 4443 .
ping
no Linux que armazena o registro de data e hora na Data
seção da carga útil do ICMP. Isso levou a uma mensagem de erro bastante interessante quando as respostas de eco atravessaram uma troca na Internet que estava corrompendo um pouco naquele local em todos os pacotes.
Pelo menos com o ping
utilitário comum no Linux, o horário em que o pacote foi enviado é armazenado na parte de dados do pacote de solicitação de eco, ou seja, após os cabeçalhos IP e ICMP. A parte dos dados é mantida intacta quando o receptor responde com uma resposta de eco, para que o remetente possa calcular o tempo de ida e volta.
Isso é descrito na páginaping
do manual do utilitário (em "ICMP PACKET DETAILS"):
Se o espaço de dados tiver pelo menos o tamanho de
struct timeval
ping, os bytes iniciais deste espaço incluirão um registro de data e hora que ele usa no cálculo dos tempos de ida e volta. Se o espaço para dados for menor, nenhum tempo de ida e volta será fornecido.
Na minha máquina sizeof(struct timeval)
tem 16 anos, portanto, definir o tamanho dos dados do pacote para 15 impede a ping
exibição dos tempos de ida e volta:
$ 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
Obviamente, armazenar o registro de data e hora de envio no utilitário, como a resposta de @ jonathanjo descreve, também seria uma implementação possível. Até o utilitário Linux precisa de alguma contabilidade interna, pois detecta pacotes duplicados.