# Internet Control Message Protocol

ICMP, sigla para o inglês Internet Control Message Protocol (em português, Protocolo de Mensagens de Controle da Internet), é um protocolo integrante do Protocolo IP, definido pelo RFC 792, é utilizado para comunicar informações da camada de rede, sendo o uso mais comum para fornecer relatórios de erros à fonte original. Qualquer computador que utilize IP precisa aceitar as mensagens ICMP e alterar o seu comportamento de acordo com o erro relatado. Os gateways devem estar programados para enviar mensagens ICMP quando receberem datagramas que provoquem algum erro.
As mensagens ICMP geralmente são enviadas automaticamente em uma das seguintes situações:
* Um pacote IP não consegue chegar ao seu destino (i.e. Tempo de vida do pacote expirado)
* O Gateway não consegue retransmitir os pacotes na frequência adequada (i.e. Gateway congestionado)
* O Roteador ou Encaminhador indica uma rota melhor para a máquina a enviar pacotes.
Ferramentas comumente usadas em Windows baseadas nesse protocolo são: Ping e Traceroute.

## Frames ICMP (1)

* Echo Request / Reply Mensagens para funções de teste e controle da rede, caso a maquina esteja ligada ira responder com um reply e se estiver inalcançavel request; Usadas pelo comando PING
* Destination Unreachable Enviado por um router que deixa fora um Datagrama;
Tipo de mensagem que é obtida quando não se consegue localizar o equipamento alvo; (nem todos os datagramas perdidos são detectados)
* CODE - Indica a razão da perda do datagrama
* Timestamp Request / Reply Mensagens para sincronização dos relógios das máquinas

## Estrutura de um datagrama ICMP

Os pacotes ICMP são encapsulados dentro de datagramas IPv4 composto pelas secções cabeçalho (header) e dados.

### Cabeçalho (Header)

Este começa no final do cabeçalho IPv4 e é constituído por 8 bytes.

#### Tipo (Type)

O tipo de mensagem ICMP, ver Mensagens de controle.

#### Código (Code)

O código (subtipo) da mensagem ICMP, ver Mensagens de controle.

#### Checksum (Soma de verificação)

Especificado em RFC 1071, é uma soma de verificação da integridade dos dados, calculado a partir do cabeçalho e dos dados do pacote ICMP.

#### Resto do cabeçalho (Rest of Header)

Um campo de 4 bytes, de conteúdo variado dependendo do tipo e código ICMP.
Formato de um cabeçalho ICMP :
| Offsets | Byte | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 3 | 3 | 3 | 3 | 3 | 3 | 3 | 3 |
| Byte | Bit | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 |
| 0 | 0 | Tipo | Tipo | Tipo | Tipo | Tipo | Tipo | Tipo | Tipo | Código | Código | Código | Código | Código | Código | Código | Código | Checksum | Checksum | Checksum | Checksum | Checksum | Checksum | Checksum | Checksum | Checksum | Checksum | Checksum | Checksum | Checksum | Checksum | Checksum | Checksum |
| 4 | 32 | Resto do Cabeçalho (Rest of Header) | Resto do Cabeçalho (Rest of Header) | Resto do Cabeçalho (Rest of Header) | Resto do Cabeçalho (Rest of Header) | Resto do Cabeçalho (Rest of Header) | Resto do Cabeçalho (Rest of Header) | Resto do Cabeçalho (Rest of Header) | Resto do Cabeçalho (Rest of Header) | Resto do Cabeçalho (Rest of Header) | Resto do Cabeçalho (Rest of Header) | Resto do Cabeçalho (Rest of Header) | Resto do Cabeçalho (Rest of Header) | Resto do Cabeçalho (Rest of Header) | Resto do Cabeçalho (Rest of Header) | Resto do Cabeçalho (Rest of Header) | Resto do Cabeçalho (Rest of Header) | Resto do Cabeçalho (Rest of Header) | Resto do Cabeçalho (Rest of Header) | Resto do Cabeçalho (Rest of Header) | Resto do Cabeçalho (Rest of Header) | Resto do Cabeçalho (Rest of Header) | Resto do Cabeçalho (Rest of Header) | Resto do Cabeçalho (Rest of Header) | Resto do Cabeçalho (Rest of Header) | Resto do Cabeçalho (Rest of Header) | Resto do Cabeçalho (Rest of Header) | Resto do Cabeçalho (Rest of Header) | Resto do Cabeçalho (Rest of Header) | Resto do Cabeçalho (Rest of Header) | Resto do Cabeçalho (Rest of Header) | Resto do Cabeçalho (Rest of Header) | Resto do Cabeçalho (Rest of Header) |

### Dados

O tamanho da secção dos dados de um pacote ICMP é variável. As mensagens de erro ICMP contêm uma cópia do cabeçalho IPv4 completo, bem como pelo menos 8 bytes dos dados provenientes do mesmo datagrama IPv4 que causou a mensagem de erro. O tamanho máximo de uma mensagem ICMP é de 576 bytes.

## Mensagens de controle

As mensagens de controle são identificadas pelo valor no campo tipo, o campo código fornece informação contextual adicional para a mesma. Desde a implementação do protocolo ICMP, algumas mensagens de controle foram postas em desuso.
Principais mensagens de controle :
| Tipo | Código | Estado | Descrição |
| 0 – Echo Reply$^{:14}$ | 0 | | Resposta Echo (usado para fazer ping) |
| 1 and 2 | | não atribuídos | Reservado |
| 3 – Destination Unreachable$^{:4}$ | 0 | | Rede de destino inacessível |
| 3 – Destination Unreachable$^{:4}$ | 1 | | Máquina de destino inacessível |
| 3 – Destination Unreachable$^{:4}$ | 2 | | Protocolo de destino inacessível |
| 3 – Destination Unreachable$^{:4}$ | 3 | | Porta de destino inacessível |
| 3 – Destination Unreachable$^{:4}$ | 4 | | Fragmentação necessária mas impossível devido à bandeira (flag) DF |
| 3 – Destination Unreachable$^{:4}$ | 5 | | Falha na rota de origem |
| 3 – Destination Unreachable$^{:4}$ | 6 | | Rede de destino desconhecida |
| 3 – Destination Unreachable$^{:4}$ | 7 | | Máquina de destino desconhecida |
| 3 – Destination Unreachable$^{:4}$ | 8 | | Source host isolated |
| 3 – Destination Unreachable$^{:4}$ | 9 | | Network administratively prohibited |
| 3 – Destination Unreachable$^{:4}$ | 10 | | Host administratively prohibited |
| 3 – Destination Unreachable$^{:4}$ | 11 | | Rede inacessível para ToS |
| 3 – Destination Unreachable$^{:4}$ | 12 | | Máquina inacessível para ToS |
| 3 – Destination Unreachable$^{:4}$ | 13 | | Communication administratively prohibited |
| 3 – Destination Unreachable$^{:4}$ | 14 | | Host Precedence Violation |
| 3 – Destination Unreachable$^{:4}$ | 15 | | Precedence cutoff in effect |
| 4 – Source Quench | 0 | deprecada | Source quench (congestion control) |
| 5 – Redirect Message | 0 | | Redirecionamento do datagrama para a rede. |
| 5 – Redirect Message | 1 | | Redirecionamento do datagrama para a máquina |
| 5 – Redirect Message | 2 | | Redirecionamento do datagrama para o ToS & rede |
| 5 – Redirect Message | 3 | | Redirecionamento do datagrama para o ToS & máquina |
| 6 | | deprecada | Alternate Host Address |
| 7 | | não atribuído | Reservado |
| 8 – Echo Request | 0 | | Echo request (used to ping) |
| 9 – Router Advertisement | 0 | | Router Advertisement |
| 10 – Router Solicitation | 0 | | Router discovery/selection/solicitation |
| 11 – Time Exceeded$^{:6}$ | 0 | | TTL expired in transit |
| 11 – Time Exceeded$^{:6}$ | 1 | | Fragment reassembly time exceeded |
| 12 – Parameter Problem: Bad IP header | 0 | | Pointer indicates the error |
| 12 – Parameter Problem: Bad IP header | 1 | | Opção obrigatória em falta |
| 12 – Parameter Problem: Bad IP header | 2 | | Bad length |
| 13 – Timestamp | 0 | | Timestamp |
| 14 – Timestamp Reply | 0 | | Timestamp reply |
| 15 – Information Request | 0 | deprecada | Information Request |
| 16 – Information Reply | 0 | deprecada | Information Reply |
| 17 – Address Mask Request | 0 | deprecada | Pedido da mascara do endereço |
| 18 – Address Mask Reply | 0 | deprecada | Resposta da mascara do endereço |
| 19 | | reserved | Reservada para segurança |
| 20 through 29 | | reservadas | Reserved for robustness experiment |
| 30 – Traceroute | 0 | deprecada | Information Request |
| 31 | | deprecada | Datagram Conversion Error |
| 32 | | deprecada | Mobile Host Redirect |
| 33 | | deprecada | Where-Are-You (originalmente destinado para IPv6) |
| 34 | | deprecada | Here-I-Am (originalmente destinado para IPv6) |
| 35 | | deprecada | Mobile Registration Request |
| 36 | | deprecada | Mobile Registration Reply |
| 37 | | deprecada | Domain Name Request |
| 38 | | deprecada | Domain Name Reply |
| 39 | | deprecada | SKIP Algorithm Discovery Protocol, Simple Key-Management for Internet Protocol |
| 40 | | | Photuris, Security failures |
| 41 | | experimental | ICMP for experimental mobility protocols such as Seamoby [RFC4065] |
| 42 – Extended Echo Request | 0 | | Sem erros |
| 43 – Extended Echo Reply | 0 | | Sem erros |
| 43 – Extended Echo Reply | 1 | | Pedido mal formado |
| 43 – Extended Echo Reply | 2 | | Interface desconhecida |
| 43 – Extended Echo Reply | 3 | | No Such Table Entry |
| 43 – Extended Echo Reply | 4 | | Múltiplas interfaces satisfazem o pedido |
| 44 through 252 | | não atribuídos | Reservado |
| 253 | | experimental | RFC3692-style Experiment 1 (RFC 4727) |
| 254 | | experimental | RFC3692-style Experiment 2 (RFC 4727) |
| 255 | | reservado | Reservado |