Bazı paket kaybını tolere edebilen genel protokol mesajı değişimi için. TCP üzerinden UDP ne kadar daha verimlidir?
Bazı paket kaybını tolere edebilen genel protokol mesajı değişimi için. TCP üzerinden UDP ne kadar daha verimlidir?
Yanıtlar:
UDP TCP'den daha hızlıdır ve bunun basit nedeni, TCP pencere boyutu ve gidiş-dönüş süresi kullanılarak hesaplanan bir paket kümesini onaylayan TCP yerine sürekli bir paket akışına izin veren var olmayan onay paketinin (ACK) olmasıdır. (RTT).
Daha fazla bilgi için basit ama çok anlaşılır Skullbox açıklamasını öneriyorum (TCP ve UDP)
İnsanlar TCP'nin size verdiği en önemli şeyin güvenilirlik olduğunu söylüyor. Ama bu gerçekten doğru değil. TCP'nin size verdiği en önemli şey tıkanıklık kontrolüdür: bir DSL bağlantısı üzerinden tümü maksimum hızda giden 100 TCP bağlantısı çalıştırabilirsiniz ve 100 bağlantı da üretken olacaktır, çünkü bunların tümü kullanılabilir bant genişliğini "algılar". 100 farklı UDP uygulamasıyla, tüm paketleri olabildiğince hızlı iterek deneyin ve işlerin sizin için ne kadar iyi çalıştığını görün.
Daha büyük ölçekte, bu TCP davranışı, İnternet'in "tıkanıklık çöküşü" ne kilitlenmesini engelleyen şeydir.
Uygulamaları UDP'ye yönlendirme eğilimi gösteren şeyler:
Grup dağıtım semantiği: bir grup insana TCP'nin noktadan noktaya onayından çok daha verimli bir şekilde güvenilir teslimat yapmak mümkündür.
Sıra dışı teslimat: birçok uygulamada, tüm verileri aldığınız sürece hangi sırayla geldiğini umursamazsınız; sıra dışı bir bloğu kabul ederek uygulama düzeyinde gecikmeyi azaltabilirsiniz.
Düşmanlık: Bir LAN partisinde, ağınızdaki güncellemeleri olabildiğince hızlı bir şekilde karıştırdığınız sürece web tarayıcınızın iyi çalışıp çalışmadığını önemsemeyebilirsiniz.
Ancak performansı önemseseniz bile, muhtemelen UDP ile gitmek istemezsiniz:
Şu anda güvenilirlik için çalışıyorsunuz ve güvenilirliği uygulamak için yapabileceğiniz birçok şey TCP'nin zaten yaptığından daha yavaş olabilir.
Artık ağ dostu değilsiniz, bu da paylaşılan ortamlarda sorunlara neden olabilir.
En önemlisi, güvenlik duvarları sizi engelleyecektir.
Birden fazla TCP bağlantısını birlikte "kısaltarak" bazı TCP performansı ve gecikme sorunlarının üstesinden gelebilirsiniz; iSCSI bunu yerel alan ağlarında tıkanıklık kontrolü yapmak için yapar, ancak düşük gecikmeli "acil" bir mesaj kanalı oluşturmak için de yapabilirsiniz (TCP'nin "ACİL" davranışı tamamen bozulur).
listen
-> accept
-> istemci durumu doğal olarak diğer istemcilerden bağımsızdır). Özellikle tek bir istemciden birden fazla bağlantıyı yönetmek UDP ile boğuk bir hal alır. Ve UDP'nin lehine bir nokta, UDP yığınlarının uygulanması gerçekten kolay. ve düşünmeyin).
Bazı uygulamalarda TCP, UDP'den daha hızlıdır (daha iyi verim).
Bu, MTU boyutuna göre çok sayıda küçük yazma yaparken geçerlidir. Örneğin, Ethernet (1500 bayt MTU) üzerinden 300 bayt paket akışının gönderildiği ve TCP'nin UDP'den % 50 daha hızlı olduğu bir deneyi okudum .
Bunun nedeni, TCP'nin veriyi arabelleğe alması ve tam bir ağ segmentini doldurması ve böylece mevcut bant genişliğini daha verimli kullanmasıdır.
Öte yandan UDP, paketi hemen kabloya koyar, böylece ağı çok sayıda küçük paketle tıkar.
Bunun için çok özel bir nedeniniz yoksa muhtemelen UDP kullanmamalısınız. Özellikle Nagle algoritmasını devre dışı bırakarak TCP'ye UDP ile aynı tür bir gecikme süresi verebildiğiniz için (örneğin, gerçek zamanlı sensör verilerini iletiyorsanız ve ağı çok sayıda küçük paketle doldurmaktan endişe etmiyorsanız).
kayıp toleranslı
Şunu mu demek istediniz: "kayıp toleranslı"?
Temel olarak, UDP "zarara toleranslı" değildir. Birine 100 paket gönderebilirsiniz ve bu paketlerin yalnızca 95'ini alabilir ve bazıları yanlış sırada olabilir.
Bir videoyu kaçırmanın daha iyi olduğu video akışı ve çok oyunculu oyun gibi şeyler için arkasındaki diğer tüm paketleri ertelemekten daha iyidir, bu bariz bir seçimdir
Yine de diğer birçok şey için, eksik veya 'yeniden düzenlenmiş' bir paket kritiktir. Bir şeyler kaçırılırsa yeniden denemek ve doğru siparişi uygulamak için UDP'nin üstünde çalıştırmak için fazladan bir kod yazmanız gerekir. Bu, bazı yerlerde biraz ek yük getirecektir.
Neyse ki, bazı çok akıllı insanlar bunu yaptılar ve TCP olarak adlandırdılar.
Şöyle düşünün: Bir paket kaybolursa, bir sonraki paketi olabildiğince çabuk almayı ve devam etmeyi (UDP kullan) mı yoksa eksik verilere mi (TCP kullan) ihtiyacınız var mı? Gerçekten son derece senaryoda olmadığınız sürece ek yük önemli değil.
Hangi protokolün daha iyi performans gösterdiğini (verim açısından) - UDP veya TCP - gerçekten ağ özelliklerine ve ağ trafiğine bağlıdır. Örneğin Robert S. Barnes, TCP'nin daha iyi performans gösterdiği bir senaryoya dikkat çekiyor (küçük boyutlu yazılar). Şimdi, ağın tıkalı ve hem TCP hem de UDP trafiğine sahip olduğu bir senaryo düşünün. Ağdaki TCP kullanan göndericiler 'tıkanıklığı' algılar ve gönderme hızlarını düşürür. Bununla birlikte, UDP'nin tıkanıklıktan kaçınma veya tıkanıklık kontrol mekanizmaları yoktur ve UDP kullanan gönderenler aynı oranda veri pompalamaya devam edecektir. Yavaş yavaş, TCP göndericileri gönderme hızlarını minimum seviyeye düşürür ve UDP gönderenlerinin ağ üzerinden gönderilmesi için yeterli veri varsa, kullanılabilir bant genişliğinin çoğunu kayarlar. Yani, böyle bir durumda, UDP gönderenleri, ağ bant genişliğinin büyük pastalarını aldıklarından daha fazla verime sahip olacaklar. Aslında, bu aktif bir araştırma konusudur - UDP trafiği varlığında TCP verimi nasıl geliştirilir. Biliyorum ki, hangi TCP uygulamalarının verimi artırabileceğini kullanmak, birden fazla TCP bağlantısı açmaktır. Bu şekilde, her TCP bağlantısının verimi sınırlı olsa da, tüm TCP bağlantılarının toplam verimi, UDP kullanan bir uygulamanın veriminden daha büyük olabilir.
"Ne hızlı" dan bahsederken - en az iki çok farklı yönü vardır: iş hacmi ve gecikme.
Hakkında konuşuyorsanız throughput - TCP'nin akış kontrolü (diğer yanıtlar belirtildiği gibi), kesinlikle mümkün iken, bir Big Başağrısı (tm) olurdu, son derece önemli ve UDP üzerinden karşılaştırılabilir bir şey yapıyor olduğunu. Sonuç olarak - verime ihtiyacınız olduğunda UDP kullanmak nadiren iyi bir fikir olarak nitelendirilir (TCP'ye haksız avantaj elde etmek istemiyorsanız).
Ancak, gecikmeler hakkında konuşursanız - her şey tamamen farklıdır. Paket kaybının yokluğunda TCP ve UDP son derece benzer davranırlar (varsa, marjinal olmak üzere herhangi bir fark) - paket kaybolduktan sonra, tüm desen büyük ölçüde değişir.
Herhangi bir paket kaybından sonra, TCP en az 200 msn yeniden iletimi bekleyecektir (RFC6298'in 2.4 paragrafı başına 1 saniye, ancak pratik modern uygulamalar onu 200 ms'ye düşürme eğilimindedir). Dahası, TCP ile, hedef ana bilgisayara ulaşan paketler bile - eksik paket alınana kadar uygulamanıza teslim edilmeyecektir (yani, tüm iletişim ~ 200ms geciktirilir) - BTW, Head-of olarak bilinen bu etki -Line Engelleme, ister TCP ister güvenilir + düzenli UDP olsun, tüm güvenilir düzenli akışların doğasında vardır. İşleri daha da kötüleştirmek için - yeniden iletilen paket de kaybolursa, ~ 600ms gecikme hakkında konuşacağız (üstel geri çekilme nedeniyle, 1. yeniden iletim 200ms ve ikincisi 200 * 2 = 400ms). Kanalımızda% 1 paket kaybı varsa (bugünün standartlarına göre kötü değildir), ve saniyede 20 güncellemeli bir oyunumuz var - bu 600ms gecikme ortalama her 8 dakikada bir gerçekleşecek. Ve hızlı tempolu bir oyunda 600ms sizi öldürmek için fazlasıyla yeterli - oyun için oldukça kötü. Bu etkiler tam olarak neden gamedev'lerin TCP yerine UDP'yi tercih etmesidir.
Bununla birlikte, gecikmeleri azaltmak için UDP kullanırken - yalnızca "UDP'nin kullanılması" nın önemli gecikme süresi iyileştirmesi için yeterli olmadığını fark etmek önemlidir, bu tamamen UDP'yi NASIL kullandığınızla ilgilidir. Özellikle, RUDP kütüphaneleri genellikle bu "üstel geri çekilmeden" kaçınır ve daha kısa yeniden iletim süreleri kullanırlarsa - "güvenilir sıralı" akış olarak kullanılırlarsa, hala Hat Başına Engellemeden muzdarip olmaları gerekir (bir çift durumunda) paket kaybı, 600ms yerine yaklaşık 1.5 * 2 * RTT alacağız - veya oldukça iyi bir 80ms RTT için ~ 250ms'lik bir gecikmedir, bu bir gelişme, ancak daha iyisini yapmak hala mümkündür). Diğer yandan, http://gafferongames.com/networked-physics/snapshot-compression/ ve / veya http: // ithare. , Hat Başı engellemesini tamamen ortadan kaldırmak mümkündür (bu nedenle, 20 güncelleme / saniye olan bir oyun için çift paket kaybı için, RTT'den bağımsız olarak gecikme 100 ms olacaktır).
Yalnızca TCP ama hiçbir UDP erişimi için ne varsa (örneğin tarayıcıda olduğu gibi istemci UDP engelleme çirkin güvenlik duvarları 6-9% birinin arkasından ise, ya) - - Ve bir yan not olarak orada görünüyor bir yol olarak TCP üzerinden UDP'yi çok fazla gecikme yaşamadan uygulayın, buraya bakın: http://ithare.com/almost-zero-additional-latency-udp-over-tcp/ (yorumları da okuyun (!)).
Her TCP bağlantısı, veri iletilmeden önce bir ilk el sıkışma gerektirir. Ayrıca, TCP üstbilgisi farklı sinyaller ve mesaj teslimi algılama için tasarlanmış bir sürü ek yük içerir. Mesaj alışverişi için UDP muhtemelen küçük bir başarısızlık şansı kabul edilebilirse yeterli olacaktır. Makbuzun doğrulanması gerekiyorsa, TCP en iyi seçenektir.
@Andrew , farklı olmaya yalvarıyorum. Performans gereksinimleri nedeniyle bazı uygulama türlerinde UDP tercih edilir. Klasik bir örnek video konferanstır. Bu tür uygulamalar TCP kontrolüne iyi yanıt vermez.
Dikkate alınması gereken diğer bir husus, çok noktaya yayın gereksiniminiz olup olmadığıdır. Öyleyse, UDP kullanın.
Sadece işleri netleştireceğim. TCP / UDP iki araba yolda sürülüyor. trafik işaretleri ve engellerin TCP olduğunu varsayalım. Trafik işaretlerini önemsiyor, her şeye saygı duyuyor. Yavaş sürüş çünkü arabada bir şey olabilir. İken UDP sadece çıkarır, tam hız sokak işaretlerine saygı. Hiçbir şey, deli bir sürücü. UDP'nin hata kurtarma özelliği yok, Bir engel varsa, onunla çarpışacak ve devam edecek. TCP , tüm paketlerin mükemmel bir şekilde gönderildiğinden ve alındığından emin olurken , Hata yok, bu yüzden araba çarpışmadan sadece engelleri geçiyor. Umarım bu sizin anlamanız için iyi bir örnektir, Neden Oyunlarda UDP tercih edilir. Oyun hızına ihtiyaç duyar. İndirme işlemlerinde TCP tercih ediliyor veya indirilen dosyalar bozulmuş olabilir.
UDP tecrübelerime göre biraz daha hızlı, ama çok fazla değil. Seçim performansta değil mesaj içeriği ve sıkıştırma tekniklerinde yapılmalıdır.
İleti alışverişi içeren bir protokolse , TCP ile aldığınız çok küçük performansın buna değdiğini öneriyorum. Size ihtiyacınız olan her şeyi verecek iki uç nokta arasında bir bağlantı verilir. Yaptığınız şeyden gerçekten, gerçekten emin değilseniz, UDP'nin üstünde kendi güvenilir iki yönlü protokolünüzü üretmeye çalışmayın.
TCP'nin genellikle birden çok iletiyi kabloda tuttuğunu unutmayın. Bunu UDP'de uygulamak istiyorsanız, güvenilir bir şekilde yapmak istiyorsanız çok fazla işiniz olacak. Çözümünüz ya daha az güvenilir, daha az hızlı ya da inanılmaz bir iş olacak. UDP'nin geçerli uygulamaları var, ancak bu soruyu soruyorsanız, muhtemelen sizin değil.
Programlayıcının her iki dünyanın da yararına olmasını sağlamak için bazı çalışmalar yapılmıştır.
SCTP
Bağımsız bir aktarım katmanı protokolüdür, ancak UDP üzerinden ek katman sağlayan bir kütüphane olarak kullanılabilir. Temel iletişim birimi bir mesajdır (bir veya daha fazla UDP paketine eşlenir). Dahili tıkanıklık kontrolü var. Protokolün açılması için topuzlar ve döndürücüler var
kendi uygulamanız için bunlardan herhangi biri gerekiyorsa.
Bununla ilgili bir sorun, bağlantı kuruluşunun karmaşık (ve dolayısıyla yavaş bir süreç) olmasıdır
Diğer benzer şeyler
Bir tane daha benzer tescilli deneysel şey
Bu ayrıca TCP'nin üçlü yolunda el sıkışmasını iyileştirmeye ve hızlı hatlarla daha iyi başa çıkmak için tıkanıklık kontrolünü değiştirmeye çalışır.
Ağ durumunu dikkate almadan TCP veya UDP hakkında konuşmak anlamsızdır. İki nokta arasındaki ağın kalitesi çok yüksekse, UDP TCP'den kesinlikle daha hızlıdır, ancak GPRS ağı gibi başka bir durumda TCP, UDP'den daha hızlı ve daha güvenilir olabilir.
Ağ kurulumu herhangi bir ölçüm için çok önemlidir. Yerel makinenizdeki soketlerle veya dünyanın diğer ucuyla iletişim kuruyorsanız, büyük bir fark yaratır.
Tartışmaya eklemek istediğim üç şey: