Compartir a través de


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.

Diagrama de flujo que muestra las reglas para la fusión de segmentos y la actualización de encabezados TCP.

Diagrama de flujo que muestra mecanismos para distinguir las ACK duplicadas válidas y las actualizaciones de ventanas.

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:

  1. Se debe realizar un seguimiento de una nueva SCU, empezando por el ACK duplicado.

  2. DupAckCount para la nueva SCU debe establecerse en cero.

  3. 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:

  1. Se debe realizar un seguimiento de una nueva SCU, empezando por este segmento.

  2. DupAckCount para la nueva SCU debe establecerse en cero.

  3. 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:

Diagrama de flujo que describe las reglas para fusionar segmentos con la opción de marca de tiempo TCP.

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.