Onde está o "tempo de ida e volta" do Ping armazenado no cabeçalho IP?


9

Se usarmos ICMP ping, conhecemos o TTL e round-trip timesomos armazenados no cabeçalho IP. No mapa abaixo do cabeçalho IP, sabemos a localização do TTL, mas onde está o tempo de ida e volta ?

Digite a descrição da imagem aqui

É armazenado em Options?

Respostas:


23

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


3
AIUI, o campo "identificação" é usado para identificar pacotes para remontagem de fragmentos. As solicitações de eco são correspondidas para ecoar respostas pelos campos id e seq no cabeçalho do ICMP.
— Peter Green

Obrigado por apontar: esclareci que é o ID do ICMP, não o IP (e seq, como você diz).
— jonathanjo

Tenho certeza de que há pelo menos uma implementação pingno Linux que armazena o registro de data e hora na Dataseçã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.
— kasperd

Você está certo, é claro, e eu atualizei a resposta para dizer isso; embora, naturalmente, seja o horário absoluto de envio, de acordo com o relógio do remetente armazenado, não a própria RTT.
— 21818 jonathanjo #

3

Pelo menos com o pingutilitá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 timevalping, 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 pingexibiçã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.


11
Parece que é um bug do programa que eles não podem exibir o RTT quando você define o tamanho dos dados como menor que 16. Mas bons pontos.
— canadadry

@canadadry, Bem, colocar o registro de data e hora no próprio pacote é óbvio: a única situação necessária é quando o pacote de resposta chega, por isso não adianta armazená-lo localmente. Obviamente, o programa parece ser derivado do original do BSD dos anos 80, portanto pode ter algo a ver com os tempos também. Enfim, não sei exatamente por que alguém iria querer usar pacotes tão pequenos. Observe que mesmo o tamanho mínimo do quadro Ethernet é grande o suficiente para caber nos cabeçalhos Ethernet, IP e ICMP e em um carimbo de data / hora de 16 bytes. (Embora com 2 bytes sobra, por isso, não muito espaço para uma nova extensão.)
— ilkkachu

@ilkkachu obrigado por me lembrar onde o tempo costumava ser armazenado; Eu atualizei minha resposta. Pacotes minúsculos: muitos problemas de rede são diferenciados no tamanho dos pacotes.
— 21418 jonathanjo #

@ikkachu Dei uma olhada nos pacotes de ping da Cisco: eles também têm o tempo, como contagem de 64 bits de milissegundos.
— jonathanjo
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.