Şu anda çevrimdışısınız; İnternet'in yeniden bağlanması bekleniyor

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

ÖNEMLİ: Bu makale, Microsoft Makine Çevirisi Düzenleme yazılımı tarafından tercüme edilmiş olup, yüksek olasılıkla profesyonel bir çevirmen yerine CTF teknolojisi kullanılarak, Microsoft Topluluğu tarafından düzenlenmiştir. Microsoft, Bilgi Bankamız içindeki tüm makaleleri kendi dilinizde okuyabilmeniz için size hem profesyonel çevirmenler tarafından tercüme edilen hem de makine tarafından tercüme edildikten sonra Topluluk tarafından kontrol edilen makaleler sunar. Bununla birlikte, makine tarafından tercüme edilen, hatta Topluluk tarafından kontrol edilen bir makale bile her zaman mükemmel dil kalitesinde olmayabilir. Makalede dilinizi konuşan yabancı birisinin yapabileceği türden sözcük, söz dizimi veya dilbilgisi hataları bulunabilir. Microsoft, içeriğin hatalı tercümesinin veya müşterilerimiz tarafından kullanımının doğurabileceği olası yanlış anlamalar, hatalar veya zararlardan sorumlu değildir. Öte yandan Microsoft, Makine Çevirisi Düzenleme işlemini geliştirmek amacıyla Makine Çevirisi Düzenleme yazılımını ve araçlarını sık sık güncelleştirmektedir.

Makalenin İngilizcesi aşağıdaki gibidir: 214397
Özet
Winsock uygulamanızın tasarımı, TCP üzerinden küçük veri paketleri göndermek gerektiğinde, özellikle önemlidir. Gecikmeli alındı bildirimi, Nagle algoritma ve Winsock arabelleği etkileşim dikkate almaz bir tasarım önemli ölçüde performans efekt. Bu makalede çalışmaları sonucunda, birkaç kullanarak bu sorunları ele alır ve bir Winsock uygulamasından verimli küçük veri paketleri göndermek için öneriler bir dizi türer.
Daha fazla bilgi

Arka plan

Microsoft TCP yığınının bir veri paketini aldığında, 200 ms Gecikme Süreölçeri söner. Sonuçta bir bildirim gönderildiğinde, gecikme süreölçeri sıfırlanır ve sonraki veri paketini aldığında, başka bir 200 ms gecikme başlatır.Internet ve intranet uygulamaları verimliliği artırmak için Microsoft TCP yığınının aşağıdaki ölçütleri alınan veri paketlerinin bir bildirim göndermek ne zaman karar vermek için kullanır:
  • Gecikme süreölçerinin süresi dolmadan önce ikinci veri paket alındığında bildirim gönderilir.
  • ACK ile aynı yönde ikinci veri paket alındığında ve gecikme süreölçerin süresi önce gönderilecek verileri varsa, ACK ile veri kesimi Paketle gönderilen ve hemen gönderilir.
  • Gecikme süreölçerin süresi bittiğinde, bildirim gönderilir.
Microsoft TCP yığınının ağ congest küçük veri paketleri vermesini engellemek için birden fazla Gönder çağrıları ve önceki veri paket için bir bildirim gönderildi kadar uzak ana bilgisayardan alındığında gönderme gecikmeler küçük veri arabelleğinden coalesces varsayılan olarak, Nagle algoritma sağlar. Nagle algoritması için iki özel durumlar şunlardır:
  • Yığının en büyük iletim birimi (MTU) daha büyük bir veri arabelleği coalesced, tam donanımlı bir paket uzak ana bilgisayardan bildirim beklemeden hemen gönderilir. Bir Ethernet ağında TCP/IP MTU 1460 bayttır.
  • Böylece küçük veri paketleri gecikme olmadan uzak ana bilgisayara teslim Nagle algoritması devre dışı bırakmak için TCP_NODELAY yuva seçeneği uygulanır.
Uygulama katmanında performansı en iyi duruma getirmek için Winsock çekirdek arabellek çağrıları uygulamadan Winsock kopya veri arabellekleri gönderin. Sonra yığın kendi buluşsal yöntemler (örneğin, Nagle algoritması) aslında hat üzerinde paket koymak ne zaman belirlemek için kullanır. Winsock çekirdek arabellek (8 K varsayılan olarak öyledir) SO_SNDBUF seçeneği kullanılarak soket tahsis miktarını değiştirebilirsiniz. SO_SNDBUF arabellek boyutu fazlası gerekirse, Winsock önemli ölçüde arabellek,. Çoğu durumda, gönderme tamamlandığında uygulama yalnızca bir uygulamada veri arabelleği belirtir Çağrı Winsock çekirdek arabelleğe kopyalanır ve verileri olan ağ ortamını erişti anlamına gelmez gönderin. SO_SNDBUF 0 olarak ayarlayarak Winsock arabelleği devre dışı bıraktığınızda tek istisnadır.

Winsock gönderme tamamlandığında uygulama belirtmek için aşağıdaki kuralları kullanır (gönderme nasıl çağrıldığı bağlı olarak tamamlama bildirim olarak döndüren bir bildirim işlevi çağıran veya olay sinyal engelleme aradığında, işlev vb.):
  • Yuva hala SO_SNDBUF kota içinde Winsock uygulama Gönder verileri kopyalar ve gönderme tamamlandığında uygulama gösterir.
  • Yuva SO_SNDBUF kota ise ve yalnızca bir önceden arabelleğe alınan gönderme hala çekirdek yığını arabellek yok, Winsock uygulama Gönder verileri kopyalar ve gönderme tamamlandığında uygulama gösterir.
  • Yuva SO_SNDBUF kota olan ve daha önce arabelleğe birden fazla çekirdek yığını arabellekte göndermek varsa, Winsock uygulama Gönder verileri kopyalar. Yığın geri SO_SNDBUF kota veya yalnızca bir bekleyen gönderme koşul içinde yuva koymak için yeterli gönderir tamamlanıncaya kadar Winsock gönderme tamamlandığında uygulama olduğunu göstermez.

Case Study 1

Genel Bakış:

Winsock TCP istemci 10000 kayıtları bir veritabanında depolamak için Winsock TCP sunucu göndermek gerekiyor. Kayıtların büyüklüğüne 20 bayt 100 bayt uzunluğunda değişir. Uygulama mantığı basitleştirmek için tasarım aşağıdaki gibidir:
  • İstemci, yalnızca engelleme gönderme yapar. Sunucu, yalnızca engelleme recv yapar.
  • İstemci yuvası SO_SNDBUF 0 olarak ayarlar, böylece her kaydı tek bir veri kesimini sönüyor.
  • Sunucu bir döngüde recv arar. Her kayıt bir alınması çağrısında alınabilmesi için Al'de deftere nakledilen arabellek 200 bayttır.

Performans:

Geliştirici sınaması sırasında istemci yalnızca sunucuya saniyede beş kayıt gönderebilir bulur. Toplam 10000 kayıtları, 976 K veri bayt miktarı maksimum (10000 * 100 / 1024), sunucuya göndermek için birden fazla yarım saat sürer.

Analiz:

İstemci TCP_NODELAY seçeneği ayarlamadığı Nagle algoritması için bir ACK hat üzerinde başka bir paket göndermeden önce beklenecek TCP yığınının zorlar. Ancak, istemci SO_SNDBUF seçeneğini 0 olarak ayarlayarak Winsock arabelleği devre dışı bıraktı. Bu nedenle, 10000 çağrıları sahip gönderilmek üzere Gönder ve ACK'ed ayrı ayrı. Her bildirim Gecikmeli 200 ms çünkü sunucu TCP yığınının üzerinde aşağıdaki olaylar gerçekleşir:
  • Sunucu bir paket aldığında, 200 ms Gecikme Süreölçeri söner.
  • ACK piggybacked böylece sunucu herhangi bir şeyi geri göndermek gerekmez.
  • Önceki paket kabul edildikten sürece istemci başka bir paket göndermeyecek.
  • Sunucu üzerinde gecikme süreölçeri zaman aşımına uğrar ve geri bildirim gönderilir.

Geliştirmek nasıl:

Bu tasarım ile iki sorun vardır. İlk olarak, gecikme süreölçeri sorun yok. İstemci istemci Nagle algoritma varsayılan olarak kullandığı için iki paket 200 Bayan içinde sunucuya göndermesi gerekir, yalnızca varsayılan Winsock arabelleği kullanmak ve SO_SNDBUF 0 olarak ayarlanmamış. TCP yığınının en büyük iletim birimi (MTU) daha büyük bir arabellek coalesced sonra tam boyutlu bir paket uzak ana bilgisayardan bildirim beklemeden hemen gönderilir.

İkinci olarak, bu tasarım böyle küçük boyutta her kayıt için bir gönderme çağırır. Bu küçük dosya boyutu göndermek çok etkili değildir. Bu durumda, geliştirici 100 bayt için her kayıt defterini ve 80 kayıtları aynı anda bir istemci bilgisayardan çağrı göndermek göndermek isteyebilirsiniz. Toplam kayıt sayısını gönderilecek biliyor sunucu izin vermek için istemci iletişimi kapatmak takip etmek için kayıt sayısını içeren bir düzeltme boyutlu başlık ile başlatmak isteyebilirsiniz.

Case Study 2

Genel Bakış:

Winsock TCP istemci uygulaması iki bağlantı hisse senedi fiyatları hizmet sağlayan bir Winsock TCP sunucu uygulaması ile açılır. İlk bağlantı komut kanalı olarak hisse senedi simgesini sunucuya göndermek için kullanılır. İkinci bağlantı, bir veri kanalı hisse senedi almak için kullanılır. İki bağlantı kurduktan sonra istemci sunucu komut kanalı üzerinden bir hisse senedi sembolü gönderir ve veri kanalı geri dönmeniz hisse senedi bekler. Yalnızca ilk hisse senedi alındıktan sonra sonraki hisse senedi simgesini isteği sunucuya gönderir. İstemci ve sunucu SO_SNDBUF ve TCP_NODELAY seçenek ayarlamayın.

Performans:

Geliştirici sınaması sırasında istemci yalnızca saniyede beş teklifleri alabilir bulur.

Analiz:

Bu tasarım bir kerede yalnızca bir hisse senedi bekleyen istek izin verir. İlk hisse senedi simgesini (bağlantı) komut kanalı üzerinden sunucuya gönderilen ve bir yanıt hemen sunucudan istemciye veri kanalı (bağlantı) üzerinden gönderilir. Daha sonra istemci hemen ikinci hisse senedi simgesini isteği gönderir ve Gönder gönderme çağrı istek arabelleğinde Winsock çekirdek arabelleğe kopyalanır gibi hemen döner. Ancak, ilk üzerinden göndermek için komut kanalı henüz kabul edildikten değil hemen istemci TCP yığınının kendi çekirdek arabelleğinden isteği gönderemezsiniz. Zamanlayıcı, 200 ms gecikme sonra sunucu komut kanalı sona erecek, ACK ilk sembol isteği için istemciye geri gelir. Daha sonra ikinci bir teklif isteği 200-şu anda istemci veri kanalı olarak Gecikme Süreölçeri dolduğu için ikinci hisse senedi simgesi için bir teklif hemen veri kanalı gelir Bayan için Gecikmeli sonra sunucuya başarıyla da gönderilir. Bir ACK önceki Teklif yanıtı sunucu tarafından alındı. (İstemci 200-ms, ikinci bir hisse senedi isteği bu nedenle gecikme süreölçerinin süresi dolacak ve sunucuya bir bildirim göndermek için istemcideki saat vererek gönderilemedi olduğunu unutmayın.) Sonuç olarak, istemci ikinci Teklif yanıtı alır ve aynı döngüsü bağlı olan başka bir teklif isteği, sertifika verebilir.

Geliştirmek nasıl:

İki bağlantı (kanal) tasarım burada gereksizdir. Hisse senedi istek ve yanıt için yalnızca bir bağlantı kullanıyorsanız, teklif talebi onayı teklif yanıtta Paketle gönderilen ve hemen geri dönün. Daha fazla performansı artırmak için istemci "hisse senedi isteklerini birden çok sunucuya bir gönderme çağrı çoğullamalısınız" ve sunucu da "birden çok Teklif yanıtları istemciye bir gönderme çağrı çoğullamalısınız". İki tek yönlü kanal tasarım herhangi bir nedenden dolayı gerçekten gerekli ise, küçük paketler hemen önceki paket için bir bildirim için beklemek zorunda kalmadan gönderilebilmesi için her iki tarafın TCP_NODELAY seçeneği ayarlamalısınız.

Öneriler:

Bu iki örnek çalışmalar üretilmiş karşın, bazı en kötü durum senaryolarını açıklamak için yardımcı olurlar. Kapsamlı küçük veri kesimi içeren bir uygulama tasarlarken gönderir ve recvs, aşağıdaki yönergeleri dikkate almanız gerekir:
  • Parçaları olan veri kritik süresi değil, uygulama onları gönderme çağrı geçirmek için daha büyük bir veri bloğu içine birleşim. Gönderme arabelleği için Winsock çekirdek arabellek kopyalanacak çünkü, arabelleği çok büyük olmamalıdır. 8. K'dan biraz daha az genellikle etkilidir. Winsock Çekirdeği MTU değerinden daha büyük bir blok alır sürece, birden çok pakete tam boyutlu ve ne olursa olsun sol ile son bir paket gönderir. Son paket dışında gönderen yan 200 ms gecikme süreölçeri tarafından isabet yok. Tek sayılı bir paket olarak durumda son paket hala Gecikmeli alındı bildirimi tabi algoritmasıdır. Gönderen son yığını MTU değerinden daha büyük başka bir blokla alırsa, hala Nagle algoritması atlayabilirsiniz.
  • Mümkünse, tek yönlü veri akış soket bağlantılarıyla kaçının. Tek yönlü Yuva üzerinden iletişim daha kolay Nagle tarafından etkilenen ve bildirim algoritmaları Gecikmeli'dır. İletişimin bir istek ve yanıt akışının izliyorsa, tek soketli gönderir ve recvs ERİ yanıtta piggybacked böylece yapmak için kullanmanız gerekir.
  • Tüm küçük veri kesimleri hemen gönderilmek üzere varsa, gönderen taraftaki TCP_NODELAY seçeneğini ayarlayın.
  • Bir paket gönderme tamamlandığında, Winsock tarafından belirtilmişse, hat üzerinde gönderilir garanti istemediğiniz sürece, SO_SNDBUF sıfır olarak ayarlamamalısınız. Aslında, varsayılan 8K arabellek buluşsal olarak birçok durum için de çalışma belirlendi ve test ettikten sürece, yeni Winsock arabellek ayarı, varsayılan daha iyi performans sağlar değiştirmemelisiniz. Ayrıca, SO_SNDBUF sıfır olarak ayarlandığında çoğunlukla toplu veri aktarımı uygulamaları için yararlıdır. Daha sonra en yüksek verimlilik için çift arabelleğe alma (herhangi bir zamanda birden fazla bekleyen gönderme) ile birlikte kullanmalısınız ve çakışan g/ç.
  • UDP veri teslimi garanti edilmesi yoksa kullanın.
Referanslar
Bildirim gecikmesi ve Nagle algoritması hakkında daha fazla bilgi için lütfen bkz:

Braden, R. [1989], RFC 1122, gereksinimleri Internet ana bilgisayarları--iletişim katmanları, Internet Mühendisliği Görev Gücü.

Uyarı: Bu makalenin çevirisi otomatik olarak yapılmıştır

Özellikler

Makale No: 214397 - Son İnceleme: 03/14/2015 09:32:00 - Düzeltme: 4.0

  • kbdswnet2003swept kbapi kbinfo kbip kbnetwork kbwinsock kbmt KB214397 KbMttr
Geri bildirim