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?

aeronave
fonte

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 .

jonathanjo
fonte
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.

ilkkachu
fonte
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