Teoricamente o tamanho do pacote IP pode variar até o limite máximo de 64 KB dependendo da carga útil e das opções incluídas. Todavia, no caminho até seu destino um pacote pode atravessar diferentes tipos de redes. As redes são heterogêneas admitindo diferentes tamanhos de quadros (frames). Então, na prática, o tamanho máximo do pacote IP também é definido em função do hardware de rede por onde o pacote irá transitar. O tamanho máximo que um quadro pode ter é chamado de MTU - Maximum Transmission Unit - Unidade Máxima de Transmissão. Cada padrão de rede irá possuir um valor de MTU diferente.
Quando um pacote, de certo tamanho, necessita atravessar uma rede que lida somente com pacotes de menor tamanho é necessário dividir a carga do pacote em vários quadros, adequados ao tamanho da MTU dessa rede. O processo de adequar a carga do pacote IP ao tamanho da MTU é chamado de fragmentação de pacotes. Em alguns textos a fragmentação de pacotes é definida como segmentação. O conceito é o mesmo, mas se tratando do protocolo IP, prefira o termo fragmentação.
A princípio, um pacote é encaminhado e entregue com o mesmo tamanho que foi gerado na origem (fragmentação local). Mas, como a rota até o destino é uma escolha do roteador, um pacote pode seguir por uma rede que necessite de mais fragmentação (fragmentação na Inter-rede). A fragmentação que ocorre na inter-rede é invisível para o módulo IP do host que enviou o pacote. Caso um pacote seja fragmentado, transmitido e remontado entre dois roteadores o módulo IP não será informado disto.
Assim, havendo necessidade de fragmentação na inter-rede os roteadores poderão fazê-la, já que atuam na camada de rede do modelo TCP/IP. Neste caso, os roteadores ficam obrigados a remontar os pacotes antes de entregá-los ao destino. A fragmentação da inter-rede é chamada de fragmentação transparente.
A fragmentação de pacotes que acontece no módulo IP é chamada de não-transparente. Isso significa que o IP pode enviar tanto fragmentos de pacotes quanto pacotes sem fragmentação. Na prática, isso significa também que cada roteador receberá e transmitirá tanto pacotes completos, adequados ao tamanho da MTU, quanto fragmentos de pacotes ajustados a MTU. Tecnicamente um fragmento é apenas um pacote idêntico aos demais. Na fragmentação não-transparente o protocolo IP é "consciente" de que ocorreu fragmentação no encaminhamento, sendo também responsável pela remontagem dos fragmentos no destino.
Para tanto, o protocolo IP fornece alguns campos que garantem que os pacotes fragmentados sejam montados corretamente. Os campos que estão diretamente envolvidos na operação de fragmentação e remontagem de pacotes são: Identification, Fragment Offset e os sinalizadores binários Don't Fragment e More Fragment.
Havendo necessidade de fragmentação um mecanismo de fragmentação será usado para criar os fragmentos. Por exemplo, suponha um pacote que será fragmentado em dois fragmentos. Esse processo ocorre do seguinte modo: basicamente são criados dois novos datagramas, o conteúdo do cabeçalho do datagrama original é copiado para os cabeçalhos dos novos datagramas. Os campos identificação, endereço de origem e destino e o número do protocolo de transporte (para o qual a carga útil será entregue) permanecem inalterados independente do número de fragmentos.
A carga útil do datagrama original é dividida em blocos de oito octetos (64 bits). Cada fragmento poderá carregar múltiplos blocos de 64 bits, limitados ao tamanho da MTU. Teoricamente um único pacote com 64 KB poderia ser dividido em até 8.192 fragmentos com 64 bits cada.
Entretanto, como os valores de MTU são superiores ao tamanho mínimo do fragmento dificilmente esse número de fragmentos é alcançado. O último fragmento não necessita ter uma carga útil múltipla de 8 bytes.
Por exemplo, suponha um pacote com 113 bytes que será encaminhado em dois fragmentos. O primeiro fragmento terá 56 bytes enquanto o último terá 57.
Este processo ocorrerá da seguinte maneira: a primeira porção dos dados (56 bytes) é inserida no primeiro fragmento, o campo Total Lenght é ajustado para o novo tamanho do datagrama, enquanto o sinalizador MF - More Fragment - é configurado em 1 então o fragmento é enviado.
A porção restante dos dados (57 bytes) é inserida no segundo fragmento, o campo Total Lenght é ajustado. O sinalizador MF permanece inalterado (zero), indicando que este é o último fragmento do pacote.
O campo Fragment Offset do primeiro pacote é configurado como zero. No segundo fragmento o valor de Fragment Offset será o valor do Fragment Offset do pacote anterior (0) somado ao valor do NFB - Number of Fragment Block - Número de Blocos dos Fragmentos (7). Neste exemplo, o valor do NFB é 7, pois a cada fragmento foram enviados sete bytes de carga útil (exceto no último que serão enviados oito bytes). O NFB é um índice utilizado para remontar o pacote.
A importância da fragmentação, é que ela torna as redes mais homogêneas. Entretanto, fragmentação gera um maior volume de tráfego (overhead) na rede, pois multiplica cabeçalhos e gera um número maior de pacotes para serem tratados por um roteador. O gerenciamento da fragmentação pode ser necessário nos casos em que seja observada uma sobrecarga de carga em relação à largura de banda da rede.
Além disto, fragmentação mal gerenciada pode ser um ponto de vulnerabilidade na segurança da rede. Diversos ataques a segurança das redes utilizam a fragmentação para serem realizados. São exemplos de ataques de fragmentação: o ataque de pequenos fragmentos e o ataque de sobreposição de fragmentos. A filtragem de fragmentos por um filtro de pacotes, como Iptables, pode ser importante para a segurança do sistema, veja a RFC 1858 para mais informações sobre ataques que usam fragmentação.
[1] Comentário enviado por roberto_espreto em 02/06/2008 - 12:37h
Cara, muito legal seu artigo! Ainda não tive tempo de ler adequadamente, mas assim que possível irei!
Tanembaum é de tirar o chapéu!
Um autor que gosto muito tbm é o Kurose e o Douglas Comer!
Continue com seus artigos assim!