Sdílet prostřednictvím


Odlehčení segmentace UDP (USO)

Vyložení segmentace UDP (USO), podporované ve Windows 10 ve verzi 2004 a novějších, je funkce, která umožňuje síťovým kartám vyložit segmentaci datagramů UDP, které jsou větší než maximální přenosová jednotka (MTU) sítě. Systém Windows tak snižuje využití procesoru spojené se zpracováním TCP/IP paketů. Požadavky na USO se podobají velkého odkládání odeslání verze 2 (LSOv2), což je určeno pro TCP přenosový protokol.

Požadavky pro USO

Tato část se týká především protokolů NDIS a ovladačů miniportu. Ovladače zjednodušeného filtru NDIS (LWFs) musí dodržovat požadavky ovladače protokolu při úpravě nebo odesílání paketů a mohou také předpokládat, že všechny pakety poskytované obslužné rutině FilterSendNetBufferLists splňují požadavky ovladače protokolu.

Ovladače miniportu mohou předat zpracování segmentace velkých UDP paketů, které přesahují MTU síťového média. Síťová karta, která podporuje segmentaci velkých paketů UDP, musí také být schopná provést následující akce:

  • Výpočet kontrolních součtů IP pro odeslané pakety, které obsahují možnosti protokolu IPv4
  • Výpočet kontrolních součtů UDP pro odeslané pakety

Ovladač miniportu, který podporuje USO, musí určit typ snižování zátěže z informací mimo strukturu pásma (OOB) NET_BUFFER_LIST. Pokud je hodnota struktury NDIS_UDP_SEGMENTATION_OFFLOAD_NET_BUFFER_LIST_INFO nenulová, musí ovladač miniportu provést USO. Všechny NET_BUFFER_LIST, které obsahují data USO OOB, také obsahují jednu strukturu NET_BUFFER. V případě, že ovladač miniportu obdržel příkaz OID_TCP_OFFLOAD_PARAMETERS vypnout USO, poté, co ovladač miniportu úspěšně dokončí OID, by měl odmítnout a vrátit všechny NET_BUFFER_LIST, které mají nastaveno pole USO OOB.

Přenos TCP/IP přesměruje pouze pakety UDP, které splňují následující kritéria:

  • Paket je paket UDP.
  • Délka paketu musí být větší než maximální velikost segmentu (MSS) * (MinSegmentCount - 1).
  • Pokud ovladač miniportu nenastaví schopnost SubMssFinalSegmentSupported, musí být každý velký paket UDP offloadovaný přenosem Length % MSS == 0. To znamená, že velký paket je rozdělitelný na N paketů, přičemž každý segment paketu obsahuje přesně MSS uživatelských bajtů. Pokud ovladač miniportu nastaví schopnost SubMssFinalSegmentSupported, pak se tato podmínka dělitelnosti paketů v přenosu nepoužije. Jinými slovy, konečný segment může být menší než MSS.
  • Paket není smyčkový paket.
  • MF bit v hlavičce IP velkého UDP paketu, který transport TCP/IP offloadoval, nebude nastaven a Posun fragmentu v hlavičce IP bude mít hodnotu nula.
  • Aplikace určila UDP_SEND_MSG_SIZE/WSASetUdpSendMessageSize.

Před přesměrováním velkého paketu UDP pro segmentaci provede přenos TCP/IP následující:

  • Aktualizuje informace o segmentaci velkých paketů, které jsou přidružené ke struktuře NET_BUFFER_LIST. Tyto informace jsou strukturou NDIS_UDP_SEGMENTATION_OFFLOAD_NET_BUFFER_LIST_INFO, která je součástí informací OOB ve struktuře NET_BUFFER_LIST. Přenos TCP/IP nastaví hodnotu MSS na požadovanou msS.
  • Vypočítá doplněk jednoho doplňku pro pseudoheader UDP a zapíše tento součet do pole Checksum záhlaví UDP. Přenos TCP/IP vypočítá součet těchto polí v pseudoheaderu: Zdrojová IP adresa, cílová IP adresa a protokol.

Součet doplňku pro pseudoheader poskytovaný přenosem TCP/IP dává síťovému adaptéru náskok ve výpočtu skutečného kontrolního součtu UDP pro každý paket, který adaptér odvozuje z velkého paketu UDP, aniž by bylo nutné zkoumat IP hlavičku.

Všimněte si, že RFC 768 a RFC 2460 stanoví, že pseudoheader se vypočítá přes zdrojovou IP adresu, cílovou IP adresu, protokol a délku UDP (délka hlavičky UDP a délka datové části UDP, nikoli včetně délky pseudoheader). Vzhledem k tomu, že základní ovladač miniportu a síťový adaptér generují datagramy UDP z velkého paketu předávaného přenosem TCP/IP, přenos nezná velikost datové části UDP pro každý datovýgram UDP, a proto nemůže zahrnout délku UDP do výpočtu pseudoheaderu. Místo toho, jak je popsáno v následující části, síťová karta rozšiřuje pseudoheaderový kontrolní součet, který byl dodán přenosem TCP/IP, aby pokrýval délku každého vygenerovaného datagramu UDP.

Důležitý

Pokud je pole kontrolního součtu hlavičky UDP poskytnuté přenosem TCP/IP nula, síťová karta by neměla provádět výpočet kontrolního součtu UDP.

Odesílání paketů pomocí USO

Jakmile ovladač miniportu získal NET_BUFFER_LIST ve své MiniportSendNetBufferLists zpětné volací funkci, může volat makro NET_BUFFER_LIST_INFO s argumentem _IdUdpSegmentationOffloadInfo, aby získal hodnotu MSS a IP protokol.

Ovladač miniportu získá celkovou délku velkého paketu z délky první struktury NET_BUFFER a použije hodnotu MSS k rozdělení velkého paketu UDP na menší pakety UDP. Každý z menších paketů obsahuje MSS nebo méně bajtů uživatelských dat. Pouze poslední paket vytvořený ze segmentovaného velkého paketu by měl obsahovat méně než MSS bajty uživatelských dat. Všechny ostatní pakety vytvořené ze segmentovaného paketu musí obsahovat MSS bajty uživatelských dat. Pokud ovladač miniportu nevyhovuje tomuto pravidlu, datagramy UDP se nesprávně doručí. Pokud ovladač miniportu nenastavil schopnost SubMssFinalSegmentSupported, pak je délka paketu vydělena MSS a segmentovaný každý paket obsahuje MSS uživatelských bajtů.

Ovladač miniportu připojuje hlavičky MAC, IP a UDP ke každému segmentu odvozenému z velkého paketu. Ovladač miniportu musí vypočítat kontrolní součty protokolů IP a UDP pro tyto odvozené pakety. Chcete-li vypočítat kontrolní součet UDP pro každý paket odvozený z velkého paketu UDP, síťová karta vypočítá proměnnou část kontrolního součtu UDP (pro hlavičku UDP a datovou část UDP), přidá tento kontrolní součet do součtu doplňku pro pseudoheader vypočítaný přenosem TCP/IP a pak vypočítá 16bitový doplněk pro kontrolní součet. Další informace o výpočtu těchto kontrolních součtů viz RFC 768 a RFC 2460.

Délka uživatelských dat UDP ve velkém paketu UDP musí být menší nebo rovna hodnotě, kterou ovladač miniportu přiřadí MaxOffLoadSize.

Jakmile ovladač vydá indikaci stavu označující změnu MaxOffLoadSize, ovladač nesmí způsobit kontrolu chyb, pokud obdrží žádost o odeslání LSO, která používá předchozí hodnotu MaxOffLoadSize. Místo toho musí ovladač zamítnout odeslání požadavku. Ovladače musí odmítnout jakýkoli požadavek na odeslání, který nemohou splnit, z jakéhokoli důvodu (včetně velikosti, minimálního počtu segmentů, možností protokolu IP atd.). Řidiči musí co nejdříve odeslat indikaci stavu, pokud se jejich schopnosti změní.

Zprostředkující ovladač, který nezávisle vydává indikace stavu, které hlásí změnu hodnoty MaxOffLoadSize, musí zajistit, aby základní adaptér miniportu, který nevystavil indikaci stavu, nezíská žádné pakety, které jsou větší než MaxOffLoadSize hodnota, kterou nahlásil adaptér miniportu.

Dočasný ovladač miniportu, který reaguje na OID_TCP_OFFLOAD_PARAMETERS vypnout služby USO, musí být připravený na malé časové období, kdy žádosti USO mohou stále dosáhnout ovladače miniportu.

Počet segmentačních paketů odvozených z velkého paketu UDP musí být roven nebo větší než hodnota MinSegmentCount, která je určena ovladačem miniportu.

Při zpracování velkého paketu UDP zodpovídá ovladač miniportu pouze za segmentování paketu a připojování hlaviček MAC, IP a UDP k paketům odvozeným z velkého paketu UDP. Pokud se miniportu nepodaří odeslat alespoň jeden segmentovaný paket, musí být nakonec dokončen s chybovým stavem. Miniport může pokračovat v odesílání následných paketů, ale není k tomu potřeba. NBL se nemůže vrátit k NDIS, dokud se všechny segmentované pakety nepřenesou nebo neselžou.

Ovladače miniportu podporující USO musí také provést následující:

  • Podpora IPv4 i IPv6
  • Podpora replikace možností IPv4 z velkého paketu v každém segmentovaném paketu, který síťová karta generuje.
  • Hlavičku IP a UDP v NET_BUFFER_LIST struktuře použijte jako šablonu k vygenerování hlaviček UDP a IP pro každý segmentovaný paket.
  • Použijte hodnoty IDENTIFIKACE IP (IP ID) v rozsahu od 0x0000 po 0xFFFF. Pokud například hlavička ip adresy šablony začíná hodnotou identifikačního pole 0xFFFE, musí mít první paket datagramu UDP hodnotu 0xFFFE, následovanou 0xFFFF, 0x0000, 0x0001atd.
  • Pokud velký paket UDP obsahuje možnosti PROTOKOLU IP, ovladač miniportu tyto možnosti zkopíruje bez omezení do každého paketu odvozeného z velkého paketu UDP.
  • Pomocí posunu bajtu v členu UdpHeaderOffsetNDIS_UDP_SEGMENTATION_OFFLOAD_NET_BUFFER_LIST_INFO určete umístění hlavičky UDP, počínaje prvním bajtem paketu.
  • Zvýšení statistik přenosu na základě segmentovaných paketů. Uveďte například počet bajtů záhlaví ethernetu, IP a UDP pro každý segment paketů, a počet paketů je dán počtem segmentů o velikosti MSS, nikoli 1.
  • Nastavte pole celkové délky protokolu UDP a délky IP adres na základě každé segmentované velikosti datagramu.

Změny rozhraní NDIS

Tato část popisuje změny v NDIS 6.83, které umožňují hostitelskému zásobníku TCP/IP využívat možnosti USO poskytované ovladači miniportu.

NDIS a ovladač miniportu provádějí následující:

  • Uveďte, že síťová karta podporuje funkci USO
  • Povolit nebo zakázat USO
  • Získání aktuálního stavu funkcí USO

Reklamní funkce USO

Ovladače miniportu uvádějí schopnost USO vyplněním UdpSegmentation pole struktury NDIS_OFFLOAD, která se předává v parametrech NdisMSetMiniportAttributes. Pole Header.Revision ve struktuře NDIS_OFFLOAD musí být nastaveno na NDIS_OFFLOAD_REVISION_6 a pole Header.Size musí být nastaveno na NDIS_SIZEOF_NDIS_OFFLOAD_REVISION_6.

Dotazování stavu USO

Aktuální stav USO lze dotazovat pomocí OID_TCP_OFFLOAD_CURRENT_CONFIG. NDIS tento identifikátor OID zpracovává a nepředává ho ovladači miniportu.

Změna stavu USO

UsO lze povolit nebo zakázat pomocí OID_TCP_OFFLOAD_PARAMETERS. Jakmile ovladač miniportu zpracuje identifikátor OID, musí odeslat indikaci stavu NDIS_STATUS_TASK_OFFLOAD_CURRENT_CONFIG s aktualizovaným stavem offloadu.

Klíčová slova pro USO

Klíčová slova výčtu USO jsou následující:

  • *UsoIPv4
  • *UsoIPv6

Tyto hodnoty popisují, jestli je pro tento konkrétní protokol IP povolený nebo zakázaný usO. Nastavení USO není závislé na konfiguraci NDIS_TCP_IP_CHECKSUM_OFFLOAD. Například zakázání *UDPChecksumOffloadIPv4 implicitně nezakazuje *UsoIPv4.

Název podklíče Popis parametru Hodnota Popis výčtu
*UsoIPv4 USO (IPv4) 0 Invalidní
1 Povolený
*UsoIPv6 USO (IPV6) 0 Invalidní
1 Povoleno