Fragmentación de TCP y fragmentación de IP
Si la capa IP quiere transmitir un paquete de datos y la longitud del paquete de datos (incluido el encabezado IP) excede la MTU, entonces la capa IP debe realizar una operación de fragmentación en el paquete de datos para que la longitud de cada fragmento es menor o igual a MTU.
Tomando Ethernet II como ejemplo, la unidad máxima de transmisión de datagramas IP debajo del encabezado MAC es MTU. Para la mayoría de las LAN que utilizan Ethernet, MTU=1500.
Ver el formato de paquete de la trama Ethernet en Wireshark:
Trama = encabezado Ethernet IPHeader Encabezado TCP Datos del segmento TCP
(1) Encabezado Ethernet = 14 bytes = Dirección física Dst (6 bytes) Dirección física original (6 bytes) Dirección física Dst (6 bytes) Dirección física original (6 bytes). Tipo de dirección física Src (6 bytes) (2 bytes), el encabezado Ethernet se denomina marco de datos a continuación.
(2) Encabezado IP =?20? Byte (excluyendo los campos de opción), los datos se denominan datagrama en la capa IP y los fragmentos se denominan fragmentos.
(3) Encabezado TCP
= 20 bytes (excluyendo los campos de opción). Los datos se denominan marco de datos en la capa TCP y los fragmentos se denominan fragmentos.
(4) Encabezado TCP
=? (o "mensaje" en UDP).
(4) Después de 54 bytes está la parte de datos TCP, que son los datos del usuario de la capa de aplicación.
El propio TCP admite la segmentación. Cuando TCP transmite datos cuya longitud excede MSS (¿Máximo? ¿Segmento? Tamaño), segmentará los datos primero. En circunstancias normales, MSS es más pequeño que MTU, por lo que TCP generalmente no lo hará. causar fragmentación de IP. Si los datos son demasiado grandes, solo los fragmentarán en la capa de transporte y no se necesitará fragmentación cuando lleguen a la capa IP. Por lo tanto, el uso del protocolo TCP para la transmisión de datos no produce fragmentación de IP.
Los mensajes de solicitud HTTP generalmente no son muy largos y se pueden cargar en un paquete de datos de red. Sin embargo, si uno de ellos es un formulario de envío
, la longitud de los datos puede exceder. un paquete de datos de red. La cantidad de datos que un paquete puede contener, como un artículo extenso publicado en un blog o foro. En este caso, los datos en el búfer de envío exceden la longitud del MSS y no necesitamos esperar más datos. Los datos en el búfer de envío se dividen según la longitud del MSS y cada dato se coloca en un paquete de red separado.
De acuerdo con la forma en que se dividen los datos en el búfer de envío, cuando se determina que es necesario enviar datos, se agregará un encabezado TCP delante de cada dato, y el remitente y el receptor se marcará de acuerdo con la información de control registrada en el socket. Luego, el número de puerto de la otra parte se entrega al módulo IP para realizar la operación de envío de datos.
El segmento de datos máximo que puede transmitir un paquete TCP a la vez se denomina tamaño máximo de segmento de datos (MSS). Para obtener el mejor rendimiento, ambas partes negociarán el valor de MSS al establecer. una conexión TCP. El MSS mínimo proporcionado por ambas partes. El valor es el valor MSS máximo para la conexión. MSS generalmente se calcula en función de MTU, generalmente MSS=MTU-sizeof(IP header)-sizeof(TCP
head)=1500-20-20=1460.
La longitud del segmento TCP se refiere al tamaño de los datos de la aplicación, es decir, el tamaño de los datos de la capa de aplicación después de la encapsulación inicial. Utilice wirshark para ver los resultados de la siguiente manera
POST /License/client/ProcessQueryServlet
HTTP/1.1
Host: 172.24.116.249:8050
Conexión: keep -alive
Longitud del contenido: 118
Control de caché: max-age=0
Origen:
http://172.24.116.249:8050
Solicitudes de actualización inseguras:
1
Agente de usuario: Mozilla/5.0
(Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, como Gecko)
Chrome./54.0.2840.99 Safari/537.36
Tipo de contenido:
aplicación/x-www-form-urlencoded
Aceptar:
texto/html, aplicación/ xhtml xml, aplicación/xml; q=0.9, imagen/webp, * /*; q=0.8
Referencia:
http://172.24.116.249:8050/License/client/ PreQueryServlet
Aceptar codificación: gzip,
deflate
Aceptar-Idioma:
zh-CN, zh; q=0.8
Cookie:
JSESSIONID= 67C7292511815E7AA38CE5B863FC0E02
?
cause=amp; E5AEA2E688B7E5908DE7A7B0=kehumingchengamp; Se muestra de la siguiente manera en el nodepad
TCP/IP puede usar algunos parámetros opcionales (opciones de protocolo), como cifrado, etc. De esta manera, la longitud del encabezado será
Ocupe el espacio MSS y la longitud del encabezado. La longitud real será de 1500-1500 bytes para transportar los datos. Si
Tcp establece una conexión, se debe realizar un protocolo de enlace de tres vías. En los dos primeros paquetes de protocolo de enlace, ambas partes se declaran su MSS entre sí. Cuando un bloque de datos a transmitir tiene más de 1460 bytes, la capa TCP lo fragmenta y lo encapsula en múltiples paquetes de red. De esta manera, los datos son fragmentados por la capa TCP local y entregados a la capa IP local, que no fragmenta los datos.
? En este sentido, TCP en realidad no tiene nada que ver con la segmentación, porque el tamaño de cada datagrama TCP ya está limitado por el MSS antes de ser compuesto, por lo que la longitud del datagrama TCP no puede ser mayor que el MSS, naturalmente, el datagrama de la capa IP no excederá la MTU, por lo que, por supuesto, no hay necesidad de fragmentación.
Sin embargo, aún pueden surgir problemas si hay conmutadores o dispositivos similares en la red con MTU más pequeñas que el emisor y el receptor. De hecho, la fragmentación de IP también ocurre en los enrutadores vecinos para el enrutamiento del siguiente salto. Esto se debe a que la MTU de la tarjeta de red del enrutador puede ser más pequeña que el tamaño del datagrama IP que debe reenviarse. En este momento, pueden ocurrir las dos situaciones siguientes en el enrutador:
(1) Si el remitente de origen configura este paquete IP en fragmentación (May
Fragmento, DF=0), el enrutador fragmentará el datagrama IP y lo reenviará.
(2) Si el remitente de origen configura el datagrama IP para que no se fragmente (No
Fragmentar, DF=1), el enrutador descartará el datagrama IP y enviará un Mensaje de error de fragmentación ICMP al remitente de origen.
Para datagramas UDP e ICMP, si la longitud del datagrama IP del componente excede 1500, entonces el datagrama IP obviamente debe fragmentarse, ya que no pueden fragmentarse a sí mismos como TCP.
UDP e ICMP suponen que la capa de red puede transmitir datos infinitamente largos (en realidad hay un límite de 65535), por lo que cuando estos dos protocolos envían datos, no consideran la longitud de los datos, solo suman un encabezado UDP o ICMP y entregarlo directamente a la capa de red, eso es suficiente. Luego, el protocolo IP en la capa de red fragmenta estos datos de "cuerpo largo y cabeza corta". No espere que IP sea "inteligente" al identificar dónde están el encabezado de la capa superior y la carga de los datos que se le pasan. todos los datos en N segmentos, de modo que solo el primer segmento tenga un encabezado UDP o ICMP, pero los otros segmentos no. Por tanto, UDP no está fragmentado, mientras que IP sí lo está.
Normalmente, el encabezado IP es de 20 bytes, el encabezado UDP o ICMP es de 8 bytes y la carga útil es 1500-20-8 = 1472 bytes. La fragmentación se produce si la parte de carga útil estática de los datos tiene más de 1472 bytes.
?Tome ping a un paquete de datos grande de 1473 bytes como ejemplo
El encabezado icmp se encuentra en el primer fragmento y los fragmentos restantes solo contienen el encabezado IP y los datos. Excepto el último fragmento, los datos de los demás fragmentos (excluido el encabezado IP) deben ser un múltiplo entero de 8.
La carga útil del primer paquete de fragmentos es 1514-14-20-8=1472 y la carga útil del segundo paquete de fragmentos es 35-14-20=1, por lo que el tamaño es 1473 Los datos aparentemente son transmitido en dos paquetes.