networking tcp network-protocols fragmentation defragmentation

networking - Fragmentación y reensamblaje de IP



tcp network-protocols (4)

Actualmente estoy revisando las diapositivas de mi red y me preguntaba si alguien podría ayudarme con el concepto de fragmentación y reensamblaje.

Entiendo cómo funciona, es decir, cómo se dividen los datagramas en partes más pequeñas porque los enlaces de red tienen una MTU. Sin embargo, el ejemplo en la imagen me confunde.

Entonces, las dos primeras secciones muestran una longitud de 1500, porque esta es la MSU, pero ¿no debería esto significar que la última debería tener 1000 (para un total de 4000 bytes) y no 1040? ¿De dónde vienen estos 40 bytes adicionales? Mi conjetura es que debido a que los dos fragmentos anteriores tenían un encabezado de 20 bytes, estos 40 bytes adicionales de datos debían ir a alguna parte, por lo que llegarán al último fragmento.

Fragflag esencialmente significa que hay otro fragmento, por lo que todos ellos tendrán un Fragflag de 1, excepto el último fragmento que estará en cero. Sin embargo, no entiendo qué es el desplazamiento o cómo se calcula. ¿Por qué el primer desplazamiento es cero? ¿Por qué dividimos los bytes en el campo de datos (1480) por 8 para obtener el segundo desplazamiento? ¿De dónde vino este 8? Aparte de eso, ¿estoy asumiendo que cada desplazamiento de los fragmentos solo aumentará por este valor?

Por ejemplo, el primer fragmento tendrá un desplazamiento de 0, el segundo 185, el tercero 370 y el cuarto 555? (370 + 185)

¡Gracias por cualquier ayuda!


Hay un encabezado de 20 bytes en cada paquete. Así que el paquete original contiene 3.980 bytes de datos. Los fragmentos contienen 1480, 1480 y 1020 bytes de datos. 1480 + 1480 + 1020 = 3980

Cada bit en el encabezado es precioso. Dividir el desplazamiento por 8 le permite encajar en 13 bits en lugar de 16. Esto significa que cada paquete, pero el último debe contener un número de bytes de datos que es un múltiplo de 8, lo que no es un problema.


La fragmentación y el reensamblaje se explicaron exclusivamente en el RFC 791. Revise la especificación del protocolo de Internet RFC . El RFC tiene varias secciones que explican la fragmentación y el reensamblaje de la muestra. Todas sus dudas y preguntas están bien atendidas en él.

Respuesta 1: Con respecto a la longitud del paquete: el paquete original contiene 4000 bytes. Este paquete es un paquete totalmente IP y, por lo tanto, también contiene el encabezado IP. Por lo tanto, la longitud de la carga útil es realmente 4000 - (Longitud del encabezado IP, es decir, 20).

Longitud de carga útil real = 4000 - 20 = 3980

Ahora el paquete está fragmentado debido al hecho de que la longitud es mayor que la MTU (1500 bytes).

Por lo tanto, el primer paquete contiene 1500 bytes que incluye encabezado IP + fracción de carga útil.

1500 = 20 (encabezado IP) + 1480 (carga útil de datos)

Del mismo modo para el otro paquete.

El tercer paquete deberá contener los datos restantes (3980 - 1480 -1480) = 1020

Por lo tanto, la longitud del paquete es 20 (encabezado IP) + 1020 (carga útil) = 1040

Respuesta 2: El desplazamiento es la dirección o el localizador desde donde comienzan los datos con referencia a la carga útil de datos original. Para IP, la carga útil de datos comprende todos los datos que se encuentran después del encabezado IP y el encabezado Opciones. Por lo tanto, el sistema / enrutador toma la carga útil y la divide en partes más pequeñas y mantiene el seguimiento del desplazamiento con referencia al paquete original para que se pueda realizar el reensamblaje.

Como se indica en la página 12 del RFC .

" El campo de desplazamiento de fragmento le dice al receptor la posición de un fragmento en el datagrama original. El desplazamiento y la longitud del fragmento determinan la parte del datagrama original cubierto por este fragmento. La bandera de más fragmentos indica (al restablecerse) el último fragmento. Estos campos proporcionan información suficiente para reensamblar datagramas " .

El desplazamiento del fragmento se mide en unidades de 8 bytes cada una. Tiene campo de 13 bits en el encabezado IP. Como se dice en la página 17 del RFC.

" Este campo indica a qué parte del datagrama pertenece este fragmento. El desplazamiento del fragmento se mide en unidades de 8 octetos (64 bits). El primer fragmento tiene un desplazamiento del cero " .

Por lo tanto, como preguntó en la pregunta de dónde vino este 8, es el estándar que se ha definido para la especificación del protocolo IP, donde 8 octetos se toman como un valor. Esto también nos ayuda a transmitir paquetes grandes a través de esto.

La página 28 de la RFC escribe: * Los fragmentos se cuentan en unidades de 8 octetos. La estrategia de fragmentación está diseñada para que un datagrama no fragmentado tenga toda la información de fragmentación cero (MF = 0, desplazamiento del fragmento = 0). Si un datagrama de Internet está fragmentado, su parte de datos debe dividirse en los límites de 8 octetos. Este formato permite 2 ** 13 = 8192 fragmentos de 8 octetos cada uno para un total de 65,536 octetos. Tenga en cuenta que esto es coherente con el campo de longitud total del datagrama (por supuesto, el encabezado se cuenta en la longitud total y no en los fragmentos). *


el tamaño de desplazamiento es de 13 bits en el encabezado de IP, pero necesitamos 16 bits como en el peor de los casos. Entonces, usamos un factor de escala de 8, es decir (2 ^ 16/2 ^ 13).


esos no son bits adicionales, sino la longitud total del último fragmento. como 1500 es MTU, esto significa que puede haber 1500 bytes de datos en un fragmento, incluido el encabezado. La cabecera se anexa con cada fragmento. esto significa que en el fragmento somos capaces de enviar 1500-20 = 1480 bytes de datos. se da que hay un datagrama 4000B .datagram no es más que una encapsulación de paquetes de datos en la capa de red. Por lo tanto, el total de datos que debemos enviar es 4000-20 = 3980. luego se fragmenta en 3 partes (ceil (3980/1480)) cada una de 1480,1480,1020 de longitud respectivamente. por lo tanto, cuando el encabezado 20B se agrega al último fragmento, su longitud se convierte en 1020 + 20 = 1040.