Reglas para la fusión de segmentos TCP/IP
En esta sección se definen las reglas que especifican cuándo un controlador de minipuerto compatible con segmentos de recepción (RSC) debe fusionar un segmento para una conexión TCP determinada. Si se infringe alguna de las reglas, se genera una excepción y el controlador de minipuerto debe anular la fusión del segmento.
El controlador de minipuerto debe actualizar los encabezados IP y TCP para la única unidad fusionada (SCU). El controlador de minipuerto debe volver a calcular las sumas de comprobación TCP e IPv4 a través de la SCU y encadenar la carga TCP.
El primero de los dos diagramas de flujo siguientes describe las reglas para la fusión de segmentos y la actualización de los encabezados TCP. Este diagrama de flujo hace referencia a mecanismos para distinguir las ACK duplicadas válidas y las actualizaciones de ventanas. En el segundo diagrama de flujo se describen estos mecanismos.
Estos diagramas de flujo se proporcionan como referencia para comprender las reglas rsc. Una implementación de hardware puede optimizar el diagrama de flujo, siempre y cuando se mantenga la corrección.
Los términos siguientes se usan en los diagramas de flujo:
Término | Descripción |
---|---|
SEG. SEQ | Número de secuencia del segmento entrante. |
H.SEQ | Número de secuencia de la SCU de seguimiento actualmente. |
SEG. ACK | Número de confirmación del segmento entrante. |
H.ACK | Número de confirmación de la SCU de seguimiento actualmente. |
SEG. WND | Ventana anunciada por el segmento entrante. |
H.WND | La ventana anunciada por la SCU de seguimiento actualmente. |
SEG. LEN | Longitud de carga TCP del segmento entrante. |
H.LEN | Longitud de carga TCP de la SCU de seguimiento actual. |
SEG. NXT | Suma de SEG. SEQ y SEG. LEN. |
H.BLON | La suma de H.SEQ y H.LEN. |
H.DupAckCount | El número de ACK duplicados que se han combinado en la SCU. Este número debería ser cero. |
SEG. Tsval | Valor de marca de tiempo del segmento recibido actualmente. El formato de este valor se define en RFC 1323. |
H.Tsval | Valor de marca de tiempo de la SCU de seguimiento actual. |
SEG. TSecr | Respuesta de eco de marca de tiempo en el segmento recibido actualmente. |
H.TSecr | Respuesta de eco de marca de tiempo en la SCU de seguimiento actualmente. |
Los diagramas de flujo muestran que el controlador de minipuerto puede fusionar segmentos con números ACK diferentes. Sin embargo, el controlador de minipuerto debe obedecer las siguientes reglas con respecto a los números ACK, como se muestra en el primer diagrama de flujo anterior:
Después de realizar la comprobación de número de secuencia, se puede fusionar un ACK puro entrante en el SCU del que se realiza el seguimiento actualmente si cumple una o ambas de las siguientes condiciones:
H.ACK == SEG. ACK.
El recuento de ACK duplicados en el segmento combinado al que se realiza el seguimiento es cero. En otras palabras, H.DupAckCount == 0.
En otras palabras, cualquier ACK puro que no sea un ACK duplicado o una actualización de ventana desencadena una excepción y no se debe fusionar. Todos estos ACK puros deben indicarse como segmentos individuales. Esta regla garantiza que RSC no afecte al comportamiento ni al rendimiento de los algoritmos de control de congestión TCP de Windows.
Un segmento de datos entrante (SEG. ACK == H.ACK) o un ACK (SEG) con respaldo de cerdo entrante. ACK>H.ACK) se puede fusionar en la SCU actualmente rastreada si se cumplen las dos condiciones siguientes:
- El segmento es contiguo al SCU en el espacio de secuencia. En otras palabras, SEG. SEQ == H.BLOQ.
- El recuento de ACK duplicados en el segmento combinado al que se realiza el seguimiento es cero. En otras palabras, H.DupAckCount == 0.
Notas adicionales sobre la fusión de ACK duplicado
Comportamiento de ACK duplicado
El controlador de minipuerto debe tratar un segmento ACK duplicado equivalente a un ACK puro y no fusionarlo. En este caso, debe finalizar la SCU actual (si existe) para indicar e indicar el segmento ACK duplicado como un segmento individual. Dado que los clientes de Windows usan confirmaciones selectivas (SACK) de forma predeterminada, es probable que un segmento ACK duplicado genere una excepción. Vea Ejemplos de fusión de segmentos de recepción para obtener un ejemplo. Si se indica un segmento con DupAckCount> 0, NDIS deshabilitará RSC en la interfaz.
Controlar ACK duplicado al realizar un seguimiento de una SCU que consta de segmentos de datos
Al realizar un seguimiento de una SCU con H.LEN> 0 (es decir, un segmento combinado que contiene datos), si llega un ACK duplicado, el SCU de seguimiento debe finalizarse de la siguiente manera:
Se debe realizar un seguimiento de una nueva SCU, empezando por el ACK duplicado.
DupAckCount para la nueva SCU debe establecerse en cero.
DupAckCount debe incrementarse si se reciben ACK duplicados adicionales.
En este caso, DupAckCount será 1 menor que el número de ACK duplicados. La pila de hosts controlará el recuento correctamente.
Controlar ACK duplicado al realizar un seguimiento de una SCU que consta de un ACK acumulativo puro
Al realizar un seguimiento de una SCU que consta de una única ACK acumulativa pura (las reglas prohíben la fusión de varios ACK puros), si llega un ACK duplicado a continuación, se debe incrementar el DupAckCount para el SCU de seguimiento. También se debe incrementar si se reciben ACK duplicados adicionales. En este caso, DupAckCount será igual al número de ACK duplicados que se fusionan.
Cuando el primer segmento que se recibe en un DPC es un ACK duplicado
En este caso, la NIC no puede determinar si el segmento recibido es un ACK duplicado, porque no mantiene ningún estado. Por lo tanto, el segmento debe tratarse como un ACK puro, como se indica a continuación:
Se debe realizar un seguimiento de una nueva SCU, empezando por este segmento.
DupAckCount para la nueva SCU debe establecerse en cero.
DupAckCount debe incrementarse en 1 para cada ACK duplicado adicional que se recibe.
En este caso, DupAckCount será igual a 1 menor que el número real de ACK duplicados. La pila de hosts controlará el recuento correctamente.
Exención ACK duplicada
El controlador de minipuerto puede tratar un segmento ACK duplicado equivalente a un ACK puro y no fusionarlo. En este caso, debe finalizar la SCU actual (si existe) para indicar e indicar el segmento ACK duplicado como un segmento individual. Dado que los clientes windows usan SACK de forma predeterminada, es probable que un segmento ACK duplicado genere una excepción. Para obtener un ejemplo, vea Ejemplos de fusión de segmentos de recepción. Esta exención no se aplica a los segmentos de actualización de ventanas.
Fusión de segmentos con la opción Timestamp
La opción de marca de tiempo TCP es la única opción que se puede fusionar legalmente. La fusión de segmentos con esta opción se deja como una decisión específica de la implementación. Si el controlador de minipuerto combina segmentos con la opción timestamp, debe seguir las reglas descritas en el diagrama de flujo siguiente:
Nota:
Comprobación de SEG. TSval= H.TSval> debe realizarse mediante aritmética modulo-232 similar a la usada para números de secuencia TCP. Consulte RFC 793, sección 3.3.
Al indicar un segmento combinado, se debe indicar la siguiente información fuera de banda estableciendo el miembro NetBufferListInfo de la estructura NET_BUFFER_LIST que describe el segmento combinado:
El número de segmentos que se han combinado debe almacenarse en NetBufferListInfo[TcpRecvSegCoalesceInfo]. Miembro CoalescedSegCount . Este número solo representa segmentos de datos que se han combinado. La fusión pura de ACK está prohibida y los segmentos de actualización de ventana no deben contarse como parte de este campo.
El recuento de ACK duplicado debe almacenarse en NetBufferListInfo[TcpRecvSegCoalesceInfo]. Miembro DupAckCount . En el primer diagrama de flujo anterior se explica cómo se calcula este valor.
Cuando los segmentos con la opción de marca de tiempo TCP se fusionan, NetBufferListInfo[RscTcpTimestampDelta] debe rellenarse con la diferencia absoluta entre el valor de marca de tiempo TCP más antiguo y el último que se ve en la secuencia de segmentos fusionados que componen la SCU. La propia SCU debe contener el valor de marca de tiempo TCP más reciente que se ve en la secuencia de segmentos fusionados.
Los miembros DupAckCount y RscTcpTimestampDelta se interpretan si y solo si el miembro CoalescedSegCount es mayor que cero. Si CoalescedSegCount es cero, el segmento se trata como un segmento no combinado que no es RSC.
Para obtener información sobre el contenido del miembro NetBufferListInfo , consulte NDIS_NET_BUFFER_LIST_INFO y NDIS_RSC_NBL_INFO.
El bit PSH debe ser ORed para todos los segmentos fusionados. En otras palabras, si el bit de PSH se estableció en cualquiera de los segmentos individuales, el controlador de minipuerto debe establecer el bit PSH en el SCU.
La finalización de una SCU implica:
Recomputing the TCP and, if applicable, the IPv4 checksum.
Actualizando los encabezados IP como se describe en Actualización de los encabezados IP para segmentos fusionados.
Establecer los bits ECN y los campos ECN en los encabezados TCP e IP en los mismos valores que se establecieron en los segmentos individuales.
Control de segmentos tcp/IP IPsec
Una tarjeta de red puede notificar las funcionalidades de descarga de tareas RSC e IPsec. (Consulte Determinación de las funcionalidades rsc de un adaptador de red). Sin embargo, si admite la descarga de tareas IPsec, no debe intentar fusionar segmentos protegidos por IPsec.