Apakah masuk akal untuk menggunakan TCP dan UDP sekaligus?

10

Setelah membaca Apakah UDP masih lebih baik dari TCP untuk game realtime yang berat data? , Saya bertanya-tanya apakah masuk akal untuk menggunakan TCP dan UDP secara bersamaan, tetapi untuk hal-hal yang berbeda:

  • TCP untuk mengirim informasi yang dikirim jarang, tetapi harus dijamin akan tiba dengan andal.
    Seperti pembaruan skor, nama pemain, atau bahkan lampu nyala / mati di dunia game.

  • UDP untuk mentransmisikan informasi yang diperbarui terus-menerus dan dapat hilang sesekali, karena informasi yang lebih baru selalu dalam perjalanan.
    Seperti posisi, rotasi, dll.

Apakah ini ide yang masuk akal? Apa kemungkinan kelemahannya?
Apakah ada cara yang lebih baik untuk menangani ini?

gandalf3
sumber
Pastikan untuk membaca utas lainnya di situs ini tentang udp dan tcp. Anda akan menemukan beberapa detail yang pada dasarnya berhubungan dengan pertanyaan Anda. Sebagai sebuah hipotesis: Saya menduga ada protokol hybrid di atas UDP yang mencoba untuk mendapatkan yang terbaik dari kedua dunia, yaitu latensi yang lebih rendah, strategi pertikaian, keseimbangan muatan, dan jaminan pengiriman. Seperti yang disarankan, cari pertanyaan terkait pada topik dan persempit pertanyaan Anda ke sesuatu yang Anda rasa belum ditangani di sini.
teodron
@teodron Anda tidak perlu curiga. Sebagaimana dinyatakan dalam jawaban saya, itu adalah fakta.
Insinyur

Jawaban:

8

Ini mengakibatkan hilangnya paket untuk UDP karena pertikaian antara kedua protokol - ingat bahwa UDP tidak dijamin pengiriman, sedangkan TCP. Lebih banyak paket TCP akan melalui sementara UDP menderita - TCP menginduksi kehilangan paket UDP . Ada juga gagasan (historis) bahwa infrastruktur router lebih menyukai TCP daripada UDP, meskipun saya ragu itu masih benar pada tahap akhir ini.

Saya pikir Anda akan lebih baik menemukan salah satu protokol UDP berorientasi koneksi yang ada di luar sana untuk digunakan dalam gim dan sejenisnya, yang menawarkan Anda beberapa manfaat TCP tanpa ada kelemahannya. Ada beberapa seperti itu, biasanya dengan whitepaper merinci setiap konsep.

Contoh dari hal itu adalah perpustakaan Enet open source , fitur utamanya adalah pengiriman paket yang dapat diandalkan dan dapat dipesan secara opsional melalui UDP.

Insinyur
sumber
1
Untuk membuat jawabannya sedikit "lebih menarik", dapatkah Anda memberikan daftar opsi / referensi singkat (sangat singkat) untuk perpustakaan transportasi berbasis UDP? (mungkin ENET, RakNet, zeroMQ, UDT?). Sesuai komentar saya di atas, saya yakin saya telah melihat diskusi tentang ini di suatu tempat di situs ini, tetapi mungkin layak mereplikasi sebuah fragmen dari informasi itu.
teodron
1
@Arcane Engineer Bagaimana jika soket UDP dan TCP berjalan pada port yang berbeda?
KaareZ
@ KaareZ Seharusnya tidak membuat perbedaan sama sekali. Studi yang telah dilakukan (lihat tautan di edit) tidak akan valid jika itu adalah masalah sederhana membagi ke dalam port. Pada akhirnya, port hanyalah port perangkat lunak. Itu tidak benar-benar mempengaruhi karakteristik jaringan, yang merupakan intinya.
Insinyur
Apa yang Anda katakan masuk akal, tetapi saya tidak bisa tidak bertanya-tanya apakah ini masih berlaku di mana ada sangat sedikit lalu lintas TCP. Jika hanya sejumlah kecil informasi yang dikirim melalui TCP, katakanlah rata-rata sekali atau dua kali setiap ~ 10 detik, apakah itu benar-benar akan memengaruhi lalu lintas UDP?
gandalf3
2
Kertas "TCP menginduksi kehilangan paket UDP" tidak memiliki tanggal. Referensi terbaru berasal dari tahun 1996. Sejak kapan makalahnya? Apakah kesimpulannya masih valid?
Andreas
4

Berikut ini kutipan dari Sam Jansen dari komentar di gafferongames.com :

Berbicara sebagai peneliti jaringan dan bukan pengembang game, kesimpulan untuk tidak pernah menggunakan TCP dan UDP bersama tampaknya agak kuat. TCP hanya akan mengalami kehilangan paket jika mengirim terlalu banyak data; dalam beberapa hal seperti data UDP yang Anda kirim. Perbedaannya adalah Anda tidak memiliki kendali langsung pada kecepatan pengiriman TCP, ini tersembunyi bagi Anda.

Jika Anda hanya perlu mengirim beberapa data yang dapat diandalkan dan tidak ingin khawatir tentang pengiriman ulang dan menerapkan protokol yang andal, dan Anda tahu tarifnya akan rendah, maka tidak akan ada masalah dengan menggunakan TCP dan UDP.

Hubungannya tidak terlalu rumit di antara keduanya: TCP hanya meningkatkan laju pengirimannya (jika ada data untuk dikirim) sampai ia kehilangan paket, dalam hal ini memutar kembali tarifnya, kemudian mulai meningkatkan tarifnya lagi (ini waktu lebih lambat). Ketika peningkatan laju menyebabkan hilangnya paket, sangat mungkin untuk mencapai aliran data lain juga, termasuk paket UDP Anda.

Makalah Karakteristik Paket UDP Rugi: Pengaruh Lalu Lintas TCP mendapatkan hasilnya dengan membuka beberapa koneksi TCP sekaligus dan membanjiri jaringan dengan data. Hal ini menyebabkan kemacetan yang diikuti oleh sinkronisasi global , yang keduanya menyebabkan paket terjatuh. Jelas, klien gim tidak akan membuka selusin koneksi sekaligus dan membanjiri jaringan dengan data, sehingga hasilnya Anda akan berbeda.

Untuk menjawab pertanyaan Anda:

Saya bertanya-tanya apakah masuk akal untuk menggunakan TCP dan UDP pada saat yang sama, tetapi untuk hal-hal yang berbeda [...]

Ya, ini adalah hal yang dapat diterima untuk dilakukan dengan asumsi Anda tetap dalam batas bandwidth Anda.

  • TCP untuk mengirim informasi yang dikirim jarang, tetapi harus dijamin akan tiba dengan andal. Seperti pembaruan skor, nama pemain, atau bahkan lampu nyala / mati di dunia game.

Saat menggunakan TCP dan UDP, Anda harus selalu memilih untuk mengirim sebanyak mungkin melalui UDP dan sesedikit mungkin melalui TCP.

Sekarang, saya bertanya kepada Anda: Apakah benar-benar perlu untuk mengirim skor, nama pemain, dan keadaan cahaya di atas TCP? Meskipun benar bahwa Anda perlu menerima data ini pada akhirnya, apakah benar bahwa Anda perlu menerima data ini secara ketat dan tepat sekali?

Mungkin tidak.

UDP berfungsi dengan baik untuk kasus-kasus ini, dan Quake 3 adalah contoh yang bagus tentang caranya.

Jadi, apa contoh yang baik dari TCP bersama UDP? Nah, pikirkan kotak obrolan game. Pembaruan untuk kotak obrolan ini (yaitu, baris teks baru) harus dikirim dengan baik dan benar-benar berurutan. Dengan demikian, TCP cocok.

Pubby
sumber
3

Apakah ini ide yang masuk akal?

  • Iya

Apa kemungkinan kelemahannya?

  • Paket Hilang, kompleksitas kode lebih banyak, koneksi lain untuk mengelola == lebih banyak peluang untuk terputus, waktu habis, pengecualian, apa pun ...

Apakah ada cara yang lebih baik untuk menangani ini?

  • Gunakan Perpustakaan UDP yang andal dan sudah ada. Dua yang paling populer adalah: Lidgren Network (C #), RakNet (C ++). Dari pengalaman saya bisa mengatakan Lidgren super mudah digunakan, cepat, dan dapat diandalkan.
Shmoopy
sumber
1

Ada batasan sumber daya tambahan untuk dipertimbangkan. Sebagian besar implementasi (Saya Percaya semua, tetapi tidak memiliki referensi) dari TCP pada server memiliki batasan pada berapa banyak Koneksi TCP bersamaan server dapat terbuka pada saat yang sama. Ini akan membatasi jumlah pemain yang dapat Anda buka secara bersamaan jika setiap pemain membutuhkan koneksi sendiri.

Batas ditentukan oleh pengaturan dalam sistem jaringan. Selain itu setiap Koneksi menggunakan memori yang harus datang dari suatu tempat di server.

Salah satu solusinya adalah dengan hanya membuka Koneksi TCP sementara sementara data ditransfer dan Tutup segera. Ini akan membuat transaksi lebih lambat, membuka Koneksi tcp adalah proses yang agak "mahal". Seperti biasa, ini semua tentang merancang sistem yang kuat dari awal untuk memungkinkan pertumbuhan besar.

pengguna102337
sumber