ping para enviar 0 bytes

6

É possível que o comando ping no Linux (CentOS) envie 0 bytes. No windows pode-se definir usando -l argument
comando tentado

  ping localhost -s 0
    PING localhost (127.0.0.1) 0(28) bytes of data.
    8 bytes from localhost (127.0.0.1): icmp_seq=1 ttl=64
    8 bytes from localhost (127.0.0.1): icmp_seq=2 ttl=64
    ^C
    --- localhost ping statistics ---
    2 packets transmitted, 2 received, 0% packet loss, time 999ms



man ping

-s packetsize
              Specifies  the  number of data bytes to be sent.  The default is
              56, which translates into 64 ICMP data bytes when combined  with
              the 8 bytes of ICMP header data.

Edit1: adicionando o output do ping no windows, caso alguém precise dele

ping 127.0.0.1  -l 0

Pinging 127.0.0.1 with 0 bytes of data:
Reply from 127.0.0.1: bytes=0 time<1ms TTL=128
Reply from 127.0.0.1: bytes=0 time<1ms TTL=128
Reply from 127.0.0.1: bytes=0 time<1ms TTL=128

Ping statistics for 127.0.0.1:
    Packets: Sent = 3, Received = 3, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
    Minimum = 0ms, Maximum = 0ms, Average = 0ms

ping 127.0.0.1

Pinging 127.0.0.1 with 32 bytes of data:
Reply from 127.0.0.1: bytes=32 time<1ms TTL=128
Reply from 127.0.0.1: bytes=32 time<1ms TTL=128
Reply from 127.0.0.1: bytes=32 time<1ms TTL=128

Ping statistics for 127.0.0.1:
    Packets: Sent = 3, Received = 3, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
    Minimum = 0ms, Maximum = 0ms, Average = 0ms
    
por vnc 08.10.2015 / 20:25

3 respostas

26

Um ping não pode ter 0 bytes no Linux, Windows ou qualquer outra plataforma que afirme ser capaz de enviar pings. No mínimo, o pacote deve conter um cabeçalho IP e um ping não-mal-feito não-enganoso também incluirá um cabeçalho ICMP, que tem 8 bytes de comprimento.

É possível que o windows difira em como eles emitem os bytes recebidos. O Linux informa o tamanho da porção ICMP do pacote (8 bytes para o cabeçalho ICMP mais qualquer dado ICMP presente). O Windows pode, em vez disso, imprimir o número de bytes de dados de carga útil do ICMP, de modo que, embora ele diga "0", esses 8 bytes de cabeçalho do ICMP ainda estarão lá. Para realmente ter 0 bytes ICMP, significa que seu pacote é um cabeçalho IP bruto e não é mais uma solicitação de ping ICMP. O ponto é, mesmo se o windows está dizendo que o pacote de ping tem 0 bytes de comprimento, não é.

O tamanho mínimo de um pedido de eco ICMP ou pacote de resposta de eco é de 28 bytes:

  • cabeçalho IP de 20 bytes,
  • cabeçalho ICMP de 4 bytes,
  • dados do cabeçalho de solicitação / resposta echo de 4 bytes,
  • 0 bytes de dados de carga útil do ICMP.

Quando o ping no linux é impresso:

8 bytes from localhost (127.0.0.1): icmp_seq=1 ttl=64

Esses 8 bytes são o cabeçalho ICMP de 4 bytes e os dados do cabeçalho de resposta de eco ICMP de 4 bytes e refletem um tamanho de dados de carga útil de ICMP de 0 bytes.

    
por 08.10.2015 / 20:49
10

Qual é o seu meio de transmissão da camada 2? Ethernet? Não há como ter um quadro Ethernet menor que 64 bytes, independentemente do que ele carrega.

Portanto, mesmo que você possa enviar um ping ICMP com 0 bytes de carga útil, sua placa ethernet preencherá o frame com até 64 bytes para transmissão.

@ Casey mostrou que seu mínimo teórico é de 28 bytes, mas o ethernet adicionará 36 bytes de preenchimento para chegar ao total de 64 bytes. Qualquer menos é um pacote Runt e é muito curto.

Por que 64 bytes? Isso é uma questão totalmente nova e tem a ver com o tempo de transmissão de um bit e detecção de colisão e que a ethernet é um domínio CSMA / CD não CSMA / CA.

    
por 08.10.2015 / 22:36
4

Você precisa distinguir entre o tamanho do cabeçalho e o tamanho da carga útil (dados). Pacotes ICMP podem, opcionalmente, armazenar dados. O cabeçalho tem um tamanho constante de 64 bits, ou seja, 8 bytes. A carga útil pode variar e pode até estar ausente. Isso se refere ao envio de 0 bytes e exatamente descriptos na man -page de ping :

  -s packetsize
          Specifies the number of data bytes to be sent.  The default is 56, which translates into 64 ICMP data bytes when combined with the 8 bytes of ICMP header data.

Quando você executa definindo o tamanho do pacote como 0, ele gera o seguinte:

ping -s 0 192.168.172.51
PING 192.168.172.51 (192.168.172.51) 0(28) bytes of data.
8 bytes from 192.168.172.51: icmp_seq=1 ttl=63
8 bytes from 192.168.172.51: icmp_seq=2 ttl=63

Como você pode ver, ele realmente menciona o cabeçalho de contagem de 8 bytes mais a carga útil. Você pode fazer mais testes com tamanhos arbitrários de pacotes e ver que sempre haverá mais 8 bytes transmitidos, porque esse é o tamanho constante do cabeçalho adicional.

Um tcpdump simultâneo justifica isso:

11:49:30.271160 IP 192.168.172.50 > 192.168.172.51: ICMP echo request, id 5472, seq 30, length 8

Os 28 bytes extras na linha de cabeçalho, 0 (28), vêm do cabeçalho IP + ICMP.

    
por 09.10.2015 / 11:29

Tags