Çok oyunculu bir oyun için TCP veya UDP mi?


18

Bu çok gördüğüm bir soru. Çoğu insan UDP'nin gerçek zamanlı oyunlar için her zaman TCP'den daha iyi olduğunu söylüyor. Anladığım kadarıyla TCP, UDP umursamazken diğer tarafa ulaşana kadar paketleri tekrar tekrar göndermeye çalışıyor.

Okuduğum şeylerin çoğu, UDP'nin herhangi bir gerçek zamanlı oyun için bir zorunluluk olduğu ve TCP'nin korkunç olduğu. Ama mesele şu ki, çoğu insan zaten UDP'nin üstüne bir çeşit TCP uyguluyor gibi görünüyor. Ayrıca, 80'lerde olmadığımız ve internetin artık oldukça hızlı ve güvenilir olduğu göz önüne alındığında, ikisi arasındaki farkın ihmal edilebilir olduğunu duydum.

Buradaki genel anlayışım yanlış mı? Birisi bunu benim için temizleyebilir mi?


7
internet is now pretty fast and reliableHayır değil. Bant genişliği önemli ölçüde evet arttı, ama gecikme hala oldukça yüksektir. Saf TCP ile, paket squishing yapmazsanız, en iyi istemcide UDP aracılığıyla yapılan sunucu makbuzunun maksimum uygun gecikmeden daha fazla olması gerekir. Sorun şu ki, oyundaki bazı bilgilerin güvenilir olması, bazılarının ise hızlı olması gerekiyor. UDP'nin üstündeki özel protokoller, buna ihtiyacınız olan her şeyi güzel bir pakette veren bir dizi özel protokolün yanı sıra buna izin verir.
Sıradan

4
TCP'yi UDP üzerinden tam olarak uygulamıyorlar. TCP'nin sunduğu ve UDP'nin üstüne uygulanan bazı özellikler vardır. UDP'yi kullanmanın en önemli noktası t0, hiç alınmamış olan dünya durumunu içeren bir paket gönderirseniz , o zaman yeni dünya durumunu gönderirseniz t1, istemci gerçekten ilk paketi alana kadar beklemek zorunda kalmazsınız, bu zaten kullanılmıyor.
Vincent Savard

@Ordous Sanırım bu sorumu cevaplıyor :) Teşekkürler
flooblebit

4
Ayrıca, UDP'nin bir endişe durumunda sunucunuzu DDoS saldırılarına açık hale getirebilecek IP kimlik sahtekarlığına eğilimli olduğunu unutmayın. İstemcinin IP adresini ve diğer ayrıntıları sunucuya gönderen ve daha sonra "kimlik doğrulaması yapılmış" adresten UDP paketlerini kabul eden bir "denetim" TCP bağlantısına sahip olmaktan kaçınabilirsiniz. Ayrıca, kendi şifreleme katmanınızı uygulamanız gerekebilir, çünkü UDP üzerinden açık standartlar yoktur.
ARau

@ blownie55 orada iyi puanlar
Naresh Kumar

Yanıtlar:


12

Eşler arası, sunucuyu çalıştıran kullanıcılarla istemci / sunucu veya sunucuyu çalıştıran veri merkezine sahip istemci / sunucu hakkında konuştuğunuza göre değişir. Sadece ikinci durumda internet gerçekten hızlı ve güvenilirdir. Kullanıcılarınızın bilgisayarlarının hızlı olduğu garanti edilmez ve kesinlikle güvenilir olmayacaktır.

UDP, yaptığınız TCP benzeri uygulama türleri üzerinde daha fazla kontrol sahibi olmanızı sağlar. Paketleri arızalı olarak yürütmek, gereksiz olduğunu düşündüğünüz paketleri yeniden denerken, bu tür şeyleri denemek için daha fazla esneklik sağlar. Ancak bu sadece gerektiğinde ve gerekli uzmanlığa sahipseniz yapılmalıdır.

Bu esneklik olmadan yapabiliyorsanız, TCP yeterince iyi çalışır ve size çok fazla zaman kazandırır. Profesyonel stüdyolar bile (çalıştığım gibi) kesinlikle UDP'ye ihtiyaç duymazlarsa TCP kullanıyorlar ve ağ programlamaya adanmış insanları var .


Ayrıca "ne için" önemli olduğunu da öneririm - örneğin bir oyun içi sohbet sistemi için UDP'yi bile düşünmeyeceğim. Dikkate alacağım diğer bir şey (en azından "istemci sunucu" için) sunucunun trafiği ne kadar verimli bir şekilde ele alabileceğidir - modern NIC'lerin TCP için çok sayıda yerleşik "boşaltma" öğesi vardır (paketleri bölme ve birleştirme, paketleri akışlara ayırma, vb.) CPU ek yükünü azaltmak için tasarlanmıştır ve bunların çoğu UDP için çalışamaz.
Brendan

1
Artık UDP kullanan ve varsayılan olarak TLS kullanılarak şifrelenen HTTP / 3'ün bir parçası olacak QUIC ( en.wikipedia.org/wiki/QUIC ) değişebilir . Bunun yaygın olarak kullanılabilir olması biraz zaman alacaktır ve sabırsızlıkla beklenmektedir. Burada ele alınması gereken bazı konular hakkında daha fazla ayrıntı blog.cloudflare.com/the-road-to-quic
ARau

3

@Ordous'un işaret ettiği gibi "İnternet artık oldukça hızlı ve güvenilir" demek için bir varsayım ve tehlikeli bir şey de.

Teslimat açısından kritik paketler için UDP + özel protokolünün çoğu oyunda sihir yapmasının nedeni, bazı paketleri kaybederseniz "iyi" olabileceği zamanların olmasıdır (sadece. Örneğin oyunun tamamlanması için ikincil kritik olmayan olaylar için) , ayrıca imleç hareketi vb. için bazı verileri kaybetmek için "hiç de iyi değil" zamanlar da vardır.

UDP varsayılan olarak onları tekrar tekrar itmek için zaman kaybetmez.

Ve, birçok oyun tesadüfen "bazen kaybetmek için iyi" paketleri "her zaman hatasız teslim etmek" paketleri daha fazla gibi görünüyor. Bu nedenle bu göreve doğal bir uyum sağlar.

UDP'de ihtiyaç duyulan tek şey, "her zaman hatasız teslim edilmesi gerekiyor" paketlerinin düzgün bir şekilde teslim edilmesine yardımcı olan ve oyun verilerinin geri kalanını ağ bağlantısının merhametine bırakarak özel bir protokol kullanmaktı.

Şimdi, iletilecek verilerinizin çoğunun ne tür bir trafik oluşturduğuna karar vermek, daha iyi karar vermenize yardımcı olacaktır.

TCP'ye karşı mesele, yeniden denemeler için harcanan zamanın ŞİMDİ önemli olan paketlerin gönderilmesi için harcanabilmesidir.

İletim sırasında herhangi bir sorun olursa, TCP'nin UDP + Özel Yığına kıyasla deneyimlerini bozarak kullanıcı için daha parçalanmış bir oyun oynama senaryosuna geçiş yapma şansı da vardır (Bu son bölüm sadece önsezi. Bu konuyu yorumlamak için diğer uzmanlara gönderin. Bu senaryonun olasılıkları hakkında bilgi edinmek isterim).

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.