Sdílet prostřednictvím


Segmentové slučování příjmu UDP pro odlehčení zátěže (URO)

Počínaje Windows 11, verze 24H2, funkce shlukování segmentů příjmu UDP (URO) umožňuje síťovým kartám (NIC) shlukovat UDP přijímací segmenty. Síťové karty mohou spojovat datagramy UDP ze stejného proudu, který odpovídá sadě pravidel, do logicky souvislé vyrovnávací paměti. Tyto kombinované datagramy se pak označí v síťovém zásobníku Windows jako jeden velký paket.

Spojování datagramů UDP snižuje náklady na zpracování procesorem pro zpracování paketů v tocích s velkou šířkou pásma, což vede k vyšší propustnosti a menšímu počtu cyklů na bajt.

Následující části popisují pravidla pro slučování paketů UDP a jak napsat ovladač miniportu URO.

Pravidla pro spojování paketů UDP

URO se může pokoušet pouze o pakety, které splňují všechna následující kritéria:

  • IpHeader.Version je stejná pro všechny pakety.
  • IpHeader.SourceAddress a IpHeader.DestinationAddress jsou stejné pro všechny pakety.
  • UdpHeader.SourcePort a UdpHeader.DestinationPort jsou stejné pro všechny pakety.
  • UdpHeader.Length je stejná pro všechny pakety s výjimkou posledního paketu, který může být menší.
  • UdpHeader.Length musí být nenulové.
  • UdpHeader.Checksum, pokud není nula, musí být ve všech paketech správná. To znamená, že přijímané odlehčení kontrolního součtu musí ověřit paket.
  • Layer 2 headers musí být identické pro všechny pakety.

Pokud jsou pakety IPv4, musí splňovat také následující kritéria:

  • IPv4Header.Protocol == 17 (UDP) pro všechny pakety.
  • EthernetHeader.EtherType == 0x0800 pro všechny pakety.
  • IPv4Header.HeaderChecksum přijatých paketů musí být správné. Toto znamená, že při příjmu musí checksum offload ověřit hlavičku.
  • IPv4Header.HeaderLength == 5 (bez hlaviček možností IPv4) pro všechny pakety.
  • IPv4Header.ToS je stejná pro všechny pakety.
  • IPv4Header.ECN je stejná pro všechny pakety.
  • IPv4Header.DontFragment je stejná pro všechny pakety.
  • IPv4Header.TTL je stejná pro všechny pakety.
  • IPv4Header.TotalLength == UdpHeader.Length* + délka(IPv4Header) pro všechny pakety.

Pokud jsou pakety IPv6, musí splňovat také následující kritéria:

  • IPv6Header.NextHeader == 17 (UDP) pro všechny pakety (bez hlaviček rozšíření).
  • EthernetHeader.EtherType == 0x86dd (IPv6) pro všechny pakety.
  • IPv6Header.TrafficClass a IPv6Header.ECN jsou stejné pro všechny pakety.
  • IPv6Header.FlowLabel je stejná pro všechny pakety.
  • IPv6Header.HopLimit je stejná pro všechny pakety.
  • IPv6Header.PayloadLength == UdpHeader.Length pro všechny pakety.

Struktura paketů URO

Výsledná jednotka vzniklá sloučením (SCU) musí mít jednu hlavičku IP a jednu hlavičku UDP, za kterou následuje datová část UDP pro všechny sloučené datagramy zřetězené dohromady.

Indikace URO musí nastavit IPv4Header.TotalLength pole na celkovou délku SCU, IPv6Header.PayloadLength pole na délku datové části UDP a UdpHeader.Length pole na délku sloučených datových částí.

Pokud jsou hlavičky vrstvy 2 (L2) přítomné ve sloučených datovýchgramech, musí scU obsahovat platnou hlavičku L2. Hlavička L2 v SCU musí vypadat podobně jako hlavička L2 spojených datagramů.

Ověření kontrolního součtu a indikace

Indikace URO musí nastavit pole IPv4Header.HeaderChecksum a UdpHeader.Checksum na nulu a vyplnit informace o mimořádném zpracování kontrolního součtu na SCU, které označují úspěch kontrolního součtu pro IPv4 a UDP.

Paket, který odpovídá všem podmínkám pro sloučení, ale neprojde kontrolou kontrolního součtu, musí být označen samostatně. Pakety přijaté po jejich přijetí nesmí být sloučeny s pakety přijatými před ním.

Předpokládejme například, že pakety 1, 2, 3, 4 a 5 se přijímají ze stejného toku, ale paket 3 selže s ověřením kontrolního součtu. Pakety 1 a 2 mohou být sloučeny dohromady a pakety 4 a 5 mohou být sloučeny dohromady, ale paket 3 nesmí být sloučen s žádným SCU. Pakety 1 a 2 nesmí být sloučeny společně s pakety 4 a 5. Paket 2 je poslední paket v SCU a paket 4 spustí novou SCU. Kromě toho musí být SCU obsahující pakety 1 a 2 označeny předtím, než je označen paket 3, a paket 3 musí být označen před SCU obsahujícím pakety 4 a 5.

Sloučení paketů a oddělení toků

Pakety z více toků lze sloučit paralelně, pokud to hardware a paměť umožňují. Pakety z různých toků nesmí být sloučeny dohromady.

Pakety z více přijímů, které jsou prokládány, lze oddělit a sloučit s odpovídajícími datovými toky. Pokud například pakety dorazí v pořadí A, A, B, C, B, A, pak pakety z toku A mohou být sloučeny do AAA, pakety z toku B spojeny do BB, zatímco pakety z toku C mohou být indikovány normálně nebo sloučeny s čekající SCU z toku C.

Pakety v daném toku se nesmí přeřazovat jeden vůči druhému. Například pakety z toku A musí být sloučeny v přijatém pořadí bez ohledu na pakety z toků B a C přijatých mezi nimi.

Klíčové slovo INF pro řízení URO

Následující klíčové slovo lze použít k povolení nebo zakázání URO s nastavením klíče registru:

  • *UdpRsc

Standardizovaná INF klíčová slova výčtu mají následující atributy:

  • SubkeyName: Název klíčového slova, které je nutné zadat v souboru INF a který se zobrazí v registru.

  • ParamDesc: Zobrazovaný text přidružený k názvu podklíče.

  • Hodnota: Celočíselná hodnota výčtu přidružená k jednotlivým možnostem v seznamu. Tato hodnota je uložena v NDI\params\SubkeyName\Value.

  • EnumDesc: Zobrazovaný text přidružený ke každé hodnotě, která se zobrazí v nabídce.

  • Výchozí: Výchozí hodnota nabídky.

Název podklíče ParamDesc Hodnota EnumDesc
*UdpRsc URO 0 Invalidní
1 (výchozí) Povoleno

Další informace o použití klíčových slov výčtu naleznete v klíčová slova výčtu.

Napsání ovladače miniportu URO

Od verze NDIS 6.89 usnadňuje rozhraní NDIS pro URO komunikaci mezi tcp/IP a ovladačem miniportu NDIS.

Schopnost reportu URO

Ovladač miniportu inzeruje podporu URO v členu struktury UdpRscNDIS_OFFLOAD, kterou předává funkci NdisMSetMiniportAttributes.

Dotaz na schopnosti URO

Pokud chcete zkontrolovat, jestli ovladač miniportu podporuje URO, ovladače NDIS a další aplikace mohou dotazovat OID_TCP_OFFLOAD_HARDWARE_CAPABILITIES OID, který vrátí strukturu NDIS_OFFLOAD.

Dotazovat stav URO

Pokud chcete určit aktuální stav URO, NDIS ovladače a další aplikace mohou dotazovat OID_TCP_OFFLOAD_CURRENT_CONFIG OID požadavek. NDIS zpracovává tento identifikátor OID a nepředává ho do miniportu.

Změna stavu URO

URO je možné povolit nebo zakázat vydáním požadavku identifikátoru OID_TCP_OFFLOAD_PARAMETERS. Tento identifikátor OID používá NDIS_OFFLOAD_PARAMETERS strukturu. V této struktuře může člen UdpRsc.Enabled mít následující hodnoty:

Hodnota Význam
NDIS_OFFLOAD_PARAMETERS_UDP_RSC_NO_CHANGE
0
Ovladač miniportu by neměl měnit aktuální nastavení.
NDIS_OFFLOAD_PARAMETERS_UDP_RSC_DISABLED
1
URO je zakázáno.
NDIS_OFFLOAD_PARAMETERS_UDP_RSC_ENABLED
2
URO je povoleno.

Když ovladač zpracuje požadavek OID_TCP_OFFLOAD_PARAMETERS identifikátoru s nastaveným příznakem NDIS_OFFLOAD_PARAMETERS_UDP_RSC_DISABLED, musí síťová karta počkat na dokončení požadavku, dokud nejsou indikovány všechny existující sloučené segmenty a nevyřízené indikace URO. Tím se zajistí synchronizace událostí povolení/zakázání URO napříč komponentami NDIS.

Jakmile ovladač miniportu zpracuje požadavek OID_TCP_OFFLOAD_PARAMETERS identifikátoru, musí ovladač miniportu vydat informace o stavu NDIS_STATUS_TASK_OFFLOAD_CURRENT_CONFIG s aktualizovaným stavem snižování zátěže.

Příznak NDIS_OFFLOAD_PARAMETERS_SKIP_REGISTRY_UPDATE v NDIS_OFFLOAD_PARAMETERS umožňuje zakázat URO pouze za běhu. Změny provedené tímto příznakem se neuloží do registru.

Výslovný nesouhlas s URO ve verzi NDIS 6.89 a novější

Ovladače, které cílí na NDIS 6.89 a novější, by měly pochopit pakety URO a správně je zpracovat. Odhlášení z URO:

Tento přístup zajišťuje, že komponenty, které nejsou obeznámeny s URO, neobdrží URO NBLs. NDIS zakáže URO na miniportu během vazby, pokud je k dispozici LWF nebo ovladač protokolu, který nepodporuje URO.

Aspekty programování pro ovladače URO

Při implementaci ovladače miniportu s podporou URO zvažte následující problémy.

Winsock URO API

Informace o rozhraní API Winsock URO naleznete v tématu IPPROTO_UDP soketové možnosti. Viz informace o UDP_RECV_MAX_COALESCED_SIZE a UDP_COALESCED_INFO.

Aktualizace zásobníku protokolu TCP/IP systému Windows

Protokol Microsoft TCP/IP umožňuje funkci URO během navázání spojení s NDIS, pokud tomu konfigurace nezabrání.

Vyvolání WFP mohou v FWP_CALLOUT_FLAG_ALLOW_UROFWPS_CALLOUT2 propagovat podporu URO. Pokud je nekompatibilní volání WFP registrováno na vrstvě citlivé na URO, operační systém zakáže URO, zatímco je volání registrováno.

Pokud se soket přihlásí k URO s maximální velikostí sloučení, která je větší nebo rovna velikosti snížení zátěže na hardware, pak zásobník doručí NBLs z hardwaru nezměněné do soketu. Pokud soket zvolí menší maximální sloučenou velikost, zásobník rozdělí sloučený příjem na menší části odpovídající této velikosti soketu.

Pokud se soket nepřihlásí k URO, pak síťový zásobník znovu segmentuje přijatá data pro tento soket. Bez hardwarového URO je stávající funkce URO softwaru nadále k dispozici.