Jangan hanya menerima jawaban langsung "ya atau tidak karena saya bilang begitu" ketik di sini karena Anda mungkin membuka diri untuk harus berjuang menghadapi banyak masalah dengan UDP yang sebenarnya tidak perlu Anda hadapi.
Tidak ada jawaban lain di sini yang menyatakan cara yang jelas untuk membuktikan ini.
Ambil beberapa fakta sederhana
- Header IP adalah 20 byte, apa pun protokol yang Anda gunakan.
- Header UDP adalah 4 byte
- Header TCP adalah 20 byte
Jadi, setiap kali Anda mengirim pesan 1 byte ke bawah, Anda sebenarnya telah mengirim 25 atau 41 byte tergantung protokol yang mengasumsikan header IP juga diperlukan.
sumber:
Saranku
Ambil situasi Anda saat Anda membutuhkan interaksi server klien, perkirakan jumlah klien lalu lakukan perhitungan berdasarkan data yang benar-benar Anda kirim di antara keduanya.
Sebuah contoh
Katakanlah saya mengirim 10 pesan yang masing-masing 1 byte per pembaruan di game saya dan saya memperbarui sekitar 60 fps jadi saya perlu mengirim 60 * 10 = 600 byte per detik data pesan aktual + header yang relevan.
Sekarang tergantung pada permainan saya bisa mengirim itu semua sebagai satu pesan sehingga overhead saya dari lapisan TCP hanya 40 byte (efektif biaya lebih dari UDP 20 byte per detik), tidak memiliki overhead itu adalah potensi biaya 600 byte ( karena saya mungkin harus mengirim ulang seluruh aliran pesan).
Namun jika sangat penting bahwa setiap pesan dikirim dengan sendirinya begitu siap untuk dikirim, saya memiliki 600 pesan (juga 600 byte) + 40 * 600 = 24k senilai overhead TCP atau ~ 14r overhead UDP per detik + 600 byte data pesan.
Sekali lagi, kami mengajukan pertanyaan, seberapa pentingkah pesan-pesan itu, seberapa sering pesan-pesan itu, dan dapatkah mereka dikumpulkan sedemikian rupa untuk mengurangi biaya overhead?
Itu hanya berdasarkan pada sekelompok pesan byte tunggal, biasanya Anda akan melakukan sesuatu yang sangat berbeda tetapi tanpa mengetahui data mentah yang dikirim sulit untuk membuktikan cara baik jika TCP lebih cocok untuk situasi Anda daripada UDP.
Jadi, apakah ini akan berhasil?
Nah, jika Anda memiliki fps yang khas, dan posisinya penting (untuk menghindari kecurangan atau keputusan yang salah), Anda perlu tahu bahwa aliran jaringan Anda dapat diterima, tetapi masing-masing 32 pemain streaming yang 24k + byte pesan bolak-balik (jadi 768KB / s + messages) ... sekitar 10mb / s jalur broadband hanya untuk header individu berdasarkan pengiriman setidaknya 1 pesan per frame dari setiap klien ke semua klien lain melalui server.
Anda jelas tidak akan membuat kode server dan klien Anda untuk bekerja seperti itu dan ukuran pesan sangat mungkin jauh lebih besar dan mungkin sedikit lebih jarang dari 1 byte per frame dalam kebanyakan situasi sehingga sulit untuk mengatakan tanpa melihat dunia nyata "ini adalah data yang perlu saya kirim" contoh.
Kasus saya
Saya telah membuat panggilan dalam kasus saya bahwa itu adalah overhead yang masuk akal tapi itu didasarkan pada bagaimana saya membangun aliran pesan saya jadi saya tidak memiliki biaya besar dibandingkan dengan beberapa desain.
TCP berfungsi dengan baik dan saya memiliki server MMO skala besar dan kerangka kerja klien tetapi saya tidak perlu melakukan streaming banyak data yang pernah membingkai atau banyak paket kecil karena saya dapat melakukan batch panggilan saya.
untuk yang lain: TCP tidak akan berfungsi, dan mereka hanya dapat menggunakan UDP tetapi harus menerima bahwa itu tidak akan memberi mereka jaminan tentang apa yang mereka dapatkan (jaminan pemesanan / kedatangan).
Pertimbangan lainnya
Banyak mesin gim yang memiliki kode buruk menangani semua yang ada di utas utama pada cpu sehingga cpu sering kali hanya diberi waktu yang sangat sedikit untuk menangani kode jaringan, implementasi yang layak baik dari servis dan klien akan sepenuhnya async dan mungkin mendorong dan tarik pesan dalam batch.
Ada beberapa perpustakaan jaringan yang bagus di luar sana, tetapi seperti yang terlihat di sini, banyak yang tampaknya berpendapat bahwa UDP "lebih baik", faktor pertama dalam kebutuhan Anda terlebih dahulu dan mungkin tidak demikian, dan menemukan perpustakaan yang tidak Faktor dalam hal-hal seperti yang Anda lakukan dapat mengakibatkan pengaturan TCP yang berkode buruk dibandingkan dengan varian UDP di lib yang sama (saya hanya mengatakan saya telah melihat ini, dan tes beban telah membuktikannya).
Bangun sesuatu pertama-tama basis teknis dari data yang ingin Anda kirimkan dan ujilah kemudian lakukan perhitungan untuk meningkatkannya, uji beban kasus terburuk dengan mengerahkan ke cloud dan minta 50 komputer menjalankan klien pengujian untuk melihat apakah ia dapat menangani batas Anda 32 pemain per game (atau batas apa pun yang mungkin Anda miliki).