Hem TCP hem de UDP'yi aynı anda kullanmak mantıklı mı?


10

Okuduktan sonra UDP hala veri ağırlıklı gerçek zamanlı oyunlar için TCP'den daha mı iyi? , TCP ve UDP'yi aynı anda, ancak farklı şeyler için kullanmanın mantıklı olup olmadığını merak ediyorum:

  • Nadiren gönderilen ancak güvenilir bir şekilde ulaşması garanti edilen bilgileri göndermek için TCP.
    Skor güncellemeleri, oyuncunun adı ve hatta oyun dünyasındaki bir ışığın açık / kapalı durumu gibi.

  • Sürekli güncellenen ve zaman zaman kaybolabilen bilgileri iletmek için UDP, daha yeni bilgiler her zaman yolda.
    Konum, döndürme vb.

Bu makul bir fikir mi? Olası dezavantajlar nelerdir?
Bununla başa çıkmanın daha iyi yolları var mı?


Udp ve tcp ile ilgili olarak bu sitedeki diğer iş parçacıklarını mutlaka okuyun. Temel olarak sorularınızla ilgili birkaç ayrıntı bulacaksınız. Bir hipotez olarak: UDP üzerinde her iki dünyadan en iyi şekilde yararlanmaya çalışan melez protokoller olduğundan şüpheleniyorum, yani daha düşük gecikme, çekişme stratejisi, yük dengeleme ve teslimat garantileri. Önerildiği gibi, konuyla ilgili soruları arayın ve sorunuzu henüz burada ele alınmadığını düşündüğünüz bir şeye daraltın.
teodron

@teodron Şüphelenmenize gerek yok. Cevabımda belirtildiği gibi, bu bir gerçek.
Mühendis

Yanıtlar:


8

İki protokol arasındaki çekişme nedeniyle UDP için paket kaybı ile sonuçlanır - TCP olduğu halde UDP'nin teslimatın garanti edilmediğini unutmayın. UDP acı çekerken daha fazla TCP paketi geçecek - TCP UDP paket kaybına neden oluyor . Ayrıca yönlendirici altyapısının UDP üzerinden TCP'yi desteklediği (tarihsel) fikri vardı, ancak bu geç aşamada hala doğru olduğundan şüphe duyuyorum.

Bence oyunlarda ve benzerlerinde kullanılmak üzere dışarıda bulunan, TCP'nin faydalarından bazılarını dezavantajları olmayan bazı sunan, bağlantı odaklı UDP protokollerinden birini bulmak daha iyi olur. Genellikle, her kavramı detaylandıran bir teknik inceleme ile birkaç tane vardır.

Bunların bir örneği açık kaynak kodlu Enet kütüphanesidir , birincil özelliği isteğe bağlı olarak paketlerin UDP üzerinden güvenilir, sıralı olarak teslim edilmesidir.


1
Cevabı biraz "yetersiz" yapmak için, UDP tabanlı taşıma kütüphaneleri için seçeneklerin / referansların kısa (çok kısa) bir listesini verebilir misiniz? (belki ENET, RakNet, zeroMQ, UDT?). Yukarıdaki yorumuma göre, bu sitede bir yerde bunlar hakkında bir tartışma gördüm, ancak bu bilginin bir parçasını çoğaltmaya değer olabilir.
teodron

1
@Arcane Engineer UDP ve TCP yuvaları farklı bağlantı noktalarında çalışıyorsa ne olur?
KaareZ

@KaareZ Hiç fark etmemeli. Limanlara bölünmek basit bir mesele olsaydı, yapılan çalışmalar (düzenleme içindeki bağlantıya bakınız) geçerli olmayacaktır. Günün sonunda, bir bağlantı noktası yalnızca bir yazılım bağlantı noktasıdır. Ağ özelliklerini gerçekten etkilemez, bu da bununla ilgilidir.
Mühendis

Söyledikleriniz mantıklı, ama çok az TCP trafiği olan yerlerde hala geçerli olup olmadığını merak edemiyorum. TCP üzerinden yalnızca küçük miktarlarda bilgi iletilirse, örneğin her ~ 10 saniyede bir ortalama bir veya iki kez, bu UDP trafiğini gerçekten önemli ölçüde etkiler mi?
gandalf3

2
"TCP UDP paket kaybına neden olur" kağıdının tarihi yok. En son referansları 1996'dan. Kağıt ne zaman? Sonuçlar hala geçerli mi?
Andreas

4

İşte Sam Jansen'in gafferongames.com'a yaptığı bir yorumdan alıntı :

Bir oyun geliştiricisi olarak değil, bir ağ araştırmacısı olarak konuşurken, asla TCP ve UDP'yi birlikte kullanmamanın sonucu biraz güçlü görünüyor. TCP yalnızca çok fazla veri gönderiyorsa paket kaybı yaşayacaktır; bazı yollarla tıpkı gönderdiğiniz UDP verileri gibi. Aradaki fark, TCP'nin gönderme hızı üzerinde doğrudan kontrolünüz olmamasıdır, bu size gizlidir.

Sadece bazı güvenilir veriler göndermeniz gerekiyorsa ve yeniden iletim ve güvenilir bir protokol uygulamak konusunda endişelenmek istemiyorsanız ve oranın düşük olacağını biliyorsanız, hem TCP hem de UDP'yi kullanmayla ilgili herhangi bir sorun olmayacaktır.

İkisi arasındaki ilişki gerçekten bu kadar karmaşık değildir: TCP, paket kaybı elde edene kadar gönderme hızını (gönderilecek veri varsa) arttırır, bu durumda oranını geri çevirir, ardından oranı tekrar artırmaya başlar (bu zaman daha yavaş). Orandaki artış paket kaybına neden olduğunda, UDP paketleriniz de dahil olmak üzere başka veri akışlarına da girmesi muhtemeldir.

UDP Paket Kaybının Kağıt Özellikleri: TCP Trafiğinin Etkisi , bir kerede birden fazla TCP bağlantısı açarak ve ağı verilerle doldurarak sonuçlarını aldı. Bu, tıkanıklığa ve ardından küresel senkronizasyona yol açar , her ikisi de paketlerin düşmesine neden olur. Açıkçası, bir oyun istemcisi aynı anda bir düzine bağlantı açmayacak ve ağa veri aktaracak ve böylece sonuçlarınız farklı olacaktır.

Soruna cevap vermek için:

Aynı anda hem TCP hem de UDP kullanmak mantıklı olup olmadığını merak ediyorum, ama farklı şeyler için [...]

Evet, bu, bant genişliği sınırlarınız dahilinde kaldığınızı varsayarak kabul edilebilir bir şeydir.

  • Nadiren gönderilen ancak güvenilir bir şekilde ulaşması garanti edilen bilgileri göndermek için TCP. Skor güncellemeleri, oyuncunun adı ve hatta oyun dünyasındaki bir ışığın açık / kapalı durumu gibi.

Hem TCP hem de UDP kullanırken, her zaman UDP üzerinden mümkün olduğunca ve TCP üzerinden mümkün olduğunca az göndermeyi tercih etmelisiniz.

Şimdi size şunu soruyorum: Skoru, oyuncunun adını ve TCP üzerinden bir ışığın durumunu göndermek gerçekten gerekli mi? Bu verileri eninde sonunda almanız gerektiği doğru olsa da, bu verileri kesinlikle sırayla ve tam olarak bir kez almanız gerektiği doğru mu?

Muhtemelen değil.

UDP bu vakalar için iyi çalışıyor ve Quake 3 bunun nasıl bir örneğidir.

Peki UDP'nin yanında iyi bir TCP örneği nedir? Bir oyunun sohbet kutusunu düşünün. Bu sohbet kutusundaki güncellemelerin (yani yeni metin satırlarının) hem güvenilir hem de sırayla gönderilmesi gerekir. Bu nedenle, TCP iyi bir seçimdir.


3

Bu makul bir fikir mi?

  • Evet

Olası dezavantajlar nelerdir?

  • Paket Kaybı, daha fazla kod karmaşıklığı, yönetmek için başka bir bağlantı == bağlantı kesilmesi, zaman aşımları, istisnalar, ne olursa olsun daha fazla şans ...

Bununla başa çıkmanın daha iyi yolları var mı?

  • Mevcut bir Güvenilir UDP Kütüphanesi kullanın. En popüler ikisi: Lidgren Ağı (C #), RakNet (C ++). Deneyiminden dolayı Lidgren'in kullanımı çok kolay, hızlı ve güvenilir olduğunu söyleyebilirim.

1

Dikkate alınması gereken ek bir kaynak kısıtlaması vardır. Sunucudaki TCP'nin çoğu uygulaması (hepsine inanıyorum, ancak hiçbir referansı yok), sunucunun aynı anda kaç tane eşzamanlı TCP Bağlantısı açabileceği konusunda sınırlamaları vardır. Bu, her oyuncunun kendi bağlantısına ihtiyacı varsa aynı anda açık olabileceğiniz oyuncu sayısını sınırlar.

Sınırlar, ağ sistemindeki ayarlarla tanımlanır. Ayrıca her Bağlantı, sunucu üzerinde bir yerden gelmesi gereken bir bellek kullanır.

Çözümlerden biri, veri aktarılırken yalnızca geçici bir TCP Bağlantısı açmak ve hemen Kapatmaktır. Bu işlemleri yavaşlatacak, tcp bağlantısı açmak oldukça "pahalı" bir süreçtir. Her zaman olduğu gibi, büyük büyüme sağlamak için baştan beri sağlam bir sistem tasarlamakla ilgilidir.

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.