Fragmentação de Datagramas IP – Redes de Computadores
Fragmentação de Datagramas IP
Quando um roteador recebe um pacote, ele examina o endereço de destino e determina para qual interface deve encaminhar esse pacote, para que possa seguir seu caminho até o destino.
Além disso, o roteador também determina o MTU da interface a ser usada. Caso o tamanho do pacote seja maior do que o MTU, e o bit DF do campo Flags do cabeçalho esteja ajustado em 0, o roteador irá fragmentar o pacote.
O propósito da fragmentação de pacotes IP, realizada pelo protocolo IP, é portanto permitir que os datagramas possam ser transmitidos em links cujo MTU seja menor do que o tamanho original desses datagramas. Esse procedimento é descrito pela RFC 791.
Fragmentar o pacote significa dividir o pacote em unidades de menor tamanho, denominadas Fragmentos. O tamanho máximo de um fragmento é o tamanho da MTU menos o tamanho do cabeçalho IPv4, que pode variar de 20 a até 60 bytes. Cada fragmento será enviado pela rede em um pacote separado, e cada um desses pacotes seguirá as seguintes regras:
- O campo Tamanho Total será o tamanho do fragmento;
- O bit MF (more fragments) no campo Flags será configurado em 1 para todos os fragmentos exceto o último, que terá o valor 0 ajustado;
- O campo Offset do Fragmento será configurado (em 1), baseado no deslocamento do fragmento no campo de dados original, em unidades de blocos de oito bytes.
- O checksum do cabeçalho deve ser recalculado.
Assim, se tivermos um MTU de 1500 bytes e pacotes padrão com cabeçalho de 20 bytes, os offsets (deslocamentos) dos fragmentos serão múltiplos de (1500-20)/8 = 185, como por exemplo 0, 185, 370, etc.
Exemplo de fragmentação de datagramas IP
Vamos supor que um segmento da camada de transporte tenha um tamanho total de 4000 bytes, sem o uso de opções, e que esse segmento será enviado em pacotes IP de cabeçalho padrão de 20 bytes.
O tamanho total do pacote IP gerado teria então 4020 bytes (4000 + 20). Vamos assumir também um caso típico que é o do envio desse pacote por um link cujo MTU é de 1500 bytes – portanto, o pacote deverá ser fragmentado por exceder esse tamanho.
O pacote será fragmentado da seguinte forma:
Fragmento | Bytes totais | Bytes do cabeçalho | Bytes de Dados | Flag MF | Offset do fragmento |
1 | 1500 | 20 | 1480 | 1 | 0 |
2 | 1500 | 20 | 1480 | 1 | 185 |
3 | 1060 | 20 | 1040 | 0 | 370 |
O primeiro offset será igual a zero. O segundo offset será igual a 0 + (Bytes de Dados / 8) = 0 + 1480/8 = 185.
O terceiro offset será igual ao segundo offset (185) + (Bytes de dados / 8) = 185 + 1480 / 8 = 185 + 185 = 370.
A figura a seguir ilustra o exemplo de fragmentação apresentado:
Podemos recalcular o tamanho total do pacote a partir do offset do último fragmento e do tamanho em bytes de seus dados, da seguinte forma:
Tamanho total = offset x 8 + bytes de dados
Em nosso exemplo:
Tamanho total = 370 x 8 + 1040 = 2960 + 1040 = 4000 bytes.
Remontando os fragmentos
Quando os pacotes chegam a seu destino, eles devem ser remontados para que possam ser processados.
Um receptor sabe que um pacote é um fragmento caso o flag MF esteja ativo (exceto no último fragmento), e caso o campo Offset do Fragmento possua um valor diferente de zero (exceto para o primeiro fragmento).
O receptor então irá utilizar as informações presentes nos campos de endereços IP de origem e destino, identificação do protocolo e identificação do cabeçalho IP para reconstruir o pacote original a partir dos fragmentos recebidos.
Fragmentos que possuam a mesma identificação pertencem ao mesmo pacote, e o campo offset do fragmento permite ordenar esses fragmentos. Ao receber o último fragmento, que possui o flag MF igual a zero, o receptor pode então calcular o tamanho do campo de dados multiplicando o offset do último fragmento por 8, e adicionando o tamanho do último fragmento, como mostramos na seção anterior.
Neste ponto, o pacote remontado é enviado para a camada de nível superior na pilha de protocolos (camada de transporte) para processamento.
Anterior: Estrutura de um Pacote IPv4
Escreva um comentário