Curso de Redes – Como funciona o programa ping

O programa ping

O programa ping, escrito por Mike Muus em 1983, é um utilitário que permite testar a conectividade entre dois hosts em uma rede. Ele funciona enviando uma mensagem ICMP do tipo Echo Request a um host, e espera o recebimento de uma mensagem ICMP do tipo Echo Reply em retorno.

No geral, se você não conseguir “pingar” um host, significa que não há conectividade entre as máquinas envolvidas no processo. É um dos primeiros passos que tomamos para determinar qual o problema que afeta uma rede onde um ou mais hosts não conseguem se comunicar entre si, ou com a rede externa.

Na figura a seguir podemos ver o formato das mensagens ICMP Echo Request e Echo Reply. O que as diferencia é o tipo – a mensagem Echo Request possui o tipo 8 e a Echo Reply, o tipo 0, ambas com código 0:

ICMP - Mensagens Echo Request e Echo Reply

O Número de Sequência se inicia em 1 e é incrementado cada vez que uma nova mensagem Echo Request é enviada. o ping então mostra o número de sequência de cada datagrama retornado, de modo que podemos verificar se os pacotes se perderam, estão fora de ordem, ou ainda foram duplicados. Como sabemos, o protocolo IP é um serviço de entrega de datagramas do tipo “melhor esforço”, de modo que qualquer uma dessas condições citadas pode vir a ocorrer.

Além de mostrar o número de sequência, quando a mensagem de retorno Echo Reply é recebida, também são mostrados o TTL e o RTT (Round Trip Time) calculado. O ping calcula o RTT armazenando a hora na qual o pacote Echo Request é enviado na área de dados da mensagem ICMP. Então, quando a resposta Echo Reply é recebida, ele simplesmente subtrai esse valor de hora da hora atual (momento em que o datagrama é recebido). Erros e perda de pacotes também são relatados pelo comando ping.

Veja na figura a seguir um exemplo do comando ping emitido para testar a conectividade com o host www.planetaunix.com.br (usando uma estação com Kali Linux) :

Comando Ping no Kali Linux

Veja o mesmo comando sendo emitido a partir do prompt de comandos em uma estação com Windows 7:

Comando ping no Windows 7

Em ambos os casos emitimos o ping para uma URL (www.planetaunix.com.br),  podemos perceber que o endereço IP é resolvido e então utilizado para o envio das mensagens. Quando emitimos um comando ping, alguns segundos podem se passar antes da primeira linha de informações com o IP do host aparecer, sendo esse o tempo necessário para que o DNS determine o IP que corresponda ao hostname usado. Obviamente podemos pingar um endereço IP diretamente, se ele for conhecido.

Note também que a saída padrão no Linux mostra o número de sequência de cada datagrama (campo icmp_seq=), ao passo que no prompt do Windows essa informação não é mostrada por padrão.

As colunas time= e tempo= mostram o RTT do datagrama enviado (em milissegundos), ao passo que o TTL (43 no exemplo) é mostrado na coluna TTL (mesmo nome em ambos os sistemas).

Já o campo bytes=32 mostra o tamanho da mensagem enviada – no caso, 32 bytes. Esse tamanho pode ser alterado por meio de opções do comando ping, que veremos mais adiante. Alterar a quantidade de bytes enviados pode ser muito útil para realização de testes específicos de conectividade.

São mostradas também as estatísticas de envio dos pacotes, com dados sobre número de pacotes transmitidos, número de pacotes recebidos, pacotes perdidos e porcentagem de perda. Os RTTs mínimo, máximo e médio também são calculados e exibidos.

Sintaxe do comando ping

ping [opções] hostname ou endereço ip

Opções comuns do programa ping no Windows:

-t
Dispara contra o host especificado até ser interrompido. Para ver as estatísticas e continuar, pressione Ctrl+Break; para parar, pressione Ctrl+C.
-a
Resolve endereços para nomes de host
-n Núm
Número de requisições de eco a serem enviadas (Núm)
-f
Ativa o sinalizador Don´t Fragment (Não Fragmentar) no pacote (somente IPv4).
-i TTL
Ajustar o TTL dos pacotes
-r Núm
Grava a rota dos saltos de contagem (somente IPv4)
-s Núm
Carimbo de data/hora (timestamp) para saltos de contagem (somente IPv4)
-w Tempo
Tempo limite em milissegundos a aguardar para cada resposta
-R
Usa cabeçalho de roteamento para testar também a rota (somente IPv6)
-S endereço
Endereço de origem a ser usado.
-4
Forçar o uso de IPv4
-6
Forçar o uso e IPv6

Exemplo:

1. Pingar o host www.bosontreinamentos.com.br enviando seis requisições de eco:

ping -n 6 www.bosontreinamentos.com.br

Ping no Windows

2. Capturar os pacotes de ping no Wireshark. Vamos pingar o endereço www.bosontreinamentos.com.br e capturar os pacotes ICMP trocados usando o analisador de pacotes Wireshark:

ping www.bosontreinamentos.com.br

Veja os oito pacotes capturados na figura a seguir (4 mensagens Echo Request e 4 mensagens Echo Reply):

Capturar pacote de ping no Wireshark no Windows

Vamos abrir uma das mensagens Echo Request para ver seu conteúdo:

Capturando o conteúdo de uma mensagem ping ICMP com Wireshark

Note os valores dos campos Tipo (8), Código (0), Checksum (ox4d56 [correct]), Identificador e Número de Sequência (ambos nas representações Big Endian e  Little Endian), e o conteúdo da mensagem, que consiste em uma sequência de caracteres (no caso, letras do alfabeto).

Opções comuns do programa ping no Linux:

-b
Permitir o ping em um endereço de broadcast
-c contagem
Parar o envio de mensagens Echo Request após enviar o número de pacotes especificado por contagem
-f
Flood ping. Para cada mensagem Echo Request enviada, um ponto “.” será mostrado na tela, enquanto que para cada mensagem Echo reply recebida um caractere backspace será impresso. Desta forma, temos uam forma muito rápida de mostrar quantos pacotes estão sendo descartados. Se não for fornecido um intervalo, ele será configurado para zero e os pacotes serão enviados o mais rápido que for possível, assim que eles retornarem ou uma centena de vezes por segundo, o que for mais rápido. Apenas o usuário root pode usar essa opção com o intervalo zero entre os pacotes.
-i intervalo
Esperar o intervalo em segundos especificado entre cada pacote enviado. O padrão é esperar um segundo entre cada datagrama, ou não esperar no modo flood. Somente o usuário root pode ajustar o intervalo para valores menores que 0,2 segundos.
-I endereço
Ajustar o endereço de envio para o endereço especificado.
-Q tos
Ajustar os bits relacionados a Qualidade do Serviço nos datagramas ICMP, em formato decimal ou hexadecimal. Valores comuns são: 0x02 para Custo Mínimo, 0x04 para Confiabilidade, 0x08 para Throughput, 0x10 para Baixo Delay
-q
Saída silenciosa. Nada é mostrado exceto as linhas de sumário no início e no final do envio dos pacotes.
-R
Registro de rota. Inclui a opção RECORD ROUTE no pacote Echo Request e mostra o buffer de rotas nos pacotes retornados. No cabeçalho IP so há espaço para o registro de nove rotas. Muitos hosts ignoram ou descartam essa opção.
-s tamanho_pacote
Especifica o número de bytes de dados que serão enviados (tamanho_pacote). O padrão no Linux é 56, o que resulta em 64 bytes de dados ICMP quando combinados com os 8 bytes de dados do cabeçalho ICMP.
-t ttl
Configurar o TTL (Time to Live) do pacote IP.
-M estratégia
Selecionar a estratégia a ser usada na descoberta do caminho MTU. A estratégia pode ser do (proibir fragmentação, mesmo local), want (realizar descoberta PMTU, e fragmentar localmente quando o pacote for muito grande) ou dont (não configurar a flag DF).
-w deadline
Especificar um timeout, em segundos, antes do ping encerrar o envio de pacotes, independente de quantos pacotes foram enviados ou recebidos.

Exemplos

1. Enviar 8 pacotes de ping para o endereço 192.168.1.1 e sair:

# ping -c 8 192.168.1.1

Ping com contagem no Linux Debian

2.  Enviar 20 pacotes de ping para o endereço 192.168.1.1, com saída silenciosa:

# ping -c 20 -q 192.168.1.1

Ping silencioso no Linux Debian

3. Enviar dois pacotes com tamanho de 100 bytes cada:

# ping -c 2 -s 100 192.168.1.1

Ping com tamanho de pacote ajustado no Linux

4. Enviar pacotes por 4 segundos antes de encerrar. Como o tempo padrão entre cada pacote é de 1 segundo, espera-se que 4 pacotes sejam enviados e recebidos:

# ping -w 4 192.168.1.1

Ping com deadline de 4 segundos no Linux Mint

5. Enviar 16 pacotes, com intervalo de 0,5 segundo entre cada um:

# ping -c 16 -i 0.5 192.168.1.1

Ping com intervalo de meio segundo no Linux Fedora

6. Enviar pacotes de flood ping por 5 segundos:

# ping -f -w 5 192.168.1.1

Enviando flood ping no linux centos

Note que com a opção de flood (-f), 2896 pacotes foram enviados em apenas 5 segundos.

Vimos neste artigo o funcionamento do programa ping, com vários exemplos de sua utilização. Trataremos no próximo artigo de um outro comando que faz uso de pacotes ICMP, o traceroute (ou tracert).

Sobre Fábio dos Reis (1221 Artigos)
Fábio dos Reis trabalha com tecnologias variadas há mais de 30 anos, tendo atuado nos campos de Eletrônica, Telecomunicações, Programação de Computadores e Redes de Dados. É um entusiasta de Ciência e Tecnologia em geral, adora Viagens e Música, e estuda idiomas, além de ministrar cursos e palestras sobre diversas tecnologias em São Paulo e outras cidades do Brasil.

2 Comentários em Curso de Redes – Como funciona o programa ping

  1. Danilo Arantes // 17/09/2015 em 21:48 // Responder

    Excelente artigo Fábio!

Escreva um comentário

Seu e-mail não será divulgado


*