Návrh odesílání segmentů malé dat přes TCP s Winsock problémy

Překlady článku Překlady článku
ID článku: 214397 - Produkty, které se vztahují k tomuto článku.
Rozbalit všechny záložky | Minimalizovat všechny záložky

Na této stránce

Souhrn

Když potřebujete odesílat pakety malé dat přes TCP je zvláště důležité návrh aplikace Winsock. Návrh nebere do účtu interakce opožděné potvrzení, Nagle algoritmus a ukládání do vyrovnávací paměti Winsock může významně efektu výkonu. Tento článek popisuje několik případů studie pomocí těchto problémů a odvozuje řadu doporučení pro efektivní odesílání paketů malou dat z aplikace Winsock.

Další informace

Základní informace

Obdrží datový paket Microsoft TCP zásobníku přejde časovač zpoždění 200 ms. Nakonec odeslán potvrzení, časovače zpoždění je obnovit a zahájí jiného 200 ms zpoždění při přijetí paketu další data. Zásobník Microsoft TCP zvýšit efektivitu v Internetu a intranetu aplikací používá rozhodnout při odeslání jednoho ACK na pakety přijaté dat následující kritéria:
  • Pokud druhý datový paket je přijata před vypršením časovače zpoždění, je odeslána potvrzení.
  • Pokud jsou data odeslána ve stejném směru jako potvrzení před druhý datový paket přijat a vypršení časovače zpoždění, ACK piggybacked segmentu dat a odesílány okamžitě.
  • Po vypršení časovače zpoždění je odeslána potvrzení.
Vyhnout malé datové pakety congest sítě Microsoft TCP zásobníku povolí algoritmus Nagle ve výchozím nastavení (coalesces vyrovnávací paměť malé dat z více odeslat volání a zpoždění odesílání, dokud nebude odeslána ACK pro předchozí paket dat je obdržel ze vzdáleného hostitele. Jsou dvě výjimky algoritmus Nagle:
  • Pokud zásobníku má coalesced větší než největší přenosovou jednotku (MTU) dat vyrovnávací paměti, plné velikosti paketu je odeslána okamžitě bez čekání na potvrzení ze vzdáleného hostitele. MTU TCP/IP v síti Ethernet je 1460 bajtů.
  • Zakázat algoritmus Nagle, takže malé datové pakety jsou doručovány do vzdáleného hostitele bez zpoždění je použita možnost soketu TCP_NODELAY.
Optimalizace výkonu aplikace vrstvě Winsock kopií datové vyrovnávací paměti z aplikace odesílat volání vyrovnávací paměti jádra Winsock. V zásobníku pak použije vlastní heuristiku (jako je například algoritmus Nagle) určit, kdy skutečně umístit podél paketu. Můžete změnit množství vyrovnávací paměti jádra Winsock přidělené soketu pomocí možnosti SO_SNDBUF (je 8 kB ve výchozím nastavení). Vyrovnávací v případě potřeby Winsock mohou paměti podstatně více, než velikost vyrovnávací paměti SO_SNDBUF. Ve většině případů dokončení odesílání v aplikaci pouze označuje vyrovnávací paměť dat v aplikaci odeslat volání je zkopírován do vyrovnávací paměti jádra Winsock a neznamená, že data byla přístupů síťové médium. Jedinou výjimkou je při zakázat ukládání do vyrovnávací Winsock paměti nastavením SO_SNDBUF 0.

Winsock používá následující pravidla k označení dokončení odesílání do aplikace (v závislosti na způsobu vyvolán odeslání, oznámení dokončení může být funkce návratem z blokování volání signalizaci události nebo volání funkce oznámení a tak dále):
  • Pokud je soket stále v rámci SO_SNDBUF kvót, Winsock zkopíruje data z aplikace odesílat a označuje dokončení odesílání do aplikace.
  • Pokud je soketu nad SO_SNDBUF kvót a je pouze jeden dříve ve vyrovnávací paměti odesílání stále v zásobníku jádra vyrovnávací Winsock zkopíruje data z aplikace odesílat a označuje dokončení odesílání do aplikace.
  • Pokud existuje více než jeden dříve vyrovnávací paměti odeslat v zásobníku jádra vyrovnávací soketu přesahuje kvótu SO_SNDBUF, Winsock zkopíruje data z aplikace odesílat. Winsock neznamená dokončení odesílání do aplikace, dokud zásobníku dokončí dostatek odešle umístit soketu v SO_SNDBUF kvót nebo pouze jedna podmínka nevyřízené odeslat.

Studium případ 1

Přehled:

Klient Winsock TCP potřebuje odeslat 10000 záznamy Winsock TCP serveru ukládat do databáze. Velikost záznamy se liší od 20 bajtů dlouhé 100 bajtů. Zjednodušení aplikační logiku návrhu je následující:
  • Klient provede pouze blokování odeslat. Server provede pouze blokování recv.
  • Soket klienta SO_SNDBUF nastaví na hodnotu 0, takže zhasne každý záznam v jedné datového segmentu.
  • Server zavolá recv ve smyčce. Zaúčtována recv vyrovnávací paměti je 200 bajtů, takže každý záznam můžete přijaté v jedné recv volání.

performance:

Během testování, vývojář vyhledá klient mohl odeslat pouze pět záznamů za sekundu na server. Celkový 10000 záznamy, s maximální na 976 kB bajtů dat (10000 * 100 / 1024), trvá více než polovinu hodinovou odeslat na server.

Analýza:

Protože klient nenastaví možnost TCP_NODELAY, vynutí algoritmus Nagle zásobníku TCP ACK čekat před jiný paket může poslat podél. Klient má však zakázána, ukládání do vyrovnávací Winsock paměti nastavením možnost SO_SNDBUF 0. Proto 10000 volá odesílání mají být odeslány a ACK'ed jednotlivě. Každé potvrzení je zpožděné 200 ms, protože následující dochází na serveru TCP zásobníku:
  • Když server získá paket, přejde jeho časovač zpoždění 200 ms.
  • Server nemusí odeslat zpět, nic, tak potvrzení nemůže být piggybacked.
  • Klient neodešle jiný paket Pokud předchozí paket potvrzen.
  • Platnost časovače zpoždění na serveru a odeslal zpět potvrzení.

Jak zlepšit:

Existují dva problémy s Tento návrh. První je problém časovač zpoždění. Klient potřebuje být schopen odeslat dva pakety serveru v rámci 200 ms., protože klient používá ve výchozím nastavení algoritmus Nagle, měli pouze použití vyrovnávací paměti výchozí Winsock a SO_SNDBUF není nastaven na 0. Po zásobníku TCP má coalesced větší než největší přenosovou jednotku (MTU) vyrovnávací paměti, plné velikosti paketu je odeslána okamžitě bez čekání na potvrzení ze vzdáleného hostitele.

Tento návrh, převezme volání odeslat jeden pro každý záznam takové malá velikost. Odesílání malé velikosti není velmi efektivní. V tomto případě vývojář chtít pro každý záznam 100 bajtů zapisování a odeslat 80 záznamy současně z jednoho klienta odesílat volání. Aby server vědět, kolik záznamů budou odeslány celkem klienta vhodné spustit vypnout komunikace s oprava velikosti záhlaví obsahující počet záznamů postupujte.

Studium Case 2

Přehled:

Aplikace klienta Winsock TCP otevře dvě připojení s aplikací serveru Winsock TCP poskytování služby akcií. První připojení se používá jako kanál příkazů odeslat burzovní symbol server. Druhé připojení slouží jako datový kanál přijímat akcií. Po navázání dvě připojení klient odešle serveru příkaz kanálem burzovní symbol a čeká akcií vrátit prostřednictvím kanálu data. Odešle další požadavek burzovní symbol serveru pouze po přijetí první akcií. Klient a server není nastavena možnost SO_SNDBUF a TCP_NODELAY.

performance:

Během testování, vývojář vyhledá klient mohl získat pouze pět nabídek za sekundu.

Analýza:

Tento návrh umožňuje současně pouze jeden požadavek nevyřízené akcií. První burzovní symbol je odeslána na server pomocí příkazu kanálu (připojení) a je ihned odeslána odpověď ze serveru na klienta přes kanál dat (připojení). Potom klient okamžitě odešle požadavek druhé burzovní symbol a odesílání vrátí okamžitě jako vyrovnávací paměť požadavek v odesílání volání je zkopírován do vyrovnávací paměti jádra Winsock. Zásobník TCP klienta 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í potvrzena ještě. Po 200 ms zpoždění časovačem kanál příkazů serveru vyprší, ACK první symbol požadavek pochází zpět klientovi. Potom druhý požadavek nabídky je úspěšně odeslány na server po právě zpožděn pro 200 ms. the nabídku pro druhý burzovní symbol pochází zpět okamžitě prostřednictvím kanálu dat protože v tomto okamžiku zpoždění časovačem datový kanál klienta vypršela. Server obdržel potvrzení pro předchozí odpověď nabídku. (Nezapomeňte, že klient nemohl odeslat druhý požadavek akcií pro 200 ms tedy poskytující čas pro časovač zpoždění na klientovi vyprší a potvrzení odeslat na server.) Výsledkem je klient dostane odpověď druhé nabídku a vystavovat další požadavek nabídky, které podléhají stejným cyklu.

Jak zlepšit:

Zde je zbytečné návrh dvě připojení (kanál). Pokud použijete pro akcií požadavku a odpovědi pouze jedno připojení, můžete piggybacked odpověď nabídku a vrátíte okamžitě ACK požadavek nabídku. Dále zvýšit výkon klienta by "multiplex" více akcií požadavků do jednoho volání odesílání na server a server by také "multiplex" více odpovědí nabídku do jedno volání odeslat klientovi. Je skutečně nezbytné z nějakého důvodu návrh dvě jednosměrný kanál, obě strany měli nastavit možnost TCP_NODELAY tak, že malé pakety mohou být odesílány okamžitě bez čekání na potvrzení pro předchozí paket.

Doporučení:

Zatímco jsou tyto dva případové studie fabricated, pomáhají znázorňují některé nejhorší scénáře případu. Při návrhu aplikace, která zahrnuje segmentu rozsáhlé malé dat odešle a recvs, měli byste zvážit následující pokyny:
  • Pokud jsou segmenty dat čas není důležité, coalesce jejich do větší bloku dat předat odeslat volání by aplikace. Protože vyrovnávací paměť pro odesílání je pravděpodobně zkopírovány do vyrovnávací paměti jádra Winsock, by neměl být vyrovnávací paměť příliš velký. Trochu bitu menší než 8 K je obvykle efektivní. Jako jádra Winsock získá blok větší než MTU, bude odesílat více plné velikosti paketů a poslední paket s jakoukoli vlevo. Boční odesílající kromě posledního paketu není přístupů podle zpoždění časovač 200 ms. Poslední paket případě být paket liché je stále podléhají algoritmus opožděné potvrzení. Odesílání zásobníku end získá jiného bloku větší než MTU, mohou stále obejít algoritmus Nagle.
  • Pokud je to možné Vyhněte se s tok dat Jednosměrná připojení soketu. Komunikace přes jednosměrný sokety jsou více snadno dopad Nagle a zpoždění algoritmy potvrzení. Pokud komunikace následuje požadavek a odpověď toku, měli proveďte odešle a recvs tak, aby potvrzení můžete piggybacked na odpověď pomocí jediné soketu.
  • Pokud malé datové segmenty odesílány okamžitě, nastavit možnost TCP_NODELAY na straně odesílání.
  • Pokud chcete zaručit paket je odeslán podél při dokončení odesílání je označen Winsock, není SO_SNDBUF byste měli nastavit na nulu. Ve skutečnosti vyrovnávací paměti 8 kb výchozí byla heuristicky zjistil pracovat dobře pro většinu situací a není vhodné měnit jej Pokud jste testovány, nové nastavení vyrovnávací paměti Winsock umožňuje lepší výkon než výchozí. Nastavení SO_SNDBUF nula je také většinou výhodná pro přenos dat hromadně aplikace. I poté pro maximální efektivity by ji použít ve spojení s dvojité ukládání do vyrovnávací paměti (více než jedna nevyřízená odesílání dané kdykoli) a překryty I/O.
  • Pokud doručení dat nemá být zaručeno, použijte UDP.

Odkazy

Další informace o potvrzení zpožděné a algoritmus Nagle naleznete následující:

Braden R. 1989, RFC 1122, Requirements for Internet Hosts--Layers komunikace Internet Engineering Task Force.

Vlastnosti

ID článku: 214397 - Poslední aktualizace: 11. července 2005 - Revize: 3.1
Informace v tomto článku jsou určeny pro produkt:
  • Microsoft Platform Software Development Kit-January 2000 Edition
Klíčová slova: 
kbmt kbdswnet2003swept kbapi kbinfo kbip kbnetwork kbwinsock KB214397 KbMtcs
Strojově přeložený článek
Důležité: Tento článek byl přeložen pomocí software společnosti Microsoft na strojový překlad, ne profesionálním překladatelem. Společnost Microsoft nabízí jak články přeložené překladatelem, tak články přeložené pomocí software na strojový překlad, takže všechny články ve Znalostní databázi (Knowledge Base) jsou dostupné v češtině. Překlad pomocí software na strojový překlad ale není bohužel vždy dokonalý. Obsahuje chyby ve skloňování slov, skladbě vět, nebo gramatice, podobně jako když cizinci dělají chyby při mluvení v češtině. Společnost Microsoft není právně zodpovědná za nepřesnosti, chyby nebo škody vzniklé chybami v překladu, nebo při použití nepřesně přeložených instrukcí v článku zákazníkem. Společnost Microsoft aktualizuje software na strojový překlad, aby byl počet chyb omezen na minimum.
Projděte si také anglickou verzi článku:214397

Dejte nám zpětnou vazbu

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com