Převedení segmentace velkých paketů TCP
Miniportové ovladače rozhraní NDIS (Network Driver Interface Specification) mohou zajistit odlehčení segmentace velkých paketů TCP, které jsou větší než maximální přenosová jednotka (MTU) síťového prostředí. Síťová karta, která podporuje segmentaci velkých paketů TCP, musí být také schopná:
Výpočet kontrolních součtů PROTOKOLU IP pro odesílání paketů, které obsahují možnosti PROTOKOLU IP.
Výpočet kontrolních součtů protokolu TCP pro odesílání paketů, které obsahují možnosti protokolu TCP.
Verze NDIS 6.0 a novější podporují velké snižování zátěže odesílání dat verze 1 (LSOv1), která se podobá velkému snižování zátěže odesílání (LSO) v NDIS 5.x. NDIS verze 6.0 a novější podporují také velké odesílání s odlehčením verze 2 (LSOv2), které poskytuje rozšířené služby segmentace velkých paketů, včetně podpory IPv6.
Ovladač miniportu, který podporuje LSOv2 a LSOv1, musí určit typ offloadu z mimo pásmových (OOB) informací o struktuře NET_BUFFER_LIST. Ovladač může použít člena typu ze struktury NDIS_TCP_LARGE_SEND_OFFLOAD_NET_BUFFER_LIST_INFO k určení, zda zásobník ovladačů používá LSOv2 nebo LSOv1 a provádět příslušné služby snižování zátěže. Jakákoli NET_BUFFER_LIST struktura, která obsahuje data OOB LSOv1 nebo LSOv2, obsahuje také jednu NET_BUFFER strukturu. Další informace o NDIS_TCP_LARGE_SEND_OFFLOAD_NET_BUFFER_LIST_INFOnaleznete v tématu Informace o přístupu k přesměrování zpracování TCP/IP NET_BUFFER_LIST.
V případě, že miniport obdržel OID_TCP_OFFLOAD_PARAMETERS k vypnutí funkce LSO na miniportu, a po úspěšném dokončení této operace miniport odstraní všechny NET_BUFFER_LIST, které obsahují nenulová OOB data LSOv1 nebo LSOv2 (NDIS_TCP_LARGE_SEND_OFFLOAD_NET_BUFFER_LIST_INFO).
Přenos TCP/IP přesměruje pouze velké pakety TCP, které splňují následující kritéria:
Paket je paket TCP. Přenos TCP/IP nevykládá velké UDP pakety pro segmentaci.
Paket musí být dělitelný alespoň minimálním počtem segmentů určených ovladačem miniportu. Další informace najdete v tématu Hlášení možností LSOv1 TCP-Packet-Segmentation a Hlášení možností LSOv2 TCP-Packet-Segmentation.
Paket není smyčkový paket.
Paket se neodesílají přes tunel.
Před předáním velkého paketu TCP ke zpracování pro segmentaci přenos TCP/IP.
- Aktualizuje informace o segmentaci velkých paketů, které jsou přidružené ke struktuře NET_BUFFER_LIST. Tyto informace jsou struktura NDIS_TCP_LARGE_SEND_OFFLOAD_NET_BUFFER_LIST_INFO, která je součástí informací NET_BUFFER_LIST, jež jsou přiřazeny ke struktuře NET_BUFFER_LIST. Pro více informací o NET_BUFFER_LIST si přečtěte téma Přístup k NET_BUFFER_LIST informacím o přesměrování TCP/IP. Přenos TCP/IP nastaví hodnotu MSS na maximální velikost segmentu.
Pro LSOv1 zapíše celkovou délku velkého TCP paketu do pole
Total Length
v hlavičce IP paketu. Celková délka zahrnuje délku hlavičky PROTOKOLU IP, délku možností protokolu IP, pokud jsou k dispozici, délku hlavičky PROTOKOLU TCP, délku možností protokolu TCP, pokud jsou k dispozici, a délku datové části PROTOKOLU TCP. Pro LSOv2 nastavíTotal Length
pole hlavičky IP paketu na 0. Ovladače miniportu by měly určit délku paketu z délky první struktury NET_BUFFER ve struktuře NET_BUFFER_LIST.Vypočítá jedničkový doplněk pro pseudoheader TCP a tento součet zapíše do pole
Checksum
hlavičky TCP. Přenos TCP/IP vypočítá součet doplňku jednoho z následujících polí v pseudoheaderu:Source IP Address
,Destination IP Address
aProtocol
. Součet doplňku jedniček pro pseudoheader poskytovaný přenosem TCP/IP dává síťovému adaptéru výhodu při výpočtu skutečného TCP kontrolního součtu pro každý paket, který síťový adaptér odvozuje z velkého TCP paketu, aniž by musel zkoumat IP hlavičku. Všimněte si, že RFC 793 stanoví, že kontrolní součet pseudo-záhlaví se počítá přesSource IP Address
,Destination IP Address
,Protocol
aTCP Length
. (Délka protokolu TCP je délka hlavičky TCP plus délka datové části PROTOKOLU TCP. Délka protokolu TCP neobsahuje délku pseudo záhlaví.) Vzhledem k tomu, že základní ovladač miniportu a síťový adaptér generují segmenty TCP z velkého paketu předávaného přenosem TCP/IP, přenos nezná velikost datové části PROTOKOLU TCP pro každý segment TCP, a proto nemůže zahrnout délku protokolu TCP do pseudo záhlaví. Místo toho, jak je popsáno níže, síťová karta rozšiřuje kontrolní součet pseudo hlaviček, který byl dodán přenosem TCP/IP, aby pokrýval délku protokolu TCP každého vygenerovaného segmentu TCP.Zapíše správné pořadové číslo do pole
Sequence Number
hlavičky PROTOKOLU TCP. Pořadové číslo identifikuje první bajt datové části PROTOKOLU TCP.
Jakmile ovladač miniportu získá strukturu NET_BUFFER_LIST v jeho MiniportSendNetBufferLists nebo MiniportCoSendNetBufferLists funkce, může volat NET_BUFFER_LIST_INFO makro s _Id
TcpLargeSendNetBufferListInfo
získat hodnotu MSS zapsanou přenosem TCP/IP.
Ovladač miniportu získá celkovou délku velkého paketu z hlavičky IP paketu a použije hodnotu MSS k rozdělení velkého paketu TCP na menší pakety. 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ž bajty uživatelských dat MSS. Všechny ostatní pakety vytvořené ze segmentovaného paketu by měly obsahovat bajty uživatelských dat MSS. Pokud toto pravidlo nedodržujete, může vytváření a přenos nepotřebných nadbytečných paketů snížit výkon.
Ovladač miniportu připojuje k jednotlivým segmentům, které jsou odvozeny z velkého paketu, hlavičky MAC, IP a TCP. Ovladač miniportu musí vypočítat IP a TCP kontrolní součty pro tyto odvozené pakety. Chcete-li vypočítat kontrolní součet TCP pro každý paket odvozený z velkého paketu TCP, síťová karta vypočítá proměnnou část kontrolního součtu TCP (pro hlavičku TCP a datovou část protokolu TCP), přičte tento kontrolní součet k jednotkovému doplňku pro pseudoheader vypočítaný transportním systémem TCP/IP, a poté vypočítá 16bitový jednotkový doplněk pro kontrolní součet. Další informace o výpočtu těchto kontrolních součtů naleznete v dokumentu RFC 793 a RFC 1122.
Následující obrázek znázorňuje segmentaci velkého paketu.
Délka uživatelských dat PROTOKOLU TCP ve velkém paketu TCP by měla být rovna nebo menší než hodnota, kterou ovladač miniportu přiřadí k hodnotě MaxOffLoadSize
. Další informace o hodnotě MaxOffLoadSize
naleznete v dokumentech Oznamování schopností TCP-Packet-Segmentation LSOv1 síťové karty a Oznamování schopností TCP-Packet-Segmentation LSOv2 síťové karty.
Po vydání indikace stavu ovladačem, která označuje změnu hodnoty MaxOffLoadSize
, nesmí ovladač spadnout, pokud obdrží žádost o odeslání LSO, která používá předchozí hodnotu MaxOffLoadSize
. Místo toho může ovladač odmítnout žádost o odeslání.
Zprostředkující ovladač, který nezávisle vydává indikace stavu, které hlásí změnu hodnoty MaxOffLoadSize
, musí zajistit, aby podkladový 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 pro deaktivaci služeb LSO, musí být připraven na krátké časové období, během kterého mohou žádosti odeslání LSO stále dosáhnout ovladače miniportu.
Délka uživatelských dat protokolu TCP v segmentovém paketu musí být menší nebo rovna MSS. MSS je hodnota typu ULONG, kterou přenos TCP odesílá pomocí informace LSO NET_BUFFER_LIST, jež je přidružena ke struktuře NET_BUFFER_LIST. Pouze poslední paket vytvořený ze segmentovaného velkého paketu by měl obsahovat méně než bajty uživatelských dat MSS. Všechny ostatní pakety vytvořené ze segmentovaného paketu by měly obsahovat bajty uživatelských dat MSS. Pokud toto pravidlo nedodržujete, může vytváření a přenos nepotřebných nadbytečných paketů snížit výkon.
Počet paketů segmentů odvozených z velkého paketu TCP musí být roven nebo větší než hodnota MinSegmentCount
, která je určena ovladačem miniportu. Další informace o hodnotě MinSegmentCount
najdete v části Ohlašování schopností TCP-Packet-Segmentation LSOv1 síťové karty a Ohlašování schopností TCP-Packet-Segmentation LSOv2 síťové karty.
Následující předpoklady a omezení platí pro zpracování hlaviček PROTOKOLU IP a TCP pro jakýkoli ovladač miniportu podporující LSO bez ohledu na verzi:
Bit MF v hlavičce IP velkého paketu TCP, který byl přenesen TCP/IP transportem, nebude nastaven a fragmentační posun v hlavičce IP bude nula.
URG, RSTa SYN příznaky v hlavičce velkého TCP paketu nebudou nastaveny a naléhavý offset (ukazatel) v hlavičce TCP bude nula.
Pokud je nastaven FIN bit v hlavičce TCP velkého paketu, musí ovladač miniportu nastavit tento bit v hlavičce TCP posledního paketu, který vytvoří z velkého paketu TCP.
Pokud je nastaven PSH bit v hlavičce TCP velkého paketu TCP, musí ovladač miniportu nastavit tento bit v hlavičce TCP posledního paketu, který vytvoří z velkého paketu TCP.
Pokud je nastaven CWR bit v hlavičce PROTOKOLU TCP velkého paketu TCP, musí ovladač miniportu nastavit tento bit v hlavičce TCP prvního paketu, který vytvoří z velkého paketu TCP. Ovladač miniportu se může rozhodnout nastavit tento bit v hlavičce TCP posledního paketu, který vytvoří z velkého paketu TCP, i když je to méně žádoucí.
Pokud velký paket TCP obsahuje možnosti protokolu IP nebo možnosti protokolu TCP (nebo obojí), ovladač miniportu tyto možnosti zkopíruje bez omezení, do každého paketu odvozeného z velkého paketu TCP. Konkrétně síťová karta nepřičte volbu časového razítka.
Všechny hlavičky paketů (ethernet, IP, TCP) budou v prvním MDL paketu. Hlavičky nebudou rozděleny napříč několika MDLs.
Spropitné
Tento předpoklad je platný, pokud je povolený LSO. V opačném případě, pokud LSO není povolen, ovladače miniportu nemohou předpokládat, že hlavičky IP jsou ve stejném MDL jako ethernetové hlavičky.
Ovladač miniportu musí odesílat pakety v NET_BUFFER_LIST strukturách v pořadí, v jakém přijímá struktury NET_BUFFER_LIST z přenosu TCP/IP.
Při zpracování velkého paketu TCP je adaptér miniportu zodpovědný pouze za segmentování paketu a připojení hlaviček MAC, IP a TCP k paketům odvozeným z velkého paketu TCP. Přenos TCP/IP provádí všechny ostatní úlohy (například úpravu velikosti okna odesílání na základě velikosti okna příjmu vzdáleného hostitele).
Před dokončením operace odeslání pro velký paket (například pomocí NdisMSendNetBufferListsComplete nebo NdisMCoSendNetBufferListsComplete), ovladač miniportu zapíše hodnotu NDIS_TCP_LARGE_SEND_OFFLOAD_NET_BUFFER_LIST_INFO (NET_BUFFER_LIST informace o velkých odesílaných přenosech) s celkovým počtem bajtů uživatelských dat PROTOKOLU TCP, které byly úspěšně odeslány ve všech paketech vytvořených z velkého paketu TCP.
Kromě předchozích požadavků LSO musí ovladače miniportu podporující LSOv2 také:
Podpora IPv4 nebo IPv6 nebo IPv4 i IPv6
Podporujte replikaci možností IPv4 z velkého paketu do každého segmentového paketu, který generuje síťová karta (NIC).
Podpora replikace rozšiřující hlavičky IPv6 z velkého TCP paketu v každém segmentu TCP paketu.
Podpora replikace možností protokolu TCP v každém paketu segmentu TCP, který generuje ovladač miniportu.
Hlavičku IP a TCP ve struktuře NET_BUFFER_LIST použijte jako šablonu k vygenerování hlaviček PROTOKOLU TCP/IP pro každý paket segmentu.
Použijte hodnoty identifikace IP (IP ID) v rozsahu od 0x0000 po 0x7FFF. (Rozsah od 0x8000 do 0xFFFF je vyhrazený pro zařízení s možností offloadu TCP chimney.) Pokud například hlavička IP šablony začíná hodnotou identifikačního pole 0x7FFE, musí mít první paket segmentu TCP hodnotu 0x7FFE, po které následuje 0x7FFF, 0x0000, 0x0001 atd.
Pomocí posunu bajtů v členu TcpHeaderOffset objektu NDIS_TCP_LARGE_SEND_OFFLOAD_NET_BUFFER_LIST_INFO určete umístění hlavičky TCP počínaje prvním bajtem paketu.
Omezte počet NET_BUFFER struktur přidružených ke každé struktuře LSOv2 NET_BUFFER_LIST na jednu.
Poznámka
Jedná se o nový požadavek na ovladače miniportu podporující LSOv2. Toto pravidlo se pro ovladače miniportu LSOv1 explicitně nevynucuje, i když se doporučuje.
Určete celkovou délku paketu z délky první
NET_BUFFER
struktury ve struktuřeNET_BUFFER_LIST
. To se liší od ovladačů metody pro LSOv1.Podpora možností protokolu TCP, možností protokolu IP a hlaviček rozšíření PROTOKOLU IP.
Po dokončení operace odeslání musí ovladač miniportu nastavit
LsoV2TransmitComplete.Reserved
člen struktury NDIS_TCP_LARGE_SEND_OFFLOAD_NET_BUFFER_LIST_INFO na nulu aLsoV2TransmitComplete.Type
člen naNDIS_TCP_LARGE_SEND_OFFLOAD_V2_TYPE
.