El MTU (maximum transmission unit) es el máximo tamaño de un paquete de datos que se puede transferir en IP. Si el paquete completo tiene un tamaño mayor al MTU, se deberá fragmentar.
Los paquetes no son reensamblados en el camino, sino en el host de destino. Si se pierde un fragmento, IP descartará el paquete completo.
Los headers de IP tienen tres campos utilizados para la fragmentación:
- Identification: Es un número de 16 bits que identifica cada paquete, permite definir de qué paquete provienen los fragmentos
- Flags: Son tres bits, el primero no es utilizado, siempre valdrá cero.
- El segundo es el bit Do Not Fragment. Si vale uno, el paquete será descartado, si es necesario fragmentarlo
- El tercer bit es el More Fragments. Vale cero si es el último fragmento de un paquete.
- Fragment Offset: Número de 13 bits que determina la posición del primer bit del fragmento con relación al paquete completo. Debido a que tenemos 3 bits menos, la posición real se obtiene tras multiplicar el offset por . Debido a esto, el tamaño de payload de los fragmentos debe ser múltiplo de 8.
Método de Fragmentación
-
Si el tamaño del datagrama (incluye headers) es mayor al , debemos fragmentar.
-
Calculamos el tamaño del payload (sin headers) como:
-
Calculamos el máximo tamaño de fragment payload permitido, como:
-
Como nuestro fragmento debe tener un tamaño múltiplo de 8, entonces debemos hallar el máximo valor permitido múltiplo de 8, este será:
-
A partir del nuestro fragment payload size, podremos calcular la cantidad de fragmentos que debemos enviar como
-
Construiremos un fragmento con payload size , datagram size , y fragment offset de 0.
-
Repetiremos el procedimiento para el resto de fragmentos que se necesitan enviar. El tamaño de todos los fragmentos enviados será el mismo excepto el último, que tendrá un tamaño menor (o igual). Los fragment offset incrementarán linealmente a razón de por cada fragmento enviado. El último fragmento tendrá el bit de More Fragments en 0. Lógicamente, todos los paquetes tendrán el bit de Do Not Fragment en 0.