

Makale numarası: 214397
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.
Arka planMicrosoft 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:
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.):
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:
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:
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:
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ü.
Makale numarası: 214397 - Last Review: 14 Mart 2015 Cumartesi - Gözden geçirme: 4.0
Machine-translated Article
Ö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
(https://support.microsoft.com/kb/214397/en-us/ )

