"Um especialista em resolver problemas deve ser dotado de duas qualidades incompatíveis:uma imaginação inquieta e uma paciente obstinação."
Howard W. Eves
Entenda o que são ICMP, ping e traceroute PDF Imprimir E-mail
Avaliação do Usuário: / 103
PiorMelhor 
Escrito por hlbog   
Dom, 14 de Março de 2004 08:26
Saiba em detalhes neste artigo como o traceroute determina a rota entre dois pontos. Aprenda conceitos do protocolo ICMP e seus principais utilitários, o ping e o traceroute.

Entenda o que são ICMP, ping e traceroute

Autor: Hélder Garcia
Março de 2004

 

O ICMP - Internet Control Message Protocol - é um protocolo que faz parte da pilha TCP/IP, enquadrando-se na camada de rede (nível 3), a mesma camada do protocolo IP - Internet Protocol. O seu uso mais comum é feito pelos utilitários ping e traceroute. O ping evia pacotes ICMP para verificar se um determinado host está disponível na rede. O traceroute faz uso do envio de diversos pacotes UDP ou ICMP e, através de um pequeno truque, determina a rota seguida para alcançar um host.

Este artigo descreve as interações entre cliente e servidor implementadas por estes dois utilitários.

Ping

Quando queremos determinar se um determinado host está disponível na rede interna ou mesmo na Internet, frequentemente utilizamos o utilitário ping como um dos primeiros recursos de troubleshooting. O fato de um host não responder ao ping não quer dizer que ele esteja realmente fora da rede, pois este serviço pode estar desabilitado neste host por questões de segurança. O comando, provavelmente já conhecido pelo leitor, é:

ping <host>

Exemplo:

[root@malkovich linux-2.6.3]# ping 192.168.0.1
PING 192.168.0.1 (192.168.0.1) 56(84) bytes of data.
64 bytes from 192.168.0.1: icmp_seq=1 ttl=127 time=4.22 ms
64 bytes from 192.168.0.1: icmp_seq=2 ttl=127 time=1.02 ms
64 bytes from 192.168.0.1: icmp_seq=3 ttl=127 time=1.01 ms
64 bytes from 192.168.0.1: icmp_seq=4 ttl=127 time=1.99 ms
64 bytes from 192.168.0.1: icmp_seq=5 ttl=127 time=1.03 ms
--- 192.168.0.1 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4002ms
rtt min/avg/max/mdev = 1.019/1.857/4.221/1.241 ms

A resposta acima indica que o host 192.168.0.1 está disponível. No final algumas estatísticas de tempo e percentual de respostas positivas e negativas são apresentadas.

No exemplo seguinte vemos um caso em que não obtemos resposta do host.

[root@malkovich linux-2.6.3]# ping 192.168.0.2
PING 192.168.0.2 (192.168.0.2) 56(84) bytes of data.
--- 192.168.0.2 ping statistics ---
5 packets transmitted, 0 received, 100% packet loss, time 3998ms

É chamado de cliente o host que inicia a comunicação, ou seja, a partir do qual o usuário executa o comando de teste de disponibilidade. Servidor é o alvo do teste, pois este deve possuir um serviço habilitado para ser capaz de receber o pacote do cliente e respondê-lo.

O cliente envia primeiro um pacote do tipo ICMP Echo Request, ou simplesmente ICMP Echo. Abaixo está a captura deste pacote na rede. Note o tipo do protocolo no cabeçalho IP (ICMP) e o tipo do pacote no cabeçalho ICMP (Echo request).

Internet Protocol, Src Addr: 192.168.0.2 (192.168.0.2), Dst Addr: 192.168.0.1 (192.168.0.1)
Version: 4
Header length: 20 bytes
Differentiated Services Field: 0x00 (DSCP 0x00: Default; ECN: 0x00)
Total Length: 84
Identification: 0x0000 (0)
Flags: 0x04
Fragment offset: 0
Time to live: 64

Protocol: ICMP (0x01)
Header checksum: 0xb955 (correct)
Source: 192.168.0.2 (192.168.0.2)
Destination: 192.168.0.1 (192.168.0.1)
Internet Control Message Protocol

Type: 8 (Echo (ping) request)
Code: 0
Checksum: 0x5905 (correct)
Identifier: 0x9409
Sequence number: 0x0001
Data (56 bytes)

Quando o servidor recebe este pacote ele responde com um pacote do tipo ICMP Echo Reply. Veja abaixo a captura deste pacote.

Internet Protocol, Src Addr: 192.168.0.1 (192.168.0.1), Dst Addr: 192.168.0.2 (192.168.0.2)
Version: 4
Header length: 20 bytes
Differentiated Services Field: 0x00 (DSCP 0x00: Default; ECN: 0x00)
Total Length: 84
Identification: 0xa078 (41080)
Flags: 0x00
Fragment offset: 0
Time to live: 127

Protocol: ICMP (0x01)
Header checksum: 0x19dd (correct)
Source: 192.168.0.1 (192.168.0.1)
Destination: 192.168.0.2 (192.168.0.2)
Internet Control Message Protocol

Type: 0 (Echo (ping) reply)
Code: 0
Checksum: 0x6105 (correct)
Identifier: 0x9409
Sequence number: 0x0001
Data (56 bytes)

Este processo se repete até que o usuário cancele o ping com um <CONTROL><C>. O utilitário então calcula as estatísticas e as exibe na tela. O usuário também pode controlar, através de opções do comando, quantos pacotes devem ser enviados, o intervalo de tempo entre eles, e o tamanho do pacote. Na verdade a área de dados do pacote não carrega nenhuma informação útil, entretanto, pode ser aumentada para testar a rede com pacotes de tamanhos diferentes. Existe atualmente um limite para o tamanho do pacote, pois um pacote muito grande pode provocar o reboot de alguns sistemas Windows, sendo este o conhecido ping of death, ou ping da morte.

Traceroute

Um dos campos do cabeçalho IP é chamado TTL - Time to Live - e determina por quantas passagens em roteadores este pacote pode sobreviver. A cada passagem em um roteador ou host este campo é decrementado de 1. Este mecanismo é utilizado para evitar que pacotes percorram a rede eternamente, rodando de um lado para outro. Verifique acima que o nosso pacote de ICMP Echo Request possui um TTL igual a 64. Se um pacote possui um TTL de 1 e este deve passar por um roteador antes de alcançar o seu destino final, este roteador irá descartá-lo ao verificar o TTL do pacote e retornar um pacote ICMP do tipo ICMP Time Exceeded para o host que o enviou. Neste pacote de resposta o roteador se identifica como origem da mensagem Time Exceeded. É nessa característica do protocolo que o utilitário traceroute se baseia para traçar uma rota entre dois pontos da rede.

Suponha que o host 1 esteja separado do host 2 por dois roteadores, chamados router A e router B. A partir do host 1 é executado um traceroute para o host 2. O utilitário cria um pacote UDP destinado ao host 2, mas configura o seu TTL para 1. O router A recebe este pacote e, apesar de saber para onde rotear o pacote, ao decrementar o TTL este torna-se 0 (zero) o que siginifica que este pacote deve ser descartado, retornando um ICMP Time Exceeded para o host 1. Quando o traceroute recebe esta resposta ele tem o endereço do primeiro roteador no caminho entre os dois hosts. O primeiro roteador é mostrado para o usuário.

Em seguida, o traceroute cria outro pacote UDP, com o TTL de 2. O pacote sobrevive ao primeiro roteador mas é descartado no segundo. Quando recebe o ICMP Time Exceeded do segundo roteador temos o endereço dele, que também é mostrado na saída do traceroute. O passo seguinte é um pacote com TTL de 3 o qual alcança o host 2. Os pacotes UDP são sempre enviados com uma porta de destino inválida, o que força que o host 2, ao receber o pacote, retorne um pacote ICMP Destination Unreachable. O traceroute sabe então que o caminho completo foi descoberto e mostra ao usuário o endereço do host 2, indicando que o trace foi finalizado.

Como ilustração, executei um traceroute do IP 192.168.1.2 (host virtual A) para o IP 192.168.0.1 (host C). Como roteador entre essas duas máquinas está um Linux (host B) com os IP 192.168.1.1 e 192.168.0.2. Portanto, o caminho do pacote deve ser A <-> B <-> C. O comando foi executado a partir de A:

[root@malkovich root]# traceroute -q 1 192.168.0.1
traceroute to 192.168.0.1 (192.168.0.1), 30 hops max, 38 byte packets
1 192.168.1.1 (192.168.1.1) 8.243 ms
2 192.168.0.1 (192.168.0.1) 12.298 ms
3 192.168.0.1 (192.168.0.1) 21.193 ms

A opção -q 1 é para que o traceroute envie apenas um pacote a cada interação, o default são 3. A opção -I também poderia ser usada para instruir que sejam usados pacotes ICMP Echo Request e não pacotes UDP.

A sequência de troca de pacotes é a seguinte:

Seq Source --> Destination Protocol Description
1 192.168.1.2 --> 192.168.0.1 UDP Source Port: 33406 Destination Port: 33435 (TTL=1)
2 192.168.1.1 --> 192.168.1.2 ICMP Time-to-live exceeded
3 192.168.1.2 --> 192.168.0.1 UDP Source Port: 33406 Destination Port: 33436 (TTL=2)
4 192.168.0.1 --> 192.168.1.2 ICMP Time-to-live exceeded
5 192.168.0.1 --> 192.168.1.2 ICMP Destination unreachable
6 192.168.1.2 --> 192.168.0.1 UDP Source Port: 33406 Destination Port: 33437 (TTL=3)
7 192.168.0.1 --> 192.168.1.2 ICMP Destination unreachable

É mostrado abaixo o primeiro pacote enviado pelo host A e descartado pelo roteador B.

Internet Protocol, Src Addr: 192.168.1.2 (192.168.1.2), Dst Addr: 192.168.0.1 (192.168.0.1)
Version: 4
Header length: 20 bytes
Differentiated Services Field: 0x00 (DSCP 0x00: Default; ECN: 0x00)
Total Length: 38
Identification: 0x827f (33407)
Flags: 0x00
Fragment offset: 0

Time to live: 1
Protocol: UDP (0x11)
Header checksum: 0xb4f4 (correct)
Source: 192.168.1.2 (192.168.1.2)
Destination: 192.168.0.1 (192.168.0.1)
User Datagram Protocol, Src Port: 33406 (33406), Dst Port: 33435 (33435)
Source port: 33406 (33406)

Destination port: 33435 (33435)
Length: 18
Checksum: 0xa29f (correct)
Data (10 bytes)

Note o TTL 1 e a porta de destino. A esse pacote o roteador B responde:

Internet Protocol, Src Addr: 192.168.1.1 (192.168.1.1), Dst Addr: 192.168.1.2 (192.168.1.2)
Internet Control Message Protocol

Type: 11 (Time-to-live exceeded)
Code: 0 (Time to live exceeded in transit)
Checksum: 0x7777 (correct)
Internet Protocol, Src Addr: 192.168.1.2 (192.168.1.2), Dst Addr: 192.168.0.1 (192.168.0.1)
User Datagram Protocol, Src Port: 33406 (33406), Dst Port: 33435 (33435)
Data (10 bytes)

Podemos confirmar o ICMP Time Exceeded aqui. Após a interação seguinte, o pacote chega ao destino. Como é uma porta inválida, o host 192.168.0.1 responde com um ICMP Destination Unreachable:

Internet Protocol, Src Addr: 192.168.0.1 (192.168.0.1), Dst Addr: 192.168.1.2 (192.168.1.2)
Internet Control Message Protocol

Type: 3 (Destination unreachable)
Code: 3 (Port unreachable)

Checksum: 0x48b6 (correct)
Internet Protocol, Src Addr: 192.168.1.2 (192.168.1.2), Dst Addr: 192.168.0.1 (192.168.0.1)
User Datagram Protocol, Src Port: 33406 (33406), Dst Port: 33436 (33436)

Veja que já no passo 5 há uma resposta de ICMP Destination Unreachable, como resposta ao pacote do passo 3, com TTL igual a 2. Entretanto, mesmo assim o traceroute inicia outra interação, enviando um pacote com TTL igual a 3. Isso aconteceu porque antes do ICMP Destination Unreachable ele recebeu, no passo 4, um ICMP Time Exceeded, o que gerou o envio imediato do terceiro pacote UDP.

Pode ser interessante, para quem tem habilidades de programação, olhar o código fonte de uma implementação do traceroute.


-- Hélder Garcia
Email: Este endereço de e-mail está protegido contra SpamBots. Você precisa ter o JavaScript habilitado para vê-lo.
http://www.sounerd.com.br


Última atualizacao: Ter, 01 de Abril de 2008 09:53
 
Comments (13)
Parabéns...
1 Ter, 01 de Abril de 2008 09:32
Breno A.C.F.
Muito bom seu artigo...
Abraços
Congratulações
2 Ter, 10 de Junho de 2008 09:10
Higo Matos
Esclarecedor, parabéns.
Dúvida sobre ping, tracerout
3 Qui, 06 de Novembro de 2008 10:19
Francisco Rocha
Envio este email agradecendo por estas informações muito boas que acabei de ler aqui. Tirou completamente minhas dúvidas.

Abraços.
Muito bom
4 Qui, 26 de Fevereiro de 2009 15:44
Jonatan
Muito bom!
Obs.: na terceira linha está faltando a letra 'n' em envia :
....O ping evia pacotes ...
otimo
5 Seg, 30 de Março de 2009 22:36
felipe
muito bom

flw's
Esclarecedor.
6 Qui, 16 de Abril de 2009 15:06
Karina
Realmente muito bom e claro...
Valew....
Muito útil
7 Qui, 18 de Junho de 2009 12:24
Filipe SR
parabens... exelente explicaçao!!
Pequeno erro
8 Seg, 03 de Agosto de 2009 15:02
Alexandre!
Prezado, muito bom o seu artigo, mas ele possui um pequeno erro: o pacote gerado pelo tracert é ICMP e não UDP
Re: Pequeno erro
9 Seg, 03 de Agosto de 2009 15:14
Helder Garcia
Olá Alexandre,

Obrigado pelo feedback. O tracert é o utilitário do Windows. Realmente não sei como ele trabalha. Mas no artigo eu cito o traceroute, que trabalha com UDP por default.

http://linux.die.net/man/8/traceroute
Dr
10 Seg, 31 de Maio de 2010 13:53
Manul
Envio este email agradecendo por estas informações muito boas que acabei de ler aqui. Tirou completamente minhas dúvidas.
Giochi di auto
Excelente
11 Sex, 13 de Agosto de 2010 11:30
Dumaster
Excelente artigo , parabens !!!!
good
12 Qui, 26 de Agosto de 2010 23:54
Susancai
Thanks to this post, we can have a good understanding. classified |ads|s-cape adjustable bed
nice post
13 Ter, 31 de Agosto de 2010 11:12
Sue12
Thanks for the post, the tips are very helpfull.
holiday villa

Add your comment

Your name:
Título:
Comment (you may use HTML tags here):
  The word for verification. Lowercase letters only with no spaces.
Word verification:
 
TotalUsers 1.5
Resumo de Conteúdo:
Artigos/Notícias:556
Web Links:134
Hits:1198075
Usuários:
1924 registrados
0 hoje
0 esta semana
0 este mes
Ultimo:nonaraw
Investidor Legal
Template by SEO-Templates