Tasarım sorunları - Winsock ile TCP üzerinden gönderme küçük veri kesimleri

Makale çevirileri Makale çevirileri
Makale numarası: 214397 - Bu makalenin geçerli olduğu ürünleri görün.
Hepsini aç | Hepsini kapa

Bu Sayfada

Özet

Tasarım, <a0>Winsock</a0> uygulamasının TCP üzerinden küçük veri paketlerini göndermek istediğinizde, özellikle önemlidir. Gecikmiş bir bildirim, Nagle algoritmasını ve Winsock arabelleği etkileşim dikkate alınmadığı BIR tasarım performansı büyük efekt. Bu makalede, servis taleplerini çalışmalar, birkaç kullanarak, bu sorunlar açıklanır ve küçük veri paketleri, etkin bir Winsock uygulamasından göndermek için bir dizi türetir.

Daha fazla bilgi

Arka plan

Microsoft TCP yığını, bir veri paketini aldığında, 200 ms bir gecikme süreölçeri söner. Bir ACK sonunda gönderildiğinde, gecikme süreölçer sıfırlanır ve sonraki veri paketini aldığında, başka bir 200 ms gecikme başlatır. ınternet ve intranet uygulamaları verimliliğini artırmak için <a0></a0>, alınan veri paketlerinin üzerinde bir ACK göndermek, karar vermek için aşağıdaki ölçütleri Microsoft TCP yığını kullanır:
  • Gecikme süreölçeri süresi dolmadan önce ikinci veri paket alındığında, ACK gönderilir.
  • ACK olarak aynı yönde ikinci veri paket alındığında ve gecikme Süreölçerinin süresi dolmadan önce gönderilecek verileri varsa, the ACK ile veri kesimi piggybacked ve hemen gönderilir.
  • Gecikme süreölçerin süresi bittiğinde, the ACK gönderilir.
Ağ congest küçük veri paketlerini olması önlemek için <a0></a0>, varsayılan olarak bir küçük bir veri arabelleğini birden çok gönderme çağrıları ve önceki veri paketi için bir ACK gönderilen kadar uzak ana bilgisayardan alınan gönderme gecikmeler coalesces Nagle algoritması Microsoft TCP yığını sağlar. Nagle algoritması için iki kural dışı durumlar şunlardır:
  • Yığının en büyük iletim birimi (MTU) daha büyük bir veri arabelleğini coalesced, uzak ana bilgisayardan ACK beklemeden tam donanımlı bir paketin hemen gönderilir. Ethernet ağında, TCP/ıp MTU 1460 bayttır.
  • TCP_NODELAY yuva seçeneği Nagle algoritması, böylece küçük veri paketlerini gecikme olmadan uzak ana teslim edilir, devre dışı bırakmak için uygulanır.
Uygulama katmanında performansını en iyi duruma getirmek için <a0></a0>, bir <a0>Winsock</a0> çekirdek arabellek çağrıları Winsock kopya veri arabellekleri uygulamadan gönderin. Sonra yığın, paketin ağ üzerinde gerçekte koymak ne zaman belirlemek için (örneğin, Nagle algoritma) kendi buluşsal yöntemlerini kullanır. Yuva (8 K varsayılan olarak) SO_SNDBUF seçeneğini kullanarak tahsis Winsock çekirdek Arabellek miktarı değiştirebilirsiniz. SO_SNDBUF arabellek boyutu birden gerekirse, Winsock önemli ölçüde arabellek. Çoğu durumda, gönderme tamamlandığında uygulamadaki yalnızca uygulama verilerini arabellekte gösterir çağrı Winsock çekirdek arabelleğe kopyalanır ve bu verileri ağ ortamını erişti belirtmek gönderin. Tek özel durum 0 olarak SO_SNDBUF ayarlayarak Winsock arabelleği devre dışı olur.

Winsock, uygulama için bir gönderme tamamlandığında belirtmek için aşağıdaki kuralları kullanır (gönderme nasıl çağrılır bağlı olarak, tamamlanma bildirim olay sinyal ya da bir bildirim işlevi çağrılırken bir engelleyici çağrısından, döndüren işlev olabilir ve benzeri):
  • Yuva hala SO_SNDBUF kotası, Winsock uygulama Gönder ' verileri kopyalar ve uygulamasına gönderme tamamlandığında gösterir.
  • Yuva SO_SNDBUF kota ve hala yığın çekirdek arabellekte tek bir önceden arabelle?e al?nm?? gönderme yoktur, Winsock uygulama Gönder ' verileri kopyalar ve uygulamasına gönderme tamamlandığında gösterir.
  • Yuva SO_SNDBUF kotası olan ve daha önce arabelleğe birden fazla çekirdek yığını arabellekte göndermek varsa, Winsock verileri uygulama gönderme kopyalar. Yığında yeterli gönderirse, yuva SO_SNDBUF kota veya yalnızca bir bekleyen gönderme koşul içindeki geri koymak tamamlanıncaya kadar Winsock gönderme tamamlandığında uygulamaya göstermez.

Case Study (1

GENEL BAKIŞ:

Bir veritabanında depolamak için Winsock TCP sunucuya 10000 kayıtları Winsock TCP istemci gerekir. Kayıt boyutu, 100 bayt uzunluğunda 20 bayt değişir. Uygulama mantığı basitleştirmek için <a0></a0>, tasarım şöyledir:
  • Istemci, engelleme gönderme yapar. Sunucunun engelleyici recv yapar.
  • Istemci yuvası, SO_SNDBUF 0 olarak ayarlar, böylece her kayıt bir tek bir veri kesimini gider.
  • Sunucu, bir döngüde recv arar. Böylece, her kayıt bir recv çağrısında alınan recv deftere nakledilen arabellek 200 bayttır.

Performans:

Sınama sırasında istemci yalnızca sunucuya saniyede beş kayıt gönderebilir, geliştirici bulur. Toplam 10000 kayıtları, veri 976 K bayt üst sınırı (10000 * 100 / 1024), sunucuya göndermek için birden fazla yarım saatte bir alır.

Çözümleme:

Istemci TCP_NODELAY seçeneğini ayarlamak için Nagle algoritması için bir ACK ağ başka bir paket göndermeden önce beklenecek TCP yığını zorlar. Ancak, istemci 0 olarak SO_SNDBUF seçeneği ayarlayarak Winsock arabelleği devre dışı. Bu nedenle, 10000 tek tek gönderilmesini sağlamak ve ACK'ed gönderme çağırır. Her ACK Gecikmeli 200 ms çünkü sunucu TCP yığında aşağıdaki olaylar gerçekleşir:
  • Sunucu, bir paket aldığında, kendi 200 ms gecikme süreölçeri söner.
  • ACK piggybacked şekilde sunucu herhangi bir şeyi yeniden göndermek gerekli değildir.
  • Istemci, önceki paket onaylanmaz sürece başka bir paket göndermeyecek.
  • Sunucudaki gecikme süreölçerin süresi ve ACK geri gönderilir.

Geliştirme nasıl kurulur:

Bu tasarım iki sorun bulunmaktadır. Önce gecikme süreölçeri sorunu var. Istemci, istemcinin Nagle algoritması varsayılan olarak kullandığı için iki paket içinde 200 ms. sunucusuna gönderebilmek gereken, ve yalnızca Winsock varsayılan arabelleğe almayı kullan SO_SNDBUF 0 olarak ayarlayın. TCP yığını en büyük iletim birimi (MTU) daha büyük bir arabellek coalesced bir kez tam donanımlı bir paket için bir uzak ana bilgisayardan ACK beklemeden hemen gönderilir.

Ikinci olarak, bu tasarım gibi küçük bir boyutta her kayıt için bir gönderme çağırır. Bu boyutu küçük göndermek, çok etkili değildir. Bu durumda, geliştirici, her kayıt için 100 bayt yazma ve bir istemci aynı anda 80 kayıtları çağrı göndermek isteyebilirsiniz. Sunucunun kaç kaydın Toplam gönderilen öğrenmek için <a0></a0>, istemci iletişimi devre dışı izlemek için kayıt sayısını içeren bir düzeltme boyutlu başlığını başlatmak isteyebilirsiniz.

Case Study (2

GENEL BAKIŞ:

Winsock ve TCP istemci uygulaması, hisse senedi fiyatlarını hizmeti Winsock TCP sunucu uygulamasıyla iki bağlantı açar. Ilk bağlantı bir komut kanalı, hisse senedi simgesini sunucuya göndermek için kullanılır. Ikinci bağlantı, bir veri kanalı hisse senedi almak için kullanılır. Iki bağlantı kurulduktan sonra istemci, sunucu komut kanalı üzerinden bir hisse senedi simgesini gönderir ve veri kanalı geri dönmeniz hisse bekler. Yalnızca ilk hisse alındı sonra sonraki hisse senedi simgesini isteği sunucuya gönderir. Istemci ve sunucu SO_SNDBUF TCP_NODELAY seçeneğini ayarlayın.

Performans:

Sınama sırasında istemci yalnızca almak saniyede beş teklifleri, geliştirici bulur.

Çözümleme:

Bu tasarım, bir defada yalnızca bir hisse bekleyen isteği verir. Ilk hisse senedi simgesini komut kanalı (bağlantı) aracılığıyla sunucuya gönderilir ve yanıt hemen geri sunucudan istemciye veri kanalı (bağlantı) gönderilir. Sonra istemci ikinci hisse senedi simgesini isteği hemen gönderir. ve çekirdek arabelleğe Winsock send çağrı istek arabelleğinde olarak gönderme hemen döner. Ancak, istemci TCP yığını ilk gönderme üzerinden olduğundan komut kanalı henüz onaylanmaz değil hemen, çekirdek arabelleğinden isteği gönderemezsiniz. Süreölçer adresindeki 200 ms geciktirmek sonra sunucu komut kanalı sona, ilk simge isteğin ACK, istemciye geri gelir. Sonra ikinci teklifi isteği başarıyla sunucuya 200-şu anda gecikme süreölçeri istemci veri kanalı sırasında süresi dolduğundan, teklif için ikinci hisse senedi simgesini hemen veri kanalı ile gelir ms. için Gecikmeli sonra gönderilir. Sunucu tarafından bir ACK önceki teklif yanıt alındı. (Istemci 200 ms, ikinci bir hisse senedi isteği için gecikme süreölçeri zaman aşımına ve bir ACK sunucuya göndermek için istemci üzerindeki, dolayısıyla zaman verme gönderemedi olduğunu unutmayın.) Sonuç olarak, istemci, ikinci teklif yanıt alır ve aynı döngüsüne olan başka bir teklifi isteği yayımlayabilir.

Geliştirme nasıl kurulur:

Burada iki bağlantı (kanal) tasarım gereksizdir. Hisse senedi isteği ve yanıtı için yalnızca bir bağlantı kullanıyorsanız, teklifi isteği için ACK teklif yanıtta piggybacked ve olması hemen geri dönebilirsiniz. Daha fazla performansını artırmak için <a0></a0>, istemci "birden çok hisse senedi isteği sunucuya bir gönderme çağrıya multiplex" ve sunucu da "birden çok teklif yanıtları istemciye bir gönderme çağrıya multiplex". Iki tek yönlü kanal tasarım herhangi bir nedenle gerçekten gerekiyorsa, her iki küçük paketlere hemen bir ACK önceki paket için beklemek zorunda kalmadan gönderilebilecek böylece TCP_NODELAY seçeneği ayarlamanız gerekir.

Öneri:

Bu iki örnek çalışmaları için üretilmiş karşın, bazı kötü Durum senaryolarını göstermek için yardımcı olurlar. Geniş küçük bir veri kesimini içeren bir uygulama tasarlarken gönderir ve recvs, aşağıdaki yönergeleri dikkate almalısınız:
  • Veri kesimleri olan kritik zaman, uygulama bunları gönderme çağrısı geçirmek için daha büyük bir veri bloğu halinde birleşim. Gönderme arabelleği için Winsock çekirdek arabellek kopyalanacak çünkü, arabelleği çok büyük olmamalıdır. 8 K biraz biraz küçüktür genellikle etkilidir. Winsock çekirdek bloğu alır MTU değerinden daha büyük olduğu sürece, tam boyutlu birden çok pakete ve son paketin ne kaldığını miktar ile gönderir. Gönderen yan dışında son paket 200 ms gecikme süreölçeri tarafından isabet değil. Tek sayılı bir paket için durumda, son paket hala Gecikmeli bildirim algoritma tabi olur. Gönderen son yığını MTU değerinden daha büyük başka bir blokla alırsa, hala Nagle algoritması atlayabilirsiniz.
  • Olanaklıysa, tek yönlü veri akışı Yuva bağlantı kaçının. Tek yönlü yuvaları üzerinden iletişim daha kolay tarafından Nagle etkilenen ve bildirim algoritmaları Gecikmeli ' dir. Istek ve yanıt akış iletişimi izler, böylece yanıtta ACK piggybacked gönderirse hem de recvs yapmak için tek bir yuva kullanmanız gerekir.
  • Tüm küçük veri kesimleri hemen gönderilmek üzere, gönderen son TCP_NODELAY seçeneğini ayarlayın.
  • Bir gönderme tamamlandığında, Winsock tarafından belirtilmişse, bir paketin ağ üzerinde gönderilen garanti istemiyorsanız, the SO_SNDBUF sıfıra ayarlamalısınız değil. Aslında, birçok durum için iyi bir çözüm için varsayılan 8 K arabellek buluşsal olarak belirlenmiştir ve test edinceye sürece, bu yeni Winsock arabellek ayarınız, varsayılan daha iyi performans sağlar değiştirmemelisiniz. Ayrıca, SO_SNDBUF sıfıra ayarlanıyor çoğunlukla veri aktarımı toplu ve uygulamaları için yararlıdır. Daha sonra en yüksek verimlilik için (bir anda birden fazla bekleyen gönderme) arabelleği çift ile birlikte kullanmalısınız ve g/Ç çakışan.
  • Veri teslimi garanti gerekmez, UDP'yi kullanın.

Referanslar

Gecikmeli bildirim ve Nagle algoritması hakkında daha fazla bilgi için lütfen bkz:

Braden, R] [1989, RFC 1122, gereksinimler için ınternet ana bilgisayarları – iletişim katmanları, ınternet Engineering Task Force.

Özellikler

Makale numarası: 214397 - Last Review: 11 Temmuz 2005 Pazartesi - Gözden geçirme: 3.1
Bu makaledeki bilginin uygulandığı durum:
  • Microsoft Platform Software Development Kit - Ocak 2000 Sürümü
Anahtar Kelimeler: 
kbmt kbdswnet2003swept kbapi kbinfo kbip kbnetwork kbwinsock KB214397 KbMttr
Machine-translated Article
ÖNEMLİ: Bu makale, bir kişi tarafından çevrilmek yerine, Microsoft makine-çevirisi yazılımı ile çevrilmiştir. Microsoft size hem kişiler tarafından çevrilmiş, hem de makine-çevrisi ile çevrilmiş makaleler sunar. Böylelikle, bilgi bankamızdaki tüm makalelere, kendi dilinizde ulaşmış olursunuz. Bununla birlikte, makine tarafından çevrilmiş makaleler mükemmel değildir. Bir yabancının sizin dilinizde konuşurken yapabileceği hatalar gibi, makale; kelime dağarcığı, söz dizim kuralları veya dil bilgisi açısından yanlışlar içerebilir. Microsoft, içeriğin yanlış çevrimi veya onun müşteri tarafından kullanımından doğan; kusur, hata veya zarardan sorumlu değildir. Microsoft ayrıca makine çevirisi yazılımını sıkça güncellemektedir.
Makalenin İngilizcesi aşağıdaki gibidir:214397

Geri Bildirim Ver

 

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