Bóson Treinamentos em Ciência e Tecnologia

Fragmentação de Datagramas IP – Redes de Computadores

Fragmentação de Datagramas IPv4 - 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:

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

Sair da versão mobile