Neden güvenilirliğe sahip UDP (Uygulama katmanında uygulanmaktadır) TCP'nin yerine geçmiyor?


25

UDP yapmazken, TCP taşıma katmanında güvenilirlik sağlar. Yani, UDP hızlı. Ancak, uygulama katmanındaki bir protokol UDP kullanırken güvenilir bir mekanizma uygulayabilir.

Bu anlamda, güvenilirliğe ihtiyacımız varken UDP'nin TCP'den daha hızlı olması durumunda neden güvenilirliğe sahip UDP (Uygulama katmanında uygulanmaktadır) bir TCP yerine değildir?


6
Neden her uygulama, TCP gibi yaygın olarak kullanılan başka bir protokole güvenebildiklerinde kendi güvenilirlik mekanizmalarını sağlar?
Nakrule,

14
ve uygulama katmanında güvenilirliği, yığını yavaşlatmadan nasıl gerçekleştirmeyi öneriyorsunuz?
JFL

6
UDP üstbilgisi TCP'den daha küçük olduğundan, veri boyutundan faydalanabiliriz. ” Bu düşünce ile ilgili sorun, muhtemelen kullanımdaki verileri azaltacak olan uygulama katmanı protokol başlıklarıyla UDP yükünü büyük ölçüde yemenizdir. UDP yükü. TCP ve UDP başlık boyutu arasındaki fark sadece 12 bayttır. Ayrıca, UDP gerçekten küçük yükler için tasarlanmıştır, örneğin 576 bayt; UDP'nin yalnızca datagramları kaybedeceğini ve bir datagramda ne kadar fazla veri bulunduğunu, bir datagram kaybolduğunda daha fazla veri kaybolduğunu unutmayın.
Ron Maupin

21
Yığın Taşması , UDP kullanarak TCP benzeri protokoller oluşturmaya çalışan ve başarısız olan programcılarla doludur. Daha deneyimli programcılar onlardan vazgeçmelerini ve sadece TCP kullanmasını söyler. Hepsi daha iyi bir iş yapabileceklerini düşünüyor, ama bu pek mümkün değil.
Ron Maupin

11
Bunun doğrudan sorunuzun bir parçası olmadığını biliyorum, ancak UDP'nin daha iyi olmasının bir nedeni, yalnızca ihtiyacınız olan güvenilirlik parçalarını uygulayabilmenizdir. TCP ile sipariş ve teslimat konusunda güvenilirlik elde edersiniz. Bu, TCP'nin bir önceki mesajın tekrar gönderilmesini beklerken hıçkırıklara sahip olabileceği anlamına gelir. UDP ile istediğin her şeyin teslim olduğuna karar verebilirsin, ama herhangi bir mesajın sırası gelmezse, eksik olanları beklemeyeceksin, sadece onları atıyorsun. İnsanların uğradığı tuzak,% 100 TCP'yi kopyalamaya çalışıyor. Bu durumda, sadece TCP kullanın.
William Mariager

Yanıtlar:


47

TCP, güvenilirlik özellikleriyle bir şeyler yapabildiğiniz kadar hızlıdır. Yalnızca sıralama ve hata tespitine ihtiyacınız varsa, UDP mükemmel şekilde hizmet etmek için yapılabilir. Bu, gecikme ve titremenin "mutlak" hata düzeltmesinden daha önemli olduğu ses, video akışı vb. Gibi gerçek zamanlı protokollerin temelini oluşturur.

Temel olarak, TCP sonunda akışlarının güvenebileceğini söylüyor. Bunun ne kadar hızlı olduğu çeşitli zamanlayıcılara, hızlara vb. Bağlıdır. Hataları çözmek için harcanan zaman tahmin edilemez, ancak temel işlemler hata olmadığında uygulanabilir olduğu kadar hızlıdır. Bir sistem muhtemel hata türleri hakkında bir şey biliyorsa, TCP ile mümkün olmayan bir şey yapabilir. Örneğin, tek bitli hatalar özellikle muhtemel ise, bu bit hataları için hata düzeltme kodunu kullanabilirsiniz: ancak bu, bağlantı katmanında çok daha iyi uygulanır. Başka bir örnek olarak, kısa süreli bütün paket kaybının yaygın olması durumunda, bunu kayıp beklemeden çoklu aktarımla çözebilirsiniz, ancak açıkça görülüyor ki bu bant genişliği açısından pahalıdır. Veya alternatif olarak, hata olasılığı göz ardı edilinceye kadar hızı azaltın: bant genişliği de pahalıdır. Sonunda,

Uygulama açısından, TCP’ye yatırım yapan programcı yüzyıllarının, kararsız durumlarda yapabileceğiniz her şeyden daha hızlı hale getireceğini ve bunun yanı sıra belirsiz durumlarda daha güvenilir olacağını göreceksiniz.

TCP aşağıdakileri sağlar: her yerde bulunan (iletişim sistemlerinin ortak bir kontrolünün olmadığı durumlarda gerekli olan), isteğe bağlı olarak çok-sekmeli ağlar üzerinde tıkanıklık kontrolü olan iki yönlü, pencereli, bayt akışı sağlayan, güvenilir bir bağlantı yöntemi.

Bir uygulamanın her yerde olması gerekmiyorsa (yazılımınız her iki tarafta da çalışır) veya tüm TCP özelliklerine ihtiyaç duymuyorsa, çoğu kişi çoğu zaman UDP'nin üstünde olmak üzere diğer protokolleri karlı şekilde kullanır. Örnekler arasında TFTP (gerçekten yetersiz hata yönetimi ile minimalist, genel giderlerin azaltılması için tasarlanmış QUIC (deneysel olarak işaretlenmiş) ve tam olarak hangi güvenilirlik özelliklerinin gerekli olduğu üzerinde hassas bir kontrol sahibi olan lidgren gibi kütüphaneler sayılabilir. ]


7
Özel "güvenilirliğe sahip UDP" protokolleri video oyunlarında da oldukça yaygındır. Çeşitli uygulamaları olan bir ton ağ kütüphanesi var. Genellikle paketlerin sipariş edilmesini ve kayıp paketlerin yeniden iletilmesini istemeden hata düzeltmelerinin yapılmasını ister (ve gelecekteki tüm paketlerin gecikmelerini alırlar).
BlueRaja - Danny Pflughoeft

"TCP en uygun genel çözümdür, bu yüzden onu doğal olarak desteklemektedir" diyor gibisiniz. +1
ikegami

1
@ BlueRaja-DannyPflughoeft Bazen güvenilir sırasız paketler (örneğin yakındaki oyunculara uygulanan görsel efektler) istiyorsunuz.
user253751

@ BlueRaja-DannyPflughoeft Eğer tipik bir örnek protokol kütüphaneniz varsa, cevaba dahil etmekten mutluluk duyarım
jonathanjo

1
@ jonathanjo Kullandığım bir tanesi 5 farklı dağıtım yöntemini destekleyen lidgren'dir (aşağıya doğru kaydırın) . Unity ve Unreal Engine'in ayrıca UDP üzerine inşa edilmiş kendi ağ API'leri de var.
BlueRaja - Danny Pflughoeft

10

Güvenilirliği olan UDP gerçekten de TCP'nin yerine geçebilir. Zaten bir örneğimiz var: buna QUIC deniyor .

Wikipedia'dan:

Diğer uygulamalar arasında, QUIC, şu anda TCP kullanan bağlantı yönelimli web uygulamalarının performansını artırmaktadır. Bunu, Kullanıcı Datagram Protokolü (UDP) üzerinden iki uç nokta arasında çok sayıda bağlantı kurarak gerçekleştirir.

UDP kullanmaya karşı yepyeni bir taşıma katmanı protokolü oluşturmanın avantajı, yönlendiricilerin ve diğer ağ aygıtlarının zaten onu anlamasıdır.


QUIC, TCP'den biraz farklı özelliklere sahiptir. : (Güvenilir ağ veya gerekli hiçbir şifreleme) Bazı senaryolarda aslında yavaş quora.com/...
freakish

Ayrıca WebRTC veri kanallarını, UDP kullanan sctp ile listeye ekleyebilirsiniz. Aslında, UDP bağlantılarının eşler arasında mümkün olmadığı durumlarda WebRTC, TCP'de başarısız olur ve performansta gözle görülür bir düşüşe neden olur.
JSON

Son derece yavaş bu durumda bir genellemedir. Örneğin, QUIC, yeniden iletimi azaltmak için verimi etkileyen ancak gecikmeyi değil paketlere ek veri ekler.
JSON

4

Uygulama katmanında TCP işlevselliğini uygulamak için UDP'yi kullanabilirsiniz (güvenilirlik, uyarlanabilirlik). Uygulamanızın gerçekten ihtiyaç duyduğu bir şey TCP ile yapılamadıkça, TCP'yi ilk etapta da kullanabilirsiniz. Eğer bu fonksiyonları kendiniz uygularsanız, muhtemelen TCP ile olduğundan çok daha kötü sonuçlanırsınız. Eklenen havai toplam verimliliği de azaltır.

TCP yavaş değil - iletmeden önce bir el sıkışması ve kanala uyum sağlamak için iletim penceresinin yeterli olması gerekiyor. Elindeki iletim kanalına verimini çok iyi şekillendirebilir ve akış sırasında, UDP'nin (tek başına) yapamadığı değişikliklere uyum sağlayabilir.

Ancak, taşıma katmanının üstündeki protokoller burada konu dışı.


3
"Uygulama katmanında TCP işlevselliğini uygulamak için UDP'yi kullanabilirsiniz (güvenilirlik, uyarlanabilirlik)" - Neredeyse QUIC, µTP ve genellikle SCTP'nin uygulandığına inanıyorum. (Buna rağmen, onları genellikle taşıma katmanının üst yarısındayken, UDP alt yarıda
otururken düşünürüm

1
@grawity POV'nuza bağlı olan - uygulama açısından, bir ara kat taşıma katmanının bir uzantısıdır. Resmi olarak ve ağ (cihaz) perspektifinden, hepsi uygulama katmanının bir parçasıdır.
Zac67

4

Temiz bir ağda oldukça eşdeğerdirler. TCP'nin dönemler boyunca askıda kalacağı durumlar vardır (Herkes hiç bir HTTP ekranı yükte donuyor mu?) Ancak çöp dağıtmaz veya paketleri karıştırmaz ve nadiren tamamen pes eder.

UDP, uygulama katmanına, çok fazla çalışma pahasına, trafik üzerinde daha fazla kontrol sağlayabilir.

Sorunuzun cevabı, bazen bu şekilde yapılır. Düşük gecikme süresi gerektiren oyunlar çoğu zaman tam olarak bunu yapar. Daha iyi bir iş olabilir, ancak kaç tane olağanüstü paket alabileceğinizi ve ne sıklıkta yeniden deneneceklerini tam olarak kontrol edebilme yeteneği buna değer.

Genel olarak fark, TCP'nin çok iyi bir genel amaçlı uygulama olduğudur, ancak UDP'nin bu TCP'yi ya çok zayıf şekilde yaptığını ya da hiç yapmadığını yapabilmesinin özel amaçları vardır - örneğin:

  • ASLA pes etmeyin (TCP ile bağlantı bazen kilitlenir ve bağlantıyı koparıp yeniden başlatmanız gerekir)
  • Cevap gerektirmeyen hızlı bir paket akışı gönderme ve zaman zaman bazılarını kaçırmamanın sakıncası var (yalnızca en son paketin önemli olduğu, başkalarının atılabileceği) - oyun pozisyonu güncellemelerini düşünün - biraz alabilirsiniz Her adım yerine "atla", ancak aynı sonucu daha hızlı ve daha güvenilir şekilde elde edersiniz.
  • Paket damlalarını analiz ederek ve ne sıklıkta ve ne kadar sürede yeniden deneyeceğinizi - belki de maksimum paket büyüklüğünü - dinamik olarak değiştirerek iffy network'lerle uğraşabilirsiniz.

Ancak genel olarak buna değmez, TCP oldukça uygundur, bu yüzden neden tüm ekstra işlere gidip hatalar ve güvenlik hataları ekleme (büyük) şansı ekleyelim?


3

UDP hızlı değil çünkü UDP. TCP yavaş değil, çünkü TCP.

Her iki protokol de belirli garantilerle tasarlanmıştır ve ham TCP, ham UDP'den daha fazla güvenceye sahiptir.

Temel kural şudur: garantilerin fiyatı performanstır .

UDP üzerinden TCP garantisi uygulamanızı yasaklayan hiçbir şey yoktur. Ama sonra daha fazla garanti alıyorsun ve bu yüzden bedelini ödemek zorundasın. Bu nedenle performansı TCP'ye düşürür veya daha kötü hale getirirsiniz (UDP ek yükü nedeniyle). Daha iyi bir TCP uygulaması bilmiyorsanız, ki bu olası değildir. Ve bunu yaparsanız (umarız) bunu ortaya çıkarırsınız ve standart TCP'yi daha hızlı hale getiririz. Ve başladığımız yere geri döndük. :)

Bu garantilerle de oynayabilirsiniz. Bunu hafifçe değiştirin, hafifçe değiştirin. Ardından , UDP'nin üzerinde olan ve TCP + TLS'ye çok benzeyen QUIC gibi bir protokolle karşılaşıyorsunuz . Çoğu durumda TCP’den daha hızlıdır ( bu makaleye göre % 5’e kadar gecikme ve IMO’nun büyük bir sorun olmadığı% 15’e kadar tamponlama) ancak bazı senaryolarda (örneğin, güvenilir ağ veya şifrelemeye gerek yoktur) daha yavaş ( burada bir açıklamaya bakın ).

Ayrıca bu garantileri zayıflatabilir ve daha sonra daha mantıklı. Örneğin, yayın yaptığınızı ve çok eski paketlerin ilgi çekici olmadığını söyleyin. Sadece en yenileri. Ancak tıkanıklık hala önemlidir. Yani TCP'den bazı garantiler alıyorsunuz, fakat hepsini değil. Ve evet, insanlar aslında bunu yapar (örneğin, gerçek zamanlı oyunlar). Bu size bazı garantiler pahasına daha iyi performans verir.


1

Senin fikrin derin uzayda iyi olurdu.

Doğru cevap "bağlıdır" ve "çünkü ağa bir bütün olarak zarar verir". TCP / IP ağlara çok kibar davranır ve otomatik olarak hızlı olması için doğru hızı ayarlar ancak tonlarca ICMP iade paketi oluşturmaz.

Yeterli RAM'i olmayan bir yönlendirici birden fazla türde bir paket aldığında - örneğin Tsunami, Bittorrent veya FDT'den - bunu düşürür ve gönderene küçük bir hata onaylama paketi gönderir. Artık UDP sunucunuzun bu bölümü manuel olarak izlemesi ve yeniden iletmesi gerekiyor. Bazı ISS yönlendiricileri Bittorrent'i çok fazla şekillendiriyor ve bu da Tsunami'yi incitiyor mu?

Tsunami protokolü TCP'de kontrol kanalı olan UDP'yi kullanır. http://tsunami-udp.sourceforge.net/ FDT denilen şeyden daha yavaş olduğunu gösteren bir çalışma buldum.

CERN'den gelen efsanevi Hızlı Veri Transferi (FDT) protokolü, birden çok TCP akışını kullanarak herhangi bir ağı doyurabilir. Muhtemelen daha hızlıdır, çünkü ağı çok fazla UDP ile dolduran Tsunami'nin bir kısmı onu baştan sona geçirmediği için daha az yeniden iletime neden olur.

UDP güvenilir olmayan uygulamalar tarafından kullanılır: ses akışı, oyun girişi / IO güncellemesi, "ping" aslında ICMP'dir ancak garanti edilmez, Bittorrent, mosh ssh oldukça duyarlı, VOIP telefon, çok noktaya yayın, DNS UDP AFAIK üzerinden gönderilir. Tuhaf eksik paketi önemsemeyen ve anında "yetişebilen" herhangi bir şey.

TCP / IP gerçekten uygulama geliştirmelerine izin veren katil bir icattı, bu yüzden sadece ayarlayın ve unutun. Bir soket, bir çift IP adresi ve bağlantı noktasıdır ve yeniden bağlanmadan saatlerce, günlerce, hatta haftalarca kurulup kalacak şekilde tasarlanmıştır. E-posta, web, IRC ve kelimenin tam anlamıyla tüm katil uygulamalar TCP kullanıyor. Ancak, indirme işleminde aniden daha hızlı giden tuhaf duraklamalar olabilir ... ve derin uzayda bağlantılar, yıldızlararası dosya transferleri için Tsunami stil transferlerini en iyi hale getirmek için zaman aşımına uğrayabilir - orada bir şey olabilirsiniz !!

Kanıtı ben yeniden hakkında gidiyorum artan mesafe şey söz bu bilim çalışması özü nihai açıklamalar, içinde: derin uzay Gönderen: https://uscholar.univie.ac.at/get/o:300623.pdf

Sıkışma olmadan, FDT ve GridFTP'nin TCP ile performansı Tsunami ve UDT'den daha yüksektir. FDT'nin en yüksek verimi, 1 ms RTT ile 2.34 Gb / s'dir, ancak link RTT 100 ms'den daha uzun olduğunda FDT'den daha iyi performans gösteren GridFTP'ye kıyasla 100 ms sonra hızlı bir şekilde azalır. İlginçtir, Tsunami'nin verimi, artan RTT ile en etkili tıkanıklık kontrolüne sahip olduğunu göstererek, artan RTT'ye göre azalmamıştır.

Sonra tekrar ... aslında e-postaya çok benzeyen ve alan için daha iyi olacak bir alan protokolü var. Uygulamalar, sonsuza kadar olduğu gibi zaman aşımı değerlerini dikkate almamalıdır.


0

TCP! = UDP + Güvenilirlik

TCP, ek güvenilirlik ile basitçe UDP değildir. TCP, yalnızca güvenilirlikten daha fazla özellik sunar. RFC'lerin çoğunda onlar hakkında okuyabilirsiniz.

Bu özelliklerden herhangi biri uygulama katmanında "uygulanabilir". Sonunda tekerleği yeniden icat etmeye başladığınız bir nokta olur.

TCP'nin birkaç özelliğine isim vermek için ...

  • Bağlantı oluşturma ve sonlandırma: el sıkışmalarını ve bağlantı kapatma işlemlerini gerçekleştirir

  • Akış Kontrolü: gönderenin ve alıcının, her ikisinin de veri hızını idare edebileceği oranlarda iletmesini sağlar.

  • Uçtan uca tıkanıklık kontrolü: uç düğümlerin kayıplara dayanarak verimlerini düşürmelerini sağlar. Yavaş başlangıç, tıkanma önleme ve hızlı iyileşme hakkında bilgi edinin.

Tecrübelerime göre, hız güvenilirlik konusunda bir endişe olduğunda UDP kullanılır. Uygulama düzeyinde, TCP kadar güvenilir olmayan% 100 düzeyinde bir miktar güvenilirlik ekleyebilirsiniz. Örneğin, hala hızlı performans almak istiyorsanız, verileri bir kereden fazla ilettiğiniz ileriye doğru hata düzeltmeyi (FEC) uygulayabilirsiniz. Paketleri kaybetmek için ileri geri chit sohbeti olmadan hala iyi bir performans ve bir miktar güvenilirlik seviyesi (oldukça TCP güvenilirliğine dikkat edin) elde edersiniz. Bunun ticareti ağ kullanımını arttırmasıdır, ancak oyun ya da akış gibi gerçek zamanlı uygulamalar için uygun olabilir.


Bu ekstra özelliklerde nihayetinde güvenilirlikle ilgili olduğunu açıklayabilirsiniz.
user207421
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.