Descarga de fusión de segmentos de recepción UDP (URO)
A partir de Windows 11, versión 24H2, la descarga de fusión de segmentos de recepción UDP (URO) habilita tarjetas de interfaz de red (NIC) para fusionar segmentos de recepción UDP. Las NIC pueden combinar datagramas UDP del mismo flujo que coinciden con un conjunto de reglas en un búfer lógico contiguo. Estos datagramas combinados se indican a continuación en la pila de redes de Windows como un único paquete grande.
La fusión de datagramas UDP reduce el coste de CPU para procesar paquetes en flujos de ancho de banda alto, lo que da lugar a un mayor rendimiento y menos ciclos por byte.
En las secciones siguientes se describen las reglas para fusionar paquetes UDP y cómo escribir un controlador de miniporte URO.
- Reglas para la agrupación de paquetes UDP
- Escribir un controlador de miniporte URO
- Consideraciones de programación para controladores URO
Reglas para la fusión de paquetes UDP
La fusión de URO solo se puede intentar en paquetes que cumplan todos los criterios siguientes:
IpHeader.Version
es idéntico para todos los paquetes.IpHeader.SourceAddress
yIpHeader.DestinationAddress
son idénticos para todos los paquetes.UdpHeader.SourcePort
yUdpHeader.DestinationPort
son idénticos para todos los paquetes.UdpHeader.Length
es idéntico para todos los paquetes, excepto el último paquete, que puede ser menor.-
UdpHeader.Length
debe ser distinto de cero. UdpHeader.Checksum
, si no es cero, debe ser correcto en todos los paquetes. Esto significa que la descarga de suma de comprobación de recepción debe validar el paquete.Layer 2 headers
debe ser idéntico para todos los paquetes.
Si los paquetes son IPv4, también deben cumplir los siguientes criterios:
-
IPv4Header.Protocol
== 17 (UDP) para todos los paquetes. EthernetHeader.EtherType
== 0x0800 para todos los paquetes.- El
IPv4Header.HeaderChecksum
en los paquetes recibidos debe ser correcto. Esto significa que la descarga de suma de comprobación de recepción debe validar el encabezado. IPv4Header.HeaderLength
== 5 (sin encabezados de opción IPv4) para todos los paquetes.IPv4Header.ToS
es idéntico para todos los paquetes.IPv4Header.ECN
es idéntico para todos los paquetes.IPv4Header.DontFragment
es idéntico para todos los paquetes.IPv4Header.TTL
es idéntico para todos los paquetes.-
IPv4Header.TotalLength
==UdpHeader.Length
* + length(IPv4Header
) para todos los paquetes.
Si los paquetes son IPv6, también deben cumplir los siguientes criterios:
IPv6Header.NextHeader
== 17 (UDP) para todos los paquetes (sin encabezados de extensión).EthernetHeader.EtherType
== 0x86dd (IPv6) para todos los paquetes.IPv6Header.TrafficClass
yIPv6Header.ECN
son idénticos para todos los paquetes.IPv6Header.FlowLabel
es idéntico para todos los paquetes.IPv6Header.HopLimit
es idéntico para todos los paquetes.IPv6Header.PayloadLength
==UdpHeader.Length
para todos los paquetes.
Estructura de paquetes URO
La unidad fusionada simple (SCU) resultante debe tener un único encabezado IP y un encabezado UDP, seguido de la carga de UDP para todos los datagramas fusionados concatenados.
Las indicaciones de URO deben establecer el campo IPv4Header.TotalLength
en la longitud total del SCU, el campo IPv6Header.PayloadLength
en la longitud de la carga UDP y el campo UdpHeader.Length
en la longitud de las cargas fusionadas.
Si los encabezados de capa 2 (L2) están presentes en datagramas combinados, la SCU debe contener un encabezado L2 válido. El encabezado L2 del SCU debe ser similar al encabezado L2 de los datagramas fusionados.
Validación e indicación de suma de comprobación
Las indicaciones de URO deben establecer los campos IPv4Header.HeaderChecksum
y UdpHeader.Checksum
en cero y rellenar la información de descarga de suma de comprobación fuera de banda en la SCU que indica que la suma de comprobación de IPv4 y UDP se ha realizado correctamente.
Debe indicarse por separado un paquete que coincida con todas las condiciones para que se fusione, pero que produzca un error en la validación de suma de comprobación. Los paquetes recibidos después de él no deben fusionarse con los paquetes recibidos antes.
Por ejemplo, supongamos que los paquetes 1, 2, 3, 4 y 5 se reciben del mismo flujo, pero el paquete 3 produce un error en la validación de suma de comprobación. Los paquetes 1 y 2 se pueden combinar, y los paquetes 4 y 5 se pueden combinar, pero el paquete 3 no debe combinarse con ninguna SCU. Los paquetes 1 y 2 no deben combinarse junto con los paquetes 4 y 5. El paquete 2 es el último paquete de una SCU y el paquete 4 inicia una nueva SCU. Además, la SCU que contiene los paquetes 1 y 2 debe indicarse antes de que se indique el paquete 3 y el paquete 3 debe indicarse antes de que el SCU contenga paquetes 4 y 5.
Fusión de paquetes y separación de flujo
Los paquetes de varios flujos se pueden fusionar en paralelo, ya que el hardware y la memoria permiten. Los paquetes de diferentes flujos no deben combinarse.
Los paquetes de varias recepciones intercaladas se pueden separar y fusionar con sus respectivos flujos. Por ejemplo, dados los flujos A, B y C, si los paquetes llegan en el orden A, A, B, C, B, A, A, A, los paquetes del flujo A se pueden fusionar en AAA y los paquetes del flujo B se fusionan en BB, mientras que el paquete del flujo de C se puede indicar normalmente o fusionado con una SCU pendiente del flujo C.
Los paquetes dentro de un flujo determinado no se deben reordenar entre sí. Por ejemplo, los paquetes del flujo A deben fusionarse en el orden recibido, independientemente de los paquetes de los flujos B y C recibidos entre ellos.
Palabra clave INF para controlar URO
La siguiente palabra clave se puede usar para habilitar o deshabilitar URO con una configuración de clave del Registro:
*UdpRsc
Las palabras clave INF estandarizadas por enumeración tienen los atributos siguientes:
SubkeyName: el nombre de la palabra clave que debe especificar en el archivo INF y que aparece en el Registro.
ParamDesc: El texto de visualización asociado con SubkeyName.
Valor: valor entero de enumeración asociado a cada opción de la lista. Este valor se almacena en NDI\params\SubkeyName\Value.
EnumDesc: el texto para mostrar asociado a cada valor que aparece en el menú.
Valor predeterminado: el valor predeterminado del menú.
SubkeyName | ParamDesc | Valor | EnumDesc |
---|---|---|---|
*UdpRsc |
URO | 0 | Deshabilitado |
1 (valor predeterminado) | habilitado |
Para obtener más información sobre el uso de palabras clave de enumeración, vea Palabras clave de enumeración.
Escribir un controlador de miniporte URO
A partir de NDIS 6.89, la interfaz NDIS para URO facilita la comunicación entre TCP/IP y el controlador de miniporte NDIS.
Notificación de la funcionalidad URO
Un controlador de minipuerto anuncia la compatibilidad con URO en el miembro UdpRsc
de la estructura NDIS_OFFLOAD, que se pasa a la función NdisMSetMiniportAttributes.
Consulta de la funcionalidad URO
Para comprobar si un controlador de miniporte admite URO, los controladores NDIS y otras aplicaciones pueden consultar el OID OID_TCP_OFFLOAD_HARDWARE_CAPABILITIES, que devuelve la estructura NDIS_OFFLOAD
.
Consulta del estado de URO
Para determinar el estado actual de URO, los controladores NDIS y otras aplicaciones pueden consultar la solicitud de OID OID_TCP_OFFLOAD_CURRENT_CONFIG. NDIS gestiona este OID y no lo pasa al minipuerto.
Cambio del estado de URO
URO se puede habilitar o deshabilitar mediante la emisión de la solicitud de OID OID_TCP_OFFLOAD_PARAMETERS. Este OID usa una estructura NDIS_OFFLOAD_PARAMETERS. En esta estructura, el miembro UdpRsc.Enabled
puede tener los siguientes valores:
Valor | Significado |
---|---|
NDIS_OFFLOAD_PARAMETERS_UDP_RSC_NO_CHANGE 0 |
El controlador de miniporte no debe cambiar la configuración actual. |
NDIS_OFFLOAD_PARAMETERS_UDP_RSC_DISABLED 1 |
URO está inactivo. |
NDIS_OFFLOAD_PARAMETERS_UDP_RSC_ENABLED 2 |
URO está habilitado. |
Cuando un controlador procesa una solicitud de OID OID_TCP_OFFLOAD_PARAMETERS con la marca NDIS_OFFLOAD_PARAMETERS_UDP_RSC_DISABLED
establecida, la NIC debe esperar a completar la solicitud hasta que se indiquen todos los segmentos fusionados existentes y las indicaciones de URO pendientes. Esto garantiza la sincronización de eventos de habilitación o deshabilitación de URO en los componentes de NDIS.
Una vez que el controlador de minipuerto procesa la solicitud de OID OID_TCP_OFFLOAD_PARAMETERS, el controlador de minipuerto debe emitir una indicación de estado NDIS_STATUS_TASK_OFFLOAD_CURRENT_CONFIG con el estado de descarga actualizado.
El indicador NDIS_OFFLOAD_PARAMETERS_SKIP_REGISTRY_UPDATE
en NDIS_OFFLOAD_PARAMETERS permite deshabilitar URO solo durante el tiempo de ejecución. Los cambios realizados con esta marca no se guardan en el registro.
Desactivar URO en NDIS 6.89 y versiones posteriores
Los controladores destinados a NDIS 6.89 y versiones posteriores deben comprender los paquetes URO y controlarlos correctamente. Para darse de baja de URO:
- Los controladores de filtro ligero (LWF) establecen la marca
NDIS_FILTER_DRIVER_UDP_RSC_NOT_SUPPORTED
en la estructura NDIS_FILTER_DRIVER_CHARACTERISTICS. - Los controladores de protocolo establecen la marca
NDIS_PROTOCOL_DRIVER_UDP_RSC_NOT_SUPPORTED
en la estructura NDIS_PROTOCOL_DRIVER_CHARACTERISTICS.
Este enfoque garantiza que los componentes que no estén familiarizados con URO no reciban NBL de URO. NDIS deshabilita URO en el miniporte durante el enlace si existe un controlador de protocolo o LWF que no admite URO.
Consideraciones de programación para controladores URO
Tenga en cuenta los siguientes problemas al implementar un controlador de miniporte compatible con URO.
Winsock URO API
Para obtener información sobre la API de URO de Winsock, consulte Opciones de socket de IPPROTO_UDP. Consulte la información sobre UDP_RECV_MAX_COALESCED_SIZE
y UDP_COALESCED_INFO
.
Actualizaciones de la pila TCP/IP de Windows
El transporte TCP/IP de Microsoft habilita URO en tiempo de enlace con NDIS, a menos que la configuración impida que lo haga.
Las llamadas de WFP pueden usar FWP_CALLOUT_FLAG_ALLOW_URO
en FWPS_CALLOUT2 para anunciar su compatibilidad con URO. Si una llamada de PMA incompatible se registra en una capa sensible a URO, el sistema operativo deshabilita URO mientras se registra la llamada.
Si un socket permite URO con un tamaño máximo fusionado mayor o igual que el tamaño de descarga de hardware, la pila entregará los NBL del hardware sin modificar al socket. Si un socket se admite con un tamaño máximo de fusión menor, la pila interrumpirá la recepción fusionada en el tamaño más pequeño del socket.
Si un socket excluye URO, la pila volverá a segmentar la recepciones para ese socket. En ausencia de URO de hardware, la característica URO de software existente sigue estando disponible.