Delen via


UDP-ontvangstsegmentcoalescentie-offload (URO)

Vanaf Windows 11, versie 24H2, maakt UDP-ontvangstsegment-samenvoegingsoffload (URO) het voor netwerkinterfacekaarten (NIC's) mogelijk om UDP-ontvangstsegmenten samen te voegen. NIC's kunnen UDP-gegevensgrammen uit dezelfde stroom combineren die overeenkomen met een set regels in een logisch aaneengesloten buffer. Deze gecombineerde datagrammen worden vervolgens aan de Windows-netwerkstack aangegeven als één groot pakket.

Het samenvoegen van UDP-gegevensgrammen vermindert de CPU-kosten voor het verwerken van pakketten in stromen met hoge bandbreedte, wat resulteert in een hogere doorvoer en minder cycli per byte.

In de volgende secties worden de regels beschreven voor het samenvoegen van UDP-pakketten en het schrijven van een URO-minipoortstuurprogramma.

Regels voor het samenvoegen van UDP-pakketten

URO coalescing kan alleen worden uitgevoerd op pakketten die voldoen aan alle volgende criteria:

  • IpHeader.Version is identiek voor alle pakketten.
  • IpHeader.SourceAddress en IpHeader.DestinationAddress zijn identiek voor alle pakketten.
  • UdpHeader.SourcePort en UdpHeader.DestinationPort zijn identiek voor alle pakketten.
  • UdpHeader.Length is identiek voor alle pakketten, met uitzondering van het laatste pakket, wat minder kan zijn.
  • UdpHeader.Length moet niet-nul zijn.
  • UdpHeader.Checksummoet, indien niet nul, correct zijn voor alle pakketten. Dit betekent dat het ontvangen van de checksum-offload het pakket moet valideren.
  • Layer 2 headers moet identiek zijn voor alle pakketten.

Als de pakketten IPv4 zijn, moeten ze ook voldoen aan de volgende criteria:

  • IPv4Header.Protocol == 17 (UDP) voor alle pakketten.
  • EthernetHeader.EtherType == 0x0800 voor alle pakketten.
  • De IPv4Header.HeaderChecksum op ontvangen pakketten moet juist zijn. Dit betekent dat de ontvangen checksum-offload de kop moet valideren.
  • IPv4Header.HeaderLength == 5 (geen IPv4-optieheaders) voor alle pakketten.
  • IPv4Header.ToS is identiek voor alle pakketten.
  • IPv4Header.ECN is identiek voor alle pakketten.
  • IPv4Header.DontFragment is identiek voor alle pakketten.
  • IPv4Header.TTL is identiek voor alle pakketten.
  • IPv4Header.TotalLength == UdpHeader.Length* + length(IPv4Header) voor alle pakketten.

Als de pakketten IPv6 zijn, moeten ze ook voldoen aan de volgende criteria:

  • IPv6Header.NextHeader == 17 (UDP) voor alle pakketten (zonder uitbreidingsheaders).
  • EthernetHeader.EtherType == 0x86dd (IPv6) voor alle pakketten.
  • IPv6Header.TrafficClass en IPv6Header.ECN zijn identiek voor alle pakketten.
  • IPv6Header.FlowLabel is identiek voor alle pakketten.
  • IPv6Header.HopLimit is identiek voor alle pakketten.
  • IPv6Header.PayloadLength == UdpHeader.Length voor alle pakketten.

URO-pakketstructuur

De resulterende enkele samengevoegde eenheid (SCU) moet één IP-header en één UDP-header hebben, gevolgd door de UDP-nettolading voor alle samengevoegde datagrammen die samen zijn gevoegd.

URO-aanduidingen moeten het IPv4Header.TotalLength veld instellen op de totale lengte van de SCU of IPv6Header.PayloadLength veld op de lengte van de UDP-nettolading en UdpHeader.Length veld op de lengte van de samengevoegde nettoladingen.

Als er L2-headers (laag 2) aanwezig zijn in samengevoegde datagrammen, moet de SCU een geldige L2-header bevatten. De L2-header in de SCU moet lijken op de L2-header van de samengevoegde datagrammen.

Controlesomvalidatie en aanduiding

URO-indicaties moeten de velden IPv4Header.HeaderChecksum en UdpHeader.Checksum op nul instellen en de out-of-band controleinformatie voor de checksum offload invullen op de SCU, waarmee wordt aangegeven dat de IPv4- en UDP-controlesommen zijn geslaagd.

Een pakket dat aan alle voorwaarden voor samenvoeging voldoet, maar niet slaagt voor de controlesomvalidatie, moet afzonderlijk worden aangegeven. Pakketten die zijn ontvangen nadat deze niet mogen worden samengesamend met pakketten die vóór het pakket zijn ontvangen.

Stel dat pakketten 1, 2, 3, 4 en 5 worden ontvangen van dezelfde stroom, maar pakket 3 mislukt de controlesomvalidatie. Pakketten 1 en 2 kunnen worden samengevoegd en pakketten 4 en 5 kunnen worden samengevoegd, maar pakket 3 mag niet worden samengevoegd met beide SCU's. Pakketten 1 en 2 mogen niet worden samengevoegd met pakketten 4 en 5. Pakket 2 is het laatste pakket in een SCU en pakket 4 start een nieuwe SCU. Bovendien moet de SCU met pakketten 1 en 2 worden aangegeven voordat pakket 3 wordt aangegeven en pakket 3 moet worden aangegeven voordat de SCU pakketten 4 en 5 bevat.

Pakketsamenvoeging en stroomscheiding

Pakketten van meerdere stromen kunnen parallel worden samengevoegd, voor zover hardware en geheugen dit toestaan. Pakketten van verschillende stromen mogen niet samen worden samengevoegd.

Interleaved pakketten van meerdere ontvangsten kunnen worden gescheiden en samengevoegd met hun respectieve stromen. Als bijvoorbeeld stromen A, B en C binnenkomen in de volgorde A, A, B, B, A, A, kunnen de pakketten van de A-stroom worden samengevoegd in AAA en kunnen de pakketten uit de B-stroom worden samengevoegd in BB, terwijl het pakket van de C-stroom normaal kan worden aangegeven of samengevoegd met een wachtende SCU van stroom C.

De pakketten binnen een bepaalde stroom mogen niet opnieuw worden gerangschikt met betrekking tot elkaar. De pakketten van de A-stroom moeten bijvoorbeeld worden gegroepeerd in de volgorde die wordt ontvangen, ongeacht de pakketten van de B- en C-stromen die daartussen worden ontvangen.

INF-trefwoord voor het beheren van URO

Het volgende trefwoord kan worden gebruikt om URO in of uit te schakelen met een registersleutelinstelling:

  • *UdpRsc

Opsommingsgestandaardiseerde INF-trefwoorden hebben de volgende kenmerken:

  • SubkeyName: de naam van het trefwoord dat u moet opgeven in het INF-bestand en dat wordt weergegeven in het register.

  • ParamDesc: de weergavetekst die is gekoppeld aan SubkeyName.

  • waarde: de opsommingswaarde voor gehele getallen die aan elke optie in de lijst is gekoppeld. Deze waarde wordt opgeslagen in NDI\params\SubkeyName\Value.

  • EnumDesc: de weergavetekst die is gekoppeld aan elke waarde die in het menu wordt weergegeven.

  • Standaard: de standaardwaarde voor het menu.

SubkeyName ParamDesc Waarde EnumDesc
*UdpRsc URO 0 Uitgeschakeld
1 (standaard) Ingeschakeld

Zie Opsommingstrefwoordenvoor meer informatie over het gebruik van opsommingstrefwoorden.

Een URO-minipoortstuurprogramma schrijven

Vanaf NDIS 6.89 faciliteert de NDIS-interface voor URO de communicatie tussen TCP/IP en het NDIS miniportstuurprogramma.

Rapportage van URO-capaciteit

Een minipoortstuurprogramma kondigt ondersteuning aan voor URO in het UdpRsc lid van de NDIS_OFFLOAD structuur, die het doorgeeft aan de NdisMSetMiniportAttributes functie.

Opvragen van URO-mogelijkheid

Om te controleren of een minipoortstuurprogramma URO ondersteunt, kunnen NDIS-stuurprogramma's en andere toepassingen een query uitvoeren op de OID_TCP_OFFLOAD_HARDWARE_CAPABILITIES OID, die de NDIS_OFFLOAD structuur retourneert.

Opvraag URO-status

Om de huidige URO-status te bepalen, kunnen NDIS-stuurprogramma's en andere toepassingen de OID_TCP_OFFLOAD_CURRENT_CONFIG OID-aanvraag opvragen. NDIS verwerkt deze OID en geeft deze niet door aan de minipoort.

URO-status wijzigen

URO kan worden ingeschakeld of uitgeschakeld door de OID_TCP_OFFLOAD_PARAMETERS OID-aanvraag uit te geven. Deze OID maakt gebruik van een NDIS_OFFLOAD_PARAMETERS structuur. In deze structuur kan het UdpRsc.Enabled lid de volgende waarden hebben:

Waarde Betekenis
NDIS_OFFLOAD_PARAMETERS_UDP_RSC_NO_CHANGE
0
Het minipoortstuurprogramma mag de huidige instelling niet wijzigen.
NDIS_OFFLOAD_PARAMETERS_UDP_RSC_DISABLED
1
URO is uitgeschakeld.
NDIS_OFFLOAD_PARAMETERS_UDP_RSC_INGESCHAKELD
2
URO is ingeschakeld.

Wanneer een stuurprogramma een OID_TCP_OFFLOAD_PARAMETERS OID-aanvraag verwerkt met de NDIS_OFFLOAD_PARAMETERS_UDP_RSC_DISABLED vlag die is ingesteld, moet de NIC wachten met het voltooien van de aanvraag totdat alle bestaande samengevoegde segmenten en openstaande URO-indicaties zijn aangegeven. Dit zorgt voor synchronisatie van URO-in-/uitschakelen gebeurtenissen tussen NDIS-onderdelen.

Nadat het minipoortstuurprogramma de OID_TCP_OFFLOAD_PARAMETERS OID-aanvraag heeft verwerkt, moet het minipoortstuurprogramma een NDIS_STATUS_TASK_OFFLOAD_CURRENT_CONFIG statusaanduiding geven met de bijgewerkte offloadstatus.

De NDIS_OFFLOAD_PARAMETERS_SKIP_REGISTRY_UPDATE vlag in NDIS_OFFLOAD_PARAMETERS maakt het uitschakelen van URO alleen voor runtime mogelijk. Wijzigingen die zijn aangebracht met deze vlag, worden niet opgeslagen in het register.

Afmelden voor URO in NDIS 6.89 en hoger

Stuurprogramma's die gericht zijn op NDIS 6.89 en hoger, moeten URO-pakketten begrijpen en op een goede manier afhandelen. Afmelden bij URO:

Deze aanpak zorgt ervoor dat onderdelen die niet bekend zijn met URO geen URO-NBL's ontvangen. NDIS schakelt URO uit op de minipoort tijdens de binding als een LWF- of protocolstuurprogramma dat geen ondersteuning biedt voor URO aanwezig is.

Programmeeroverwegingen voor URO-stuurprogramma's

Houd rekening met de volgende problemen bij het implementeren van een minipoortstuurprogramma dat geschikt is voor URO.

Winsock URO-API

Zie IPPROTO_UDP socketoptiesvoor meer informatie over de Winsock URO-API. Zie de informatie over UDP_RECV_MAX_COALESCED_SIZE en UDP_COALESCED_INFO.

Windows TCP/IP-stack-updates

Het Microsoft TCP/IP-transport maakt URO mogelijk tijdens bindtijd met NDIS, tenzij de configuratie dit voorkomt.

WFP-aankondigingen kunnen FWP_CALLOUT_FLAG_ALLOW_URO in FWPS_CALLOUT2 gebruiken om hun ondersteuning voor URO te bepalen. Als er een niet-compatibele WFP-callout is geregistreerd op een URO-gevoelige laag, schakelt het besturingssysteem URO uit zolang de callout is geregistreerd.

Als een socket zich aanmeldt voor URO met een maximale samengevoegde grootte die groter is dan of gelijk is aan de hardware-offload-grootte, zal de stack de NBL's ongewijzigd van de hardware naar de socket leveren. Als een socket zich aanmeldt voor een kleinere maximale samengevoegde grootte, breekt de stapel de samengevoegde ontvangst in de kleinere grootte voor de socket.

Als een socket zich niet aanmeldt voor URO, hersegmenteert de stack de ontvangst voor die socket. Als er geen hardware-URO is, blijft de bestaande software-URO-functie beschikbaar.