Teď jste offline a čekáte, až se znova připojí internet.

Faktory - malé datové segmenty odesílání přes TCP pomocí rozhraní Winsock

DŮLEŽITÉ: Tento článek je přeložen pomocí softwaru na strojový překlad Microsoft. Nepřesný či chybný překlad lze opravit prostřednictvím technologie Community Translation Framework (CTF). Microsoft nabízí strojově přeložené, komunitou dodatečně upravované články, a články přeložené lidmi s cílem zajistit přístup ke všem článkům v naší znalostní bázi ve více jazycích. Strojově přeložené a dodatečně upravované články mohou obsahovat chyby ve slovníku, syntaxi a gramatice. Společnost Microsoft není odpovědná za jakékoliv nepřesnosti, chyby nebo škody způsobené nesprávným překladem obsahu nebo jeho použitím našimi zákazníky. Více o CTF naleznete na http://support.microsoft.com/gp/machine-translation-corrections/cs.

Projděte si také anglickou verzi článku: 214397
Souhrn
Když budete potřebovat odeslat přes TCP malé datové pakety, je zvláště důležité návrh aplikace Winsock. K návrhu, který nebude brát v úvahu interakce opožděné potvrzení, algoritmus Nagle a ukládání do vyrovnávací paměti rozhraní Winsock mohou drasticky provést výkon. Tento článek popisuje tyto problémy pomocí několika případech studií a odvozuje řadu doporučení pro efektivní odesílání malé datové pakety z aplikace používající rozhraní Winsock.
Další informace

Pozadí

Datové pakety přijaté zásobníku Microsoft TCP časovač zpoždění 200 ms zhasne. Po potvrzení se nakonec zpoždění časovač vynulován a zahájí další datový paket další zpoždění 200 ms.Ke zvýšení efektivity v Internetové a intranetové aplikace, zásobník Microsoft TCP/IP používá následující kritéria rozhodnout, kdy odeslat jedno potvrzení o přijaté datové pakety:
  • Pokud druhý datový paket je přijat do zpoždění vypršení časovače, je odeslána PĚT.
  • Pokud jsou údaje zasílané ve stejném směru jako potvrzení před druhý datový paket je přijat a vypršení časovače zpoždění, potvrzení je zařazována složená s datový segment a odesílány okamžitě.
  • Po vypršení časovače zpoždění je odeslán PĚT.
Abyste se vyhnuli nutnosti malé datové pakety sítě congest, zásobník Microsoft TCP/IP umožňuje algoritmus Nagle ve výchozím nastavení coalesces vyrovnávací paměť pro malé data z více volání send a zpoždění odesílání že až odeslání potvrzení pro předchozí datový paket je obdržel od vzdáleného hostitele. Algoritmus Nagle dvě výjimky jsou následující:
  • Pokud zásobník má coalesced vyrovnávací paměť dat, která je větší než největší přenosovou jednotku (MTU), plné velikosti paketu odeslána okamžitě bez čekání na potvrzení ze vzdáleného hostitele. Velikost jednotky MTU protokolu TCP/IP v síti Ethernet je 1 460 bajtů.
  • Soketu možnost TCP_NODELAY působí tak, že malé datové pakety jsou dodávány se vzdáleným hostitelem neprodleně zakázat algoritmus Nagle.
Za účelem optimalizace výkonu ve vrstvě aplikací rozhraní Winsock kopií datové vyrovnávací paměti z aplikace odeslat vyrovnávací paměti jádra Winsock volání. Pak zásobníku použije vlastní heuristické metody (například algoritmus Nagle) k určení, kdy skutečně umístit paket na lince. Můžete změnit množství vyrovnávací paměti jádra Winsock přiděleny soketu pomocí možnosti SO_SNDBUF (je 8 kB ve výchozím nastavení). V případě potřeby Winsock mohou vyrovnávací paměti výrazně větší než velikost vyrovnávací paměti SO_SNDBUF. Ve většině případů znamená dokončení v aplikaci pouze vyrovnávací paměť pro data v aplikaci odeslat volání se zkopíruje do vyrovnávací paměti jádra Winsock a neznamená, že data dosáhl síťové médium. Jedinou výjimkou je, pokud zakážete rozhraní Winsock, vyrovnávací paměti SO_SNDBUF nastavíte na hodnotu 0.

Rozhraní Winsock používá následující pravidla pro označení dokončení odesílání do aplikace (v závislosti na tom, jak je vyvolána odeslat, oznámení dokončení může být funkce vrací z blokování volání, signalizace událost nebo volání funkce oznámení a podobně):
  • Pokud soket stále v rámci SO_SNDBUF kvót, Winsock zkopíruje data z aplikace odeslat a označuje dokončení odesílání do aplikace.
  • Pokud je stále ve vyrovnávací paměti zásobníku jádra pouze jeden dříve uložený ve vyrovnávací paměti odesílání soketu je nad SO_SNDBUF kvót, Winsock zkopíruje data z aplikace odeslat a označuje dokončení odesílání do aplikace.
  • Pokud soket je nad SO_SNDBUF kvót, existuje více než jeden dříve do vyrovnávací paměti odesílání v zásobníku vyrovnávací paměti jádra Winsock zkopíruje údaje z aplikace odeslat. Rozhraní Winsock neznamená ukončení odesílání do aplikace až do dokončení zásobníku dostatek odešle umístit zpět do SO_SNDBUF kvót nebo pouze jedna podmínka vynikající odesílání soketu.

Případová studie 1

Přehled:

Klient Winsock TCP potřebuje poslat 10000 záznamů na rozhraní Winsock TCP server ukládat do databáze. Velikost záznamů se liší od 20 bajtů dlouhé 100 bajtů. Pro zjednodušení aplikační logiku, je návrh:
  • Klient nemá pouze blokování odeslat. Server nemá pouze blokování přijmout.
  • Soket klienta SO_SNDBUF nastaví na hodnotu 0, tak, aby každý záznam zhasne v jeden datový segment.
  • Přijmout volání serveru ve smyčce. Zaúčtované v recv vyrovnávací paměť je 200 bajtů, tak, aby každý záznam bude moci přijmout v jedné recv volání.

Výkon:

Během testování, vývojář zjistí, že klient může pouze pět záznamů za sekundu na server odeslat. Celkový počet 10000 záznamů 976K bajtů dat maximální (10000 * 100 / 1024), trvá více než půl hodiny k odeslání na server.

Analýza:

Vzhledem k tomu, že klient nenastaví možnost TCP_NODELAY, vynutí algoritmus Nagle zásobník protokolu TCP, čekání na potvrzení před jeho odesláním dalšího paketu na lince. Klient však zakázal vyrovnávací paměti rozhraní Winsock SO_SNDBUF možnost nastavíte na hodnotu 0. Proto 10000 odesílat volání musí být odeslány a ACK'ed jednotlivě. Každé potvrzení je opožděné 200 ms, protože proběhne na zásobník protokolu TCP na serveru:
  • Pokud server obdrží paket, jeho zpoždění časovač 200 ms zhasne.
  • Na serveru není nutné odeslat zpět, nic tak nemůže být piggybacked PĚT.
  • Klient neodešle dalšího paketu, pokud předchozí paket potvrzen.
  • Vypršení časovače zpoždění na serveru a potvrzení odeslání zpět.

Jak zlepšit:

Existují dva problémy s tímto návrhem. Za prvé je problém časovač zpoždění. Klient musí být schopen odesílat pakety dvou serveru v rámci 200 ms., protože klient je ve výchozím nastavení používá algoritmus Nagle, by měla pomocí vyrovnávací paměti rozhraní Winsock výchozí a SO_SNDBUF není nastavena na hodnotu 0. Jakmile je zásobník protokolu TCP má coalesced vyrovnávací paměti větší než největší přenosovou jednotku (MTU), plné velikosti paketu odesílány okamžitě bez čekání na potvrzení ze vzdáleného hostitele.

Za druhé tento návrh volá odesílání jeden pro každý záznam takové malé velikosti. Odeslání malé velikosti je velmi efektivní. V tomto případě vývojář chtít doplnit každý záznam na 100 bajtů a zaslal 80 záznamů najednou z jednoho klienta odeslat volání. Aby server vědět, kolik záznamů budou odeslány celkem vhodné sdělení začněte oprava velikosti záhlaví obsahující počet záznamů, postupujte podle klienta.

Případová studie 2

Přehled:

Klientské aplikace rozhraní Winsock TCP otevře dvě připojení aplikace Winsock TCP server poskytující služby akcií. První připojení slouží jako kanál příkazů burzovní symbol odeslat na server. Druhé připojení slouží jako datový kanál pro příjem akcií. Poté, co byly stanoveny dvě připojení klient odešle na server přes kanál příkazů burzovní symbol a čeká akcií vraťte zpět prostřednictvím datového kanálu. Odešle další požadavek burzovní symbol server poté, co byla přijata první akcií. Klient a server není nastavena možnost SO_SNDBUF a TCP_NODELAY.

Výkon:

Během testování, vývojář zjistí, že klient může získat pouze pět nabídek za sekundu.

Analýza:

Tento návrh umožňuje najednou pouze jednu žádost nesplacených akcií. První burzovní symbol je odeslán na server přes kanál příkazů (připojení) a je ihned odeslána odpověď zpět ze serveru klientovi prostřednictvím datového kanálu (připojení). Potom klient okamžitě odešle další požadavek burzovní symbol a odeslat vrátí okamžitě jako vyrovnávací paměti požadavek odeslat volání je zkopírován do vyrovnávací paměti jádra Winsock. Zásobník protokolu TCP klient však nelze odeslat požadavek z vyrovnávací paměti jádra okamžitě, protože první odeslání přes kanál příkazů není dosud potvrzen. Po 200-ms zpoždění časovač na kanál příkazů serveru vyprší, potvrzení žádosti první symbol pochází zpět klientovi. Pak druhý požadavek nabídky je úspěšně odeslány na server po zpoždění 200 ms., který nabídku pro druhý burzovní symbol vracejí okamžitě prostřednictvím datového kanálu protože v tuto chvíli zpoždění časovač na datový kanál klienta vypršela. Server obdrží potvrzení odpovědi na předchozí nabídku. (Nezapomeňte, že klient nemůže odeslat žádost o druhé akcií 200 ms, a umožňuje tak čas zpoždění časovač na straně klienta a končí na server odeslat potvrzení.) V důsledku toho klient získá odpověď druhé nabídky a vydat další požadavek nabídky, která je předmětem stejného cyklu.

Jak zlepšit:

Zde je zbytečné návrh dvou připojení (kanál). Pokud používáte pouze jedno připojení pro akcií požadavek a odpověď, potvrzení požadavku nabídky lze zařazována složená na odpověď na nabídku a okamžitě vrátit. K dalšímu zlepšení výkonu, klient může "multiplex" více akcií požadavků do jednoho volání odeslat na server a server může také "multiplex" více odpovědí na nabídky do jednoho volání odeslat klientovi. Návrh dvou jednosměrných kanál je z nějakého důvodu skutečně nezbytné, obě strany nastavte možnost TCP_NODELAY tak, aby malé pakety mohou být odesílány okamžitě bez čekání na potvrzení předchozí paketu.

Doporučení:

Zatímco tyto dvě případové studie jsou vyrobeny, pomáhají znázorňují některé nejhorší scénáře případu. Při navrhování aplikace, která zahrnuje rozsáhlou malý datový segment odešle a recvs, zvažte následující pokyny:
  • Pokud data, která jsou segmenty čas není kritická, aplikace by měla funkce coalesce je do většího bloku dat odeslat volání předat. Vyrovnávací paměť pro odesílání je pravděpodobné, že budou zkopírovány do vyrovnávací paměti jádra Winsock, a proto by neměl být příliš velké vyrovnávací paměti. Trochu méně než 8 kB je obvykle účinná. Jako jádra Winsock získá větší než je velikost jednotky MTU blok, odešle více plné velikosti paketů a poslední paket s čímkoliv, co je vlevo. Odesílající straně, s výjimkou poslední paket nebude zasažení časovač zpoždění 200 ms. Poslední paket, pokud se stane být paket liché, je stále algoritmus opožděné potvrzení. Odesílání zásobníku end získá jiného bloku větší než je velikost jednotky MTU, je stále obejít algoritmus Nagle.
  • Pokud je to možné Vyhněte se připojení soketu s jednosměrnými datový tok. Komunikace přes jednosměrný sokety jsou mnohem snadněji ovlivněny Nagle a opožděné potvrzení algoritmy. Pokud sdělení následuje požadavek a odpověď toku, byste měli použít jediný socket provést odeslání a recvs tak, že potvrzení můžete piggybacked na odpověď.
  • Pokud všechny malé datové segmenty odesílány okamžitě, nastavte možnost TCP_NODELAY na straně odesílání.
  • Pokud chcete zaručit, že paket je odeslán na lince po dokončení odesílání je označen rozhraní Winsock, neměli SO_SNDBUF nastaví na nulu. Ve skutečnosti výchozí vyrovnávací paměť 8 kb heuristicky stanovila pro práci i pro většinu situací a neměli byste ji měnit pokud testování, aby nové nastavení vyrovnávací paměti rozhraní Winsock poskytuje lepší výkon než výchozí. Nastavení SO_SNDBUF na nulu je také většinou užitečné u aplikací, které hromadný přenos dat. Pro maximální účinnost i pak by jej použít ve spojení s dvojité ukládání do vyrovnávací paměti (více než jeden vynikající v daném okamžiku odeslání) a překrývající vstupně-výstupní.
  • Pokud doručení dat nemusí být zaručena, pomocí protokolu UDP.
Odkazy
Další informace o zpožděné potvrzení a algoritmus Nagle naleznete v následujících tématech:

Braden, R. [1989] RFC 1122, požadavky na Internet Hosts--komunikační vrstvy Internet Engineering Task Force pracovní.

Upozornění: Tento článek je přeložený automaticky

Vlastnosti

ID článku: 214397 - Poslední kontrola: 03/14/2015 05:28:00 - Revize: 4.0

  • kbdswnet2003swept kbapi kbinfo kbip kbnetwork kbwinsock kbmt KB214397 KbMtcs
Váš názor
ipt type="text/JavaScript" async=""> var varAutoFirePV = 1; var varClickTracking = 1; var varCustomerTracking = 1; var Route = "76500"; var Ctrl = ""; document.write("