02 - IHL (Tamanho do Cabeçalho)
video: https://youtu.be/... no frontmatter da nota.Campo IHL (Internet Header Length) do Cabeçalho IPv4
1. Definição e Localização
O campo IHL (Internet Header Length) é um componente crítico localizado nos segundos 4 bits do primeiro byte do cabeçalho IPv4. Sua função é indicar o tamanho total do cabeçalho IP, permitindo que o receptor saiba exatamente onde os dados de controle terminam e onde a carga útil (payload) dos dados começa.
Embora pareça simples, o IHL introduz uma nuance importante na arquitetura do IPv4: o cabeçalho não é de tamanho fixo. A presença deste campo é necessária porque o protocolo permite a inclusão de Opções (Options) extras. Se não houvesse opções, o cabeçalho teria sempre 20 bytes, e este campo seria desnecessário (como ocorre no IPv6, que possui cabeçalho fixo).
Características Formais
- Tamanho: 4 bits (half-byte / nibble)
- Posição no cabeçalho: Bits 4-7 do primeiro byte
- Unidade: Palavras de 32 bits (4 bytes)
- RFC de referência: RFC 791 (1981)
2. Unidade de Medida: Palavras de 32 Bits
A característica técnica mais distintiva do IHL é que ele não mede o tamanho do cabeçalho em bytes, mas sim em palavras de 32 bits (também conhecidas como words ou double-words).
- 1 Palavra (Word) = 4 Bytes (32 bits).
- O cabeçalho IPv4 foi projetado para ser alinhado em limites de 32 bits para facilitar o processamento pelos roteadores e processadores da época (anos 1980), que tinham registradores de 32 bits.
Devido a essa definição, o cálculo para determinar o tamanho real do cabeçalho em bytes é:
Tamanho do Cabeçalho (bytes) = Valor do IHL × 4
Tabela de Conversão
| Valor IHL | Tamanho (bytes) | Cenário |
|---|---|---|
| 5 | 20 | Mínimo permitido (sem Options) |
| 6 | 24 | 4 bytes de Options |
| 7 | 28 | 8 bytes de Options |
| 8 | 32 | 12 bytes de Options |
| ... | ... | ... |
| 15 | 60 | Máximo (40 bytes de Options) |
Por exemplo, se o valor do IHL for 5 (binário 0101), o tamanho do cabeçalho é 5 × 4 = 20 bytes.
3. Faixa de Valores e Limites
Como o campo IHL possui apenas 4 bits, ele pode representar valores decimais de 0 a 15. No entanto, existem restrições práticas impostas pela estrutura mínima do protocolo:
Valor Mínimo (5)
O cabeçalho IPv4 padrão, sem nenhuma opção adicional, tem 20 bytes. Portanto, o menor valor permitido para o IHL é 5. Se um receptor receber um datagrama com IHL menor que 5, ele é considerado inválido e geralmente é descartado, pois não contém informações suficientes para ser processado.
Valor Máximo (15)
O maior valor possível é 15. Isso resulta em um tamanho máximo de cabeçalho de 15 × 4 = 60 bytes.
Espaço para Opções
Como o cabeçalho fixo ocupa 20 bytes (IHL=5), o espaço máximo disponível para o campo de Options é de 40 bytes (60 bytes totais - 20 bytes fixos).
| Cenário | IHL | Tamanho Total | Espaço p/ Options |
|---|---|---|---|
| Mínimo (sem Options) | 5 | 20 bytes | 0 bytes |
| Com Record Route | 6 | 24 bytes | 4 bytes |
| Com Timestamp | 8 | 32 bytes | 12 bytes |
| Com LSRR/SSRR | 8 | 32 bytes | 12 bytes |
| Máximo (40 bytes Options) | 15 | 60 bytes | 40 bytes |
4. O Papel do IHL no Parsing (Análise) do Pacote
Quando um host ou roteador recebe um datagrama IP, a primeira coisa que ele faz é ler o primeiro byte do cabeçalho. Os primeiros 4 bits indicam a versão (IPv4), e os 4 próximos bits indicam o IHL.
Fluxo de Processamento
- O sistema lê o valor do IHL no primeiro byte.
- Multiplica por 4 para obter o tamanho em bytes.
- O sistema avança esse número de bytes a partir do início do pacote.
- Tudo o que estiver antes desse ponto é tratado como Cabeçalho IP (incluindo quaisquer Opções).
- O byte imediatamente após esse ponto é o início do Payload (ex: o cabeçalho TCP ou UDP).
Sem o IHL, o sistema não saberia distinguir onde um campo de opção complexo termina e onde o dado real do usuário começa, levando a corrupção total na leitura da mensagem.
5. O Primeiro Byte Composto
É importante notar visualmente como o Version e o IHL coexistem no primeiro byte do pacote. Se olharmos para um valor hexadecimal comum no início de um pacote IPv4, como 0x45:
- 4 (primeiro dígito hexadecimal, ou
0100em binário): Version = 4 (IPv4). - 5 (segundo dígito hexadecimal, ou
0101em binário): IHL = 5 (Cabeçalho de 20 bytes).
Tabela de Combinações Comuns
| Byte Hex | Version | IHL | Tamanho | Descrição |
|---|---|---|---|---|
| 0x45 | 4 | 5 | 20 bytes | IPv4 sem Options |
| 0x46 | 4 | 6 | 24 bytes | IPv4 com 4 bytes Options |
| 0x47 | 4 | 7 | 28 bytes | IPv4 com 8 bytes Options |
| 0x4F | 4 | 15 | 60 bytes | IPv4 com 40 bytes Options (máximo) |
| 0x60 | 6 | 0 | - | IPv6 (formato diferente) |
Se o cabeçalho tivesse opções, o primeiro byte poderia ser algo como 0x46 (IHL=6, 24 bytes), 0x47 (IHL=7, 28 bytes), até um máximo teórico de 0x4F (IHL=15, 60 bytes).
6. Padding (Preenchimento)
Como o IHL exige que o tamanho do cabeçalho seja um múltiplo inteiro de 4 bytes, se as opções adicionadas não preencherem exatamente esse múltiplo, é necessário adicionar bytes extras de preenchimento (padding) ao final do campo de opções.
- O padding geralmente consiste em bytes com valor 0 (NOP - No Operation, ou END).
- O objetivo é garantir que o próximo campo após o cabeçalho (o payload) comece exatamente em um limite de 32 bits, mantendo o alinhamento de memória otimizado para o processamento.
- O valor do IHL já contabiliza esse padding.
Exemplo de Padding
Se uma opção ocupa 7 bytes (não múltiplo de 4), adiciona-se 1 byte de padding (NOP, tipo 0x01) para chegar a 8 bytes. O IHL seria então 5 + 8/4 = 7 (cabeçalho de 28 bytes).
7. Tipos de Options Mais Comuns
O campo Options é raramente usado na prática moderna, mas existe em situações específicas:
| Opção | Tipo | Função | Tamanho Típico |
|---|---|---|---|
| END of Options List | 0 | Marca fim das opções | 1 byte |
| NOP (No Operation) | 1 | Padding/alinhamento | 1 byte |
| LSRR (Loose Source Route) | 131 | Rota de origem flexível | Variável |
| SSRR (Strict Source Route) | 137 | Rota de origem estrita | Variável |
| Record Route | 7 | Registra rota percorrida | Variável |
| Timestamp | 68 | Registra timestamps dos hops | Variável |
8. Diferença Crucial em Relação ao IPv6
O IPv6 abandonou o conceito de IHL e Options variáveis. Em vez disso:
- Cabeçalho fixo de 40 bytes sempre.
- Sem campo IHL (offset do payload é fixo e conhecido).
- Opções ficam em Extension Headers encadeados, processados separadamente.
Isso torna o roteamento IPv6 mais eficiente: roteadores intermediários não precisam processar opções complexas, apenas encaminhar baseado no endereço destino.
9. Detecção de Pacotes Malformados
Roteadores e firewalls validam o IHL para evitar abusos:
- IHL < 5: Pacote descartado (cabeçalho mínimo violado).
- IHL × 4 > Total Length do IP: Pacote descartado (inconsistência).
- IHL × 4 = Total Length: Payload vazio (válido em alguns casos, suspeito em outros).
Ferramentas como Scapy permitem criar pacotes com IHL inválido para testes de IDS/firewall:
from scapy.all import *
# Pacote com IHL inválido (= 2)
pkt = IP()/TCP()
pkt.ihl = 2 # 8 bytes - inválido!
send(pkt)
10. Resumo Técnico
| Atributo | Valor |
|---|---|
| Tamanho do campo | 4 bits |
| Posição | Bits 4-7 do primeiro byte |
| Unidade | Palavras de 32 bits |
| Valor mínimo | 5 (20 bytes) |
| Valor máximo | 15 (60 bytes) |
| Espaço para Options | Até 40 bytes |
| RFC | 791 (1981) |
| Substituído em IPv6? | Sim (cabeçalho fixo) |
11. Conclusão
O campo IHL é um excelente exemplo de design de protocolo que equilibra flexibilidade (cabeçalho variável) com eficiência (alinhamento de 32 bits). Embora seu uso prático tenha diminuído com a obsolescência das Options no IPv4 moderno, sua presença é fundamental para a correta interpretação de qualquer pacote IPv4. Para engenheiros de rede que realizam análise de pacotes (com tcpdump, Wireshark ou Scapy), entender o IHL é pré-requisito para identificar anomalias e decodificar tráfego legítimo com Options ativas, especialmente em ambientes de rede legados ou militares.