TCP yerine UDP kullanmak ne zaman uygundur? [kapalı]


303

TCP paket teslimatını garanti ettiğinden ve bu nedenle "güvenilir" olarak kabul edilebildiğinden, UDP hiçbir şeyi garanti etmez ve paketler kaybolabilir. TCP akışı yerine bir uygulamada UDP kullanarak veri aktarmanın avantajı ne olabilir? Ne tür durumlarda UDP daha iyi bir seçim olabilir ve neden?

Bir akış oluşturma ve sürdürme yükü olmadığından UDP'nin daha hızlı olduğunu varsayıyorum, ancak bazı veriler hedefine asla ulaşmazsa bu önemsiz olmaz mı?


55
UDP, olası paket kaybından muzdarip olmanın yanı sıra, paketi yalnızca bir kez alacağınızı garanti etmez. Kıvrık veya kötü yapılandırılmış ağlarınız varsa, aynı paketi birden çok kez alabilirsiniz. İnsanlar bunu unutmaya başladığı için sadece bir kafa!
Brian Agnew

3
Paket siparişini bile garanti etmez.
Mehrdad Afshari

19
TCP, teslimatı garanti etmez , sadece paketleri teslim edebiliyorsa, gönderildikleri sırayla olacağını garanti eder.
Chaim Geretz

5
BTW, sık sık insanların TCP yeniden iletimlerine güvenilirlik / sırayla teslimatı eşitlediğini görüyorum. Bu "uzmanlar" size UDP'deki iletim hatalarının üstesinden gelmek için TCP'yi (kötü) yeniden uygulayacağınızı ve bu nedenle de TCP'yi kullanabileceğinizi söyleyecektir. Bu doğru değil. Yeniden iletimin yanı sıra, küçük ama sıfır olmayan hata oranlarının bir sonucu olarak gecikme veya katlanarak azalan verim sağlamayan başka hata kurtarma teknikleri de vardır.
Ben Voigt

TCP, hedefin paketleri almadığını da bileceğinizi garanti eder.
csga5000

Yanıtlar:


354

Bu benim en sevdiğim sorulardan biri. UDP çok yanlış anlaşılıyor.

Gerçekten hızlı bir şekilde başka bir sunucuya basit bir cevap almak istediğiniz durumlarda, UDP en iyi sonucu verir. Genel olarak, yanıtın bir yanıt paketinde olmasını istersiniz ve güvenilirlik veya yeniden gönderme için kendi protokolünüzü uygulamaya hazırsınız. DNS, bu kullanım senaryosunun mükemmel açıklamasıdır. Bağlantı kurulumlarının maliyeti çok yüksektir (yine de DNS bir TCP modunu da desteklemektedir).

Başka bir durum, daha yeni veriler önceki verilerin / durumun yerini alacağından kaybolabilecek veriler ilettiğinizdir. Hava durumu verileri, video akışı, hisse senedi teklifi hizmeti (gerçek ticaret için kullanılmaz) veya oyun verileri akla gelir.

Başka bir durum, muazzam miktarda durumu yönettiğinizde ve TCP'yi kullanmaktan kaçınmak istediğinizde, çünkü işletim sistemi bu kadar oturum gerçekleştiremiyor. Bu bugün nadir bir durum. Aslında, uygulama yazarının bu TCP durumu için gereken kaynaklar üzerinde daha hassas bir kontrole sahip olabilmesi için kullanılabilecek kullanıcı-arazi TCP yığınları vardır. 2003'ten önce UDP gerçekten şehirdeki tek oyundu.

Diğer bir durum çok noktaya yayın trafiğidir. UDP birden çok ana bilgisayara çok noktaya yayınlanabilirken TCP bunu hiç yapamaz.


İlginç cevap için teşekkürler. Şu anda UDP'de (yüksek bant genişliği gereksinimi) her şeyi yapan bir sunucumuz var. Hangi kullanıcı modu TCP (veya başka bir kullanıcı modu akış kontrollü) yığını öneriyorsunuz?
tire

@dashesy - sipariş gereksiniminden kurtulabilir misiniz? Kullanabileceğiniz faydalı yük içinde monoton olarak artan bir sayı var mı? Eğer öyleyse, gerçekten tam bir kullanıcı arazi TCP yığınına ihtiyacınız yoktur.
Mart'ta drudru

@ drudru- evet sıra numarası orada, kendimi tamponlamam ve titremem gerekebilir. Teşekkürler, bir seçeneği daha kaldırmak her zaman mükemmeldir.
dashesy

64

Bir TCP paketi kaybolursa, yeniden gönderilir. Bu, belirli bir sırada gerçek zamanlı olarak işlenen verilere dayanan uygulamalar için kullanışlı değildir.

Örnek olarak video akışı ve özellikle VoIP (örn. Skype ) verilebilir . Bununla birlikte, bu durumlarda, bırakılan bir paket çok büyük bir şey değildir: duyularımız mükemmel değildir, bu yüzden fark etmeyebiliriz. Bu tür uygulamaların TCP yerine UDP kullanmasının nedeni budur .


16
Bence geriye doğru sahipsin. TCP, paketleri gönderilen siparişte teslim edilmek üzere paketleri yeniden sipariş eder. UDP, aldığı siparişe göre yeniden sipariş vermez ve veri sağlar.
Hans Malherbe

1
UDP siparişi garanti etmez, ancak paketleri yeniden numaralandırabilir ve yeniden aldıktan sonra yeniden sıralayabilirsiniz.
Kugel

7
@ Stephan202: Bence Skype ;-) 'da bırakılan paketleri fark etmeme konusunda aynı fikirde olmam gerekecek
Robert S. Barnes

6
@Kugel: Yeni bir TCP yığını uyguluyor olabileceğinize dikkat edin. Buradaki işletim sisteminden daha iyi bir iş çıkarmanız pek olası değildir.
erikkallen

1
@erikkallen: Biri, TCP'nin karşılamak için tasarlandığı aynı gereksinimlere sahip daha yüksek düzeyli bir protokol uygulamak için UDP kullanıyor olsaydı, mevcut protokollerden çok daha iyisini yapması pek mümkün olmazdı. Öte yandan, bazı uygulamalar, bir UDP sarıcısının TCP'den daha iyi işleyebileceği protokole birkaç özellik eklenmesinden yararlanır.
supercat

56

UDP'nin "güvenilmezliği" bir biçimciliktir. İletim kesinlikle garanti edilmez. Pratik bir mesele olarak, neredeyse her zaman geçer. Zaman aşımından sonra kabul edilmez ve yeniden denenmezler.

Bir TCP soketi için müzakere ve TCP paketlerinin anlaşılması büyüktür. Gerçekten çok büyük. Kayda değer bir UDP yükü yoktur.

En önemlisi, UDP'yi TCP'den daha az yük taşıyan güvenilir teslimat el sıkışmasıyla kolayca tamamlayabilirsiniz. Bunu okuyun: http://en.wikipedia.org/wiki/Reliable_User_Datagram_Protocol

UDP, yayınlama-abone olma türünde bir uygulamada bilgi yayınlamak için kullanışlıdır. IIRC, TIBCO, devlet değişikliğinin bildirilmesi için UDP'yi yoğun olarak kullanıyor.

Diğer her türlü tek yönlü "önemli olay" veya "günlüğe kaydetme" etkinliği UDP paketleri ile sorunsuz bir şekilde kullanılabilir. Tüm soketi oluşturmadan bildirim göndermek istiyorsunuz. Çeşitli dinleyicilerden herhangi bir yanıt beklemezsiniz.

Sistem "kalp atışı" veya "Hayattayım" mesajları da iyi bir seçimdir. Kayıp olan bir kriz değil. Yarım düzine (arka arkaya) eksik.


5
"Pratik bir mesele olarak, neredeyse her zaman geçer". Yüksek ağ katmanlarının güvenilirliğine bağlıdır.
Mayıs 16:25

ayrıca, "birkaç" paket kaybı ve "çok fazla" paket kaybı planlaması arasında bir fark var mıdır? kayıp kayıptır. yine de plan yapmalısın.
Sedat Kapanoglu

30

İstemci ve sunucu arasındaki UDP (IP) ve TCP / IP iletişimini destekleyen bir ürün üzerinde çalışıyorum. IPX ile 15 yıl önce 13 yıl önce eklenen IP desteği ile başladı. 3 veya 4 yıl önce TCP / IP desteği ekledik. Vahşi tahmin yaklaşıyor: UDP'nin TCP koduna oranı muhtemelen yaklaşık 80/20. Ürün bir veritabanı sunucusudur, bu nedenle güvenilirlik çok önemlidir. Diğer cevaplarda daha önce bahsedilen UDP'nin (paket kaybı, paket ikiye katlanması, paket sırası vb.) Neden olduğu tüm sorunları ele almalıyız. Nadiren herhangi bir sorun vardır, ancak bazen meydana gelir ve bu yüzden ele alınmalıdır. UDP'yi desteklemenin yararı, onu kendi kullanımımıza göre özelleştirebilmemiz ve biraz daha fazla performans ayarlayabilmemizdir.

Her ağ farklı olacak, ancak UDP iletişim protokolü genellikle bizim için biraz daha hızlı. Şüpheci okuyucu haklı olarak her şeyi doğru şekilde uygulayıp uygulamadığımızı sorgulayacaktır. Ayrıca, 2 haneli temsilcisi olan bir adamdan ne bekleyebilirsiniz? Yine de, şimdi meraktan bir test yaptım. Test 1 milyon kayıt okudu (bazı tablolardan * seçin). Her bireysel istemci isteğiyle döndürülecek kayıt sayısını 1, 10 ve sonra 100 olarak ayarladım (her protokolle üç test çalıştırması). Sunucu, 100Mbit LAN üzerinden yalnızca iki durak uzaktaydı. Rakamlar, başkalarının geçmişte bulduklarına katılıyor gibi görünüyordu (UDP çoğu durumda yaklaşık% 5 daha hızlıdır). Bu belirli test için milisaniye cinsinden toplam süre aşağıdaki gibidir:

  1. 1 kayıt
    • IP: 390,760 ms
    • TCP: 416.903 ms
  2. 10 kayıt
    • IP: 91.707 ms
    • TCP: 95,662 ms
  3. 100 kayıt
    • IP: 29.664 ms
    • TCP: 30,968 ms

İletilen toplam veri miktarı hem IP hem de TCP için yaklaşık olarak aynıydı. TCP / IP (sağlama toplamları, sıra numaraları, vb.) İle "ücretsiz" için aldığınız aynı şeylere sahip olduğumuzdan, UDP iletişimleri ile ekstra yükümüz var. Örneğin, Wireshark bir sonraki kayıt kümesi için bir isteğin UDP ile 80 bayt ve TCP ile 84 bayt olduğunu gösterdi.


Ya yalnızca TCP için geliştirdiyseniz ve 5 kat daha fazla kodlama çabası yerine daha iyi donanım satın aldıysanız ne olur?
inf3rno

2
Somut sayılar için teşekkürler! % 5 iyileştirme, eklediği karmaşıklık için biraz hayal kırıklığı yaratıyor.
Sergei

1
Muhtemelen% 5, yerel bir ağda (iki umut uzakta) gönderilmesinden kaynaklanıyor mu? Benim tahminim, ne kadar uzak olursa, fark o kadar yüksek olur.
lepe

19

Burada zaten birçok iyi cevap var, ama çok önemli bir faktörün yanı sıra bir özet eklemek istiyorum . UDP, tıkanıklık kontrolü kullanmadığından doğru ayarlama ile çok daha yüksek bir verim elde edebilir . TCP'de tıkanıklık kontrolü çok çokönemli. Bağlantının mevcut kapasitesini tahmin etmeye çalışarak ağ tıkanıklığını en aza indirmek için bağlantının hızını ve verimini kontrol eder. Paketler, çekirdek ağ gibi çok güvenilir bağlantılar üzerinden gönderildiğinde bile, yönlendiricilerin sınırlı boyut arabellekleri vardır. Bu tamponlar kapasitelerini doldurur ve paketler düşürülür ve TCP, alınan bir onay eksikliğinden bu düşüşü fark eder, böylece kapasitenin tahminine bağlantı hızını azaltır. TCP ayrıca yavaş başlatma adı verilen bir şey kullanır , ancak verim (aslında tıkanıklık penceresi) paketler düşürülene kadar yavaşça artırılır ve sonra düşürülür ve paketler düşürülene kadar yavaş yavaş arttırılır. Bu, TCP veriminin dalgalanmasına neden olur. Büyük bir dosya indirirken bunu açıkça görebilirsiniz.

UDP, tıkanıklık kontrolü kullanmadığı için tamponları bırakma noktasına kadar en üst düzeye çıkarmaya çalışmadığı için hem daha hızlı hem de daha az gecikme yaşayabilir, yani UDP paketleri tamponlarda daha az zaman harcar ve daha az gecikmeyle daha hızlı ulaşır. UDP, tıkanıklık denetimi kullanmadığından, ancak TCP kullandığından, UDP akışlarına yol açan TCP'den kapasite alabilir.

UDP yine de tıkanıklık ve paket düşüşlerine karşı savunmasızdır, bu nedenle uygulamanızın bu komplikasyonları bir şekilde ele almaya hazır olması gerekir, muhtemelen yeniden iletim veya hata düzeltme kodları kullanır.

Sonuç olarak UDP şunları yapabilir:

  • Ağ düşme oranı, uygulamanın işleyebileceği sınırlar içinde olduğu sürece TCP'den daha yüksek verim elde edin.
  • Daha az gecikmeyle paketleri TCP'den daha hızlı iletin.
  • Bağlantıyı kurmak için ilk el sıkışma olmadığından bağlantıları daha hızlı kurun
  • Çok noktaya yayın paketlerini iletirken TCP'nin birden çok bağlantı kullanması gerekir.
  • Sabit boyutlu paketleri iletirken, TCP segmentlerde veri iletir. 300 baytlık bir UDP paketi aktarırsanız, diğer uçta 300 bayt alırsınız. TCP ile, gönderme soketini 300 Bayt besleyebilirsiniz, ancak alıcı yalnızca 100 Bayt okur ve yolda bir şekilde 200 bayt daha olduğunu anlamanız gerekir. Uygulamanız bayt akışı yerine sabit boyutlu iletiler iletiyorsa bu önemlidir.

Özetle, uygun bir yeniden iletim mekanizması uyguladığınız sürece UDP, TCP'nin yapabileceği her tür uygulama için kullanılabilir. UDP çok hızlı olabilir, daha az gecikebilir, bağlantı bazında tıkanıklıktan etkilenmez, sabit boyutlu datagramları iletir ve çok noktaya yayın için kullanılabilir.


1
Ağlar paket kaybına neden olacak kadar tıkanırsa, TCP, ağın diğer kullanıcıları üzerindeki etkisini en aza indirmeye çalışırken, birçok UDP tabanlı uygulama bunu yapmaz. Bu onlara bir azalan pastadan daha büyük bir pay kapmak değil, aynı zamanda toplam miktarını azaltır sağlayan kullanışlı bant genişliği mevcut dönemde (örneğin veri aslında teslim olacağını ancak gönderen farkında olmaz durumlarda gereksiz yeniden iletimin bir sonucu olarak)
supercat

Her şeyden önce, harika cevap için teşekkür ederim, gerçekten çok şey öğrendim! Ama bir sorum var: katman 4'ten (TCP ve UDP) alınan tüm paketler için Ethernet adaptörü sınırlamaları nedeniyle katman 3 (IP) üzerinde segmentasyon gerçekleşmiyor mu? TCP'de gerçekleşen ancak UDP'de gerçekleşmeyen başka bir segmentasyon türünü mü kastediyorsunuz? Bana açıklayabilirsen gerçekten çok memnun olurum.
RuslanSh

1
@Freezy. Haklısınız, bağlantının MTU'sunu (katman 2) aşan paketlerin parçalanması katman 3-IP'de gerçekleşir. Ancak, TCP akış tabanlı bir protokoldür ve verileri bayt akışı olarak ele alır. TCP, MSS'ye göre boyutlandırılmış IP paketlerinin içine sığması için verilerini segmentler halinde gönderir, böylece TCP'de de segmentasyon gerçekleşir. TCP'nin bir segmente ne kadar veri koyduğu veya soketinizin ne kadar veri okuduğu pek çok faktöre göre değişir; 1 bayt veya MSS bayt olabilir. UDP ile, paket yolda kaybolmazsa alıcı her zaman vericinin gönderdiği bayt sayısını alır.
Andy

15

UDP'nin daha az yükü vardır ve ses veya video gibi gerçek zamanlı veri akışı veya herhangi bir durumda veri kaybolması sorununu çözmek için iyidir.


15

UDP bağlantısız bir protokoldür ve sipariş dışı gelen veri paketlerinin kabul edilebilir olduğu ve veri paketinin derhal iletildiği SNMP ve DNS gibi protokollerde kullanılır .

Ağ yönetimi genellikle ağ stres altındayken, yani güvenilir, tıkanıklık kontrollü veri aktarımının gerçekleştirilmesi zor olduğunda yapılması gerektiğinden SNMP'de kullanılır.

Bağlantı kurulumunu içermediğinden DNS'de kullanılır, böylece bağlantı kurulum gecikmelerini önler.

şerefe


12

Bu soru için bildiğim en iyi cevaplardan biri Hacker News'deki zAy0LfpBZLC8mAC kullanıcısından geliyor . Bu cevap o kadar iyi ki, sadece olduğu gibi alıntı yapacağım.

TCP, kuyruk başı engellemesine sahiptir, çünkü tam ve sipariş teslimini garanti eder, bu nedenle bir paket nakliye sırasında kaybolduğunda, eksik paketin yeniden gönderilmesini beklemek zorundayken, UDP paketleri geldikçe uygulamaya teslim eder. kopyalar da dahil olmak üzere ve bir paketin geldiklerini veya hangi siparişe ulaştıklarını garanti etmeden (aslında bağlantı noktası numaraları ve (isteğe bağlı) bir yük taşıma toplamı eklenmiş IP'dir), ancak bu, örneğin, genellikle Birkaç milisaniye ses eksik olduğunda önemli değil, ancak gecikme çok sinir bozucu, bu yüzden yeniden iletimlerle uğraşmıyorsunuz, sadece kopyaları bırakıyorsunuz, yeniden düzenlenmiş paketleri birkaç yüz milisaniye jitter tamponu için doğru sıraya yerleştiriyorsunuz ve paketler zamanında veya hiç görünmezse, basitçe atlanırlar,kodek tarafından desteklendiğinde olası enterpolasyon.

Ayrıca, TCP'nin büyük bir kısmı, mümkün olduğunca fazla çıkış aldığınızdan emin olmak için akış kontrolüdür, ancak ağı aşırı yüklemeden (biraz gereksizdir, çünkü aşırı yüklenmiş bir ağ paketlerinizi düşürür, yani yapmanız gerekir verilere zarar veren yeniden iletimler), UDP'nin bunlardan hiçbiri yoktur - belirli bir kodek ile telefon belirli bir bant genişliğine ihtiyaç duyduğundan, telefon gibi uygulamalar için mantıklıdır, ayrıca "yavaşlatamaz" ve ek bant genişliği de çağrıyı daha hızlı yapmaz.

Gerçek zamanlı / düşük gecikmeli uygulamalara ek olarak, UDP, hem gecikme hem de bant genişliği kullanımı açısından TCP bağlantı kurma ve yırtma yükü olmadığından DNS aramaları gibi gerçekten küçük işlemler için mantıklıdır. İsteğiniz tipik bir MTU'dan daha küçükse ve repsonse muhtemelen de bir durumdaysa, herhangi bir durumu sunucuda tutmanıza gerek kalmadan ve akış kontrol als siparişini verebilirsiniz ve bunların hepsi özellikle yararlı değildir bu tür kullanımlar için.

Ve sonra, kendi TCP yedeklerinizi oluşturmak için UDP'yi kullanabilirsiniz, ancak ağ dinamiklerini derinlemesine anlamadan muhtemelen iyi bir fikir değildir, modern TCP algoritmaları oldukça karmaşıktır.

Ayrıca, sanırım SCTP ve DCCP gibi UDP ve TCP'den daha fazlası var. Şu anda tek sorun, (IPv4) internetin, son kullanıcı uygulamalarında UDP ve TCP dışındaki protokolleri kullanmayı imkansız kılan NAT ağ geçitleriyle dolu olmasıdır.


SCDP ve DCCP'yi UDP üzerinden çalıştırabilirsiniz.
Demi

9

Video akışı, UDP kullanımına mükemmel bir örnektir.


Lütfen bazı örnekler verin.
Gaurav Singh

"Video Akışı" buna örnektir. Hotstar üzerinden canlı olarak oynanan bir maçı düşünün.
Sisir

8

Daha önce belirtildiği gibi, UDP'nin daha düşük yükü var, zaten bir paketi kaybetmenin ve tekrar göndermeyi ve yakalamayı denemenin daha iyi olduğu video ve ses gibi şeyler için iyi.

TCP dağıtımı konusunda herhangi bir garanti yoktur, sadece soketin bağlantısının kesilip kesilmediğini veya temel olarak veri gelmeyecekse söylenmelidir. Aksi takdirde oraya vardığında oraya ulaşır.

İnsanların unutacağı en büyük şey udp'nin paket tabanlı ve tcp'nin akıta dayalı olduğu, gönderdiğiniz "tcp paketinin" diğer uçta görünen paket olduğuna dair bir garanti yoktur, birçok pakete disseke edilebilir yönlendiriciler ve yığınların istediği gibi. Bu nedenle yazılımınız, baytların kullanılabilir veri yığınlarına ayrıştırılması için ek yüke sahiptir, bu da oldukça fazla yük alabilir. UDP arızalı olabilir, bu nedenle paketlerinizi numaralandırmanız veya bunu yapmak isterseniz yeniden sipariş etmek için başka bir mekanizma kullanmanız gerekir. Ancak bu udp paketini alırsanız, aynı baytlarla aynı sırayla gelir, değişiklik olmaz. Bu yüzden udp paketi terimi mantıklıdır, ancak tcp paketi zorunlu değildir. TCP'nin uygulamanızdan gizlenmiş kendi yeniden deneme ve sipariş mekanizması vardır,

UDP'nin her iki uç için de kod yazmak çok daha kolaydır, çünkü temelde noktadan noktaya bağlantılar yapmak ve korumak zorunda değilsiniz. Benim sorum genellikle TCP ek yükü istediğiniz durumlar nerede? Ve gönderilen bir tcp "paket" kabul edilen paketin olduğu gibi kısayollar alırsanız, daha iyi misiniz? (uzunluğu / içeriği kontrol etmek için uğraşırsanız iki paketi atmanız muhtemeldir)


TCP'nin bir teslimat garantisi vardır: yığın A, yığın B'den önce bir uygulamaya teslim edilir, bu nedenle bir uygulama (uygulama düzeyinde) yığın B'yi kabul ederse, yığın A olduğunu bilirsiniz. Ancak bu, TCP işleme düzeyinde de olur.
Simeon Pilgrim

TCP'de, her parçanın uzunluğuna önek ekleyerek veri parçalarını güvenle sınırlandırabilirsiniz. Uygulamaya bağlı olarak, her bir parçaya sabit bir bayt, iki bayt veya dört bayt uzunluğunda önek eklenebilir veya biri 128 ^ N veya daha küçük boyutlu her parçanın önüne N bayt uzunluğunda önek eklenebilir. Tam olarak büyük bir yük değil. Böyle bir tasarım, boşluklar olmadan sipariş teslimini garanti etmeyen protokollerle kötü olurdu, ancak TCP kullanırken böyle bir tasarım gayet iyi.
supercat

sabit uzunlukta miktarlarda veri arıyorsanız bile uzunluğa ihtiyacınız yok sadece gelen baytları saymak gibi ...
old_timer

1
@supercat. Kesinlikle haklısın. Bu ayrıca uygulamanıza karmaşıklık eklediğiniz anlamına gelir; UDP'de gerçekten ihtiyaç duyulan karmaşıklık. Bu nedenle TCP, dosyalar gibi akışları aktarmak için daha iyidir. Ancak, yığınlanmış verilerin güvenilirliğini ve belki de en iyi TCP'de TLS'nin ekstra güvenliğini istediğimde tam olarak ne yaptığınızı yaparım.
Andy

5

Video oyunları için ağ iletişimi neredeyse her zaman UDP üzerinden yapılır.

Hız son derece önemlidir ve her güncelleme oyuncunun görebileceği mevcut durumu tam olarak içerdiği için güncellemelerin kaçırılıp yapılmadığı önemli değildir.


5
normalde tam durum değil, son bildirimden bu yana bir delta, bu nedenle güncellemeler giderek büyüyor.
Simeon Pilgrim

5

Kilit soru, "ne tür durumlar UDP'nin [tcp'ye göre daha iyi bir seçim olacağını" ilgilendiriyordu.

Yukarıda birçok büyük cevap var, ancak eksik olan şey, ulaşım belirsizliğinin TCP performansı üzerindeki etkisinin resmi, nesnel bir değerlendirmesi.

Mobil uygulamaların muazzam büyümesi ve onlarla birlikte gelen "zaman zaman bağlı" veya "zaman zaman bağlantısı kesilmiş" paradigmalar ile, TCP'nin bağlantıların gelmesi zor olduğunda bağlantıyı koruma girişimlerinin güçlü bir şekilde yol açtığı kesinlikle durumlar vardır. UDP ve onun "mesaj odaklı" doğası için durum.

Şimdi bu konuda matematik / araştırma / sayılarım yok, ancak bağlantı genellikle zayıf ve zayıf eski TCP olduğunda TCP ile elde edilenden daha güvenilir bir şekilde çalışan uygulamalar ve ACK / NAK ve UDP üzerinden mesaj numaralandırma yaptım. sadece vakit geçirdim ve müvekkilimin parası sadece bağlanmaya çalışıyor. Bunu birçok batı ülkesinin bölgesel ve kırsal bölgelerinde alıyorsunuz ....


3

Diğerlerinin vurguladığı bazı durumlarda, paketlerin garantili olarak gelmesi önemli değildir ve bu nedenle UDP kullanımı iyidir. UDP'nin TCP'ye tercih edilebilir olduğu başka durumlar da vardır.

TCP yerine UDP kullanmak istediğiniz benzersiz bir durum, TCP'yi başka bir protokol (örneğin tüneller, sanal ağlar, vb.) Üzerinde tünellediğiniz yerdir. TCP'yi TCP üzerinden tünel yaparsanız, her birinin tıkanıklık denetimleri birbirini etkileyecektir. Bu nedenle, genellikle TCP'yi UDP (veya başka bir vatansız protokol) üzerinden tünellemeyi tercih eder. TechRepublic makalesine bakın: TCP üzerinden TCP'yi anlama : TCP Tünelinin Uçtan Uca Çıktı ve Gecikme Üzerindeki Etkileri .


2

UDP, bir uygulama kesin veri çoğaltması yerine "gerçek zamanlı" verilerle daha fazla ilgileniyorsa kullanılabilir. Örneğin, VOIP UDP kullanabilir ve uygulama paketleri yeniden sipariş etme konusunda endişelenir, ancak sonunda VOIP her bir pakete ihtiyaç duymaz, ancak daha da önemlisi birçoğunun sürekli akışına ihtiyaç duyar. Belki burada ses kalitesinde bir "aksaklık" vardır, ancak asıl amaç, diğer tarafta mükemmel bir şekilde yeniden yaratıldığını değil, mesajı almanızdır. UDP, bağlantı oluşturma ve TCP ile eşitleme masraflarının yükten ağır bastığı durumlarda da kullanılır. DNS sorguları mükemmel bir örnektir. Sorgu başına bir paket çıkışı, bir paket geri. TCP kullanıyorsanız, bu çok daha yoğun olacaktır. DNS yanıtını geri alamazsanız, tekrar deneyin.


2

Hız gerekli olduğunda UDP ve paketler değilse doğruluk ve ihtiyacınız olduğunda TCP.

UDP genellikle programınızı paketlerin doğruluğuna bağlı olmayacak şekilde yazmanız gerektiğinden daha zordur.


2

Her zaman net bir kesim değildir. Bununla birlikte, kayıp olmadan ve doğru sırada paketlerin garantili teslimatına ihtiyacınız varsa, TCP muhtemelen istediğiniz şeydir.

Öte yandan UDP, bilgi dizisinin daha az önemli olduğu veya verilerin tek bir pakete sığabileceği kısa bilgi paketlerinin iletilmesi için uygundur.

Aynı bilgileri birçok kullanıcıya yayınlamak istediğinizde de uygundur.

Diğer zamanlarda, sıralı veri gönderirken uygundur, ancak bir kısmı kaybolursa çok endişe duymazsınız (örneğin bir VOIP uygulaması).

Bazı protokoller daha karmaşıktır, çünkü ihtiyaç duyulan şey TCP özelliklerinin bazıları (hepsi değil), ancak UDP'nin sağladığı özelliklerden daha fazlasıdır. Burada uygulama katmanı ek işlevsellik uygulamak zorundadır. Bu durumlarda, UDP de uygundur (örneğin, İnternet radyosu, düzen önemlidir, ancak her paketin geçmesi gerekmez).

Nerede kullanılabileceğini / kullanılabileceğini örnekler 1) LAN üzerindeki bir grup makineye doğru zamanı yayınlayan bir zaman sunucusu. 2) VOIP protokolleri 3) DNS aramaları 4) LAN hizmetleri istemek, örneğin neredesin? 5) İnternet radyosu 6) ve diğerleri ...

Unix'te bugün uygulanan UDP protokollerinin bir listesini almak için grep udp / etc / services yazabilirsiniz ... yüzlerce var.


2

Steven'ın Unix Network Programming'in "TCP yerine UDP ne zaman kullanılmalı" bölümüne bakın .

Ayrıca, UDP'nin TCP'den her zaman daha hızlı olduğu yanılgısı hakkındaki diğer SO yanıtına bakın .

Steven'ın söyledikleri şöyle özetlenebilir:

  • Tek seçeneğiniz olduğundan yayın ve çok noktaya yayın için UDP kullanın (yeni uygulamalar için çok noktaya yayın kullanın)
  • Basit istek / yanıt uygulamaları için UDP kullanabilirsiniz, ancak kendi isteklerinizde, zaman aşımlarınızda ve yeniden iletimlerinizde
  • Toplu veri aktarımı için UDP kullanmayın.

1
Gelen herkes için bu son nokta hakkında biraz daha fazla bilgi. TCP toplu veri aktarımı için çalışır, ancak verilerinizin baştan sona gelmesini umursamıyorsanız, UDP üzerinden daha hızlı olabilecek bir protokol yazabilirsiniz - çok spesifik patolojik durumlarda çok daha hızlı. UDP'de toplu transfer yapamazsınız, her zaman daha kötü bir performans göstermez; bu nadiren zahmete değer olduğunu uygulamak için kıçından böyle bir acı.
ijw

1
Evet, toplu transfer için UDP kullanabilirsiniz ve kendi kontrol mekanizmanızı uygulamanız gerekir. Eğer eşek bir ağrı ya da değil programlama becerilerine bağlıdır, ama kesinlikle her zaman kötü bir performans değil. Ne yaptığını bilmek zorundasın; o zaman evet yapmazsan acı çekebilirsin.
Andy

2

UDP'nin bağlantısız bir protokol olduğunu biliyoruz, bu yüzden

  1. basit istek-yanıt iletişimi gerektiren işlemler için uygundur.
  2. iç akış, hata kontrolü olan işlemler için uygun
  3. geniş döküm ve çok noktaya yayın için uygun

Özel örnekler:

  • SNMP'de kullanılır
  • RIP gibi bazı rota güncelleme protokolleri için kullanılır

2

TCP'yi UDP ile karşılaştırdığımızda, UDP gibi bağlantısız protokoller hız sağlar, ancak paket iletiminin güvenilirliğini sağlamaz. Örneğin, video oyunlarında genellikle güvenilir bir ağa ihtiyaç duyulmaz, ancak hız en önemlisidir ve oyunlar için UDP'nin kullanılması ağ gecikmesini azaltma avantajına sahiptir.

resim açıklamasını buraya girin


1

Yol boyunca bazı verilerin kaybedilmesinin iletilen verileri tamamen bozmayacağı durumlarda TCP üzerinden UDP kullanmak istiyorsunuz. Kullanımlarının çoğu, oyun oynama gibi gerçek zamanlı uygulamalardadır (yani, her oyuncunun herhangi bir zamanda nerede olduğunu bilmek zorunda olmadığınız ve yol boyunca birkaç paketi kaybederseniz, FPS) veriler size oyuncuların nerede olduğunu doğru bir şekilde söyleyecektir) ve gerçek zamanlı video akışı (bozuk bir çerçeve görüntüleme deneyimini bozmayacaktır).


Peki, bozuk bir çerçeve görüntülemenin o kısmını mahveder, ancak daha sonraki karelerin kayıp kareden daha fazla değeri varsa, beklerken tüm sonraki kareleri durdurmasını istemezsiniz.
Simeon Pilgrim

1

Birçok PC'de binlerce winform istemcisi olan web servisimiz var. Bilgisayarların DB arka ucuyla bağlantısı yoktur, tüm erişim web servisi üzerinden yapılır. Bu yüzden bir UDP bağlantı noktasını dinleyen merkezi bir günlük sunucusu geliştirmeye karar verdik ve tüm istemciler, alındıktan sonra bir DB tablosuna dökülen bir xml hata günlüğü paketi (log4net UDP appender kullanarak) gönderir. Birkaç hata günlüğünün kaçırılıp kaybolmadığını ve binlerce istemciyle ana web hizmetini yüklemeyen özel bir günlük hizmetiyle hızlı olduğumuzu umursamadığımız için.


0

TCP'nin çalışabileceği UDP'yi önermek konusunda biraz isteksizim. Sorun, TCP herhangi bir nedenle çalışmıyorsa, bağlantı çok gecikmeli veya tıkalı olduğu için, uygulamayı UDP kullanmak için değiştirmek yardımcı olmayacaktır. Kötü bir bağlantı UDP için de kötüdür. TCP zaten tıkanıklığı en aza indirmek için çok iyi bir iş çıkarıyor.

UDP'nin nerede gerekli olduğunu düşünebileceğim tek durum yayın protokolleri için. Bir uygulamanın bilinen iki ana bilgisayarı içerdiği durumlarda, UDP büyük olasılıkla kod karmaşıklığının önemli ölçüde artmış maliyetleri için marjinal performans avantajları sunacaktır.


UDP'den daha iyi sonuçlar alacağınız bir uygulama, bir ara düğüm trafik güvenliği gerçekleştiriyorsa, paket hızını daha kolay kontrol edebileceğiniz için, paketleri hızlı itecek TCP ve TCP'nin etkileşimi pencereleme polislikle olumsuz etkileşime girer.
Simeon Pilgrim

Bu hala gerçek testlerden sonra yapılması gereken bir optimizasyon. Benim iddiam, önce TCP'yi kullanmaya çalışmanız ve sadece TCP'nin bir nedenle çalışmadığını keşfettiğinizde alternatifleri denemeniz gerektiğidir. Teorik olarak daha iyi bant genişliği kullanımını desteklediği için UDP'nin seçilmesi, erken optimizasyonun bir şeklidir.
Temmuz09

Oh optimizasyon cephesinde katılıyorum. Ancak TCP'nin ne zaman sorun olabileceğine dair bilgi, bu performans sorununu çözmeye çalıştığınızda başka bir şey yardımcı olur.
Simeon Pilgrim

-1

UDP'yi yalnızca gerçekten ne yaptığınızı biliyorsanız kullanın. UDP bugün çok nadir durumlarda, ancak onu her yere yapıştırmaya çalışan (hatta çok deneyimli) uzmanların sayısı orantısız görünüyor. Belki de hata işleme ve bağlantı bakım kodunu kendileri uygulamaktan hoşlanırlar.

Checksum baskısı olarak bilinen şey nedeniyle TCP'nin modern ağ arayüz kartları ile çok daha hızlı olması beklenir . Şaşırtıcı bir şekilde, bir sağlama toplamı hesaplamak için yüksek bağlantı hızlarında (1 Gbps gibi) bir CPU için büyük bir yük olacaktır, bu nedenle baskı için TCP paketlerini tanıyan NIC donanımına yüklenir ve size aynı hizmeti sunmaz.


2
UDP sağlama toplamı boşaltma, tıpkı TCP sağlama toplamı boşaltma gibi kullanılabilir.
Ben Voigt

ancak sağlama toplamı doğrulaması değil.
Pavel Radzivilovsky

1
Günümüzde tüketici sınıfı ethernet adaptörlerinde bile hem gönderme hem de alma için UDP sağlama toplamı boşaltma vardır (alma boşluğu doğrulama yapıyor). Ve bu özelliği on yıl önce prosumer donanımında gördüm, eminim sunucu sınıfı NIC'lerde daha uzun süredir var.
Ben Voigt

-2

UDP, veri paketinin güvenilirliği göz önüne alındığında gönderilmesi gereken VoIP için mükemmeldir ... Görüntülü sohbet UDP'ye bir örnektir (herhangi bir görüntülü sohbet sırasında wireshark ağ yakalama ile kontrol edebilirsiniz) .. Ayrıca TCP ile çalışmaz DNS ve SNMP protokolleri. TCP'nin çok fazla ek yükü varken UDP'nin ek yükü yoktur

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.