Jika Anda mengalami situasi di mana koneksi TCP berpotensi terlalu lambat dan 'koneksi' UDP berpotensi terlalu tidak dapat diandalkan, apa yang Anda gunakan? Ada berbagai protokol UDP standar yang dapat diandalkan di luar sana, pengalaman apa yang Anda miliki dengannya?
Harap diskusikan satu protokol per balasan dan jika orang lain telah menyebutkan protokol yang Anda gunakan, pertimbangkan untuk memilihnya dan gunakan komentar untuk menjelaskannya jika diperlukan.
Saya tertarik dengan berbagai opsi di sini, di mana TCP berada di satu ujung skala dan UDP di ujung lain. Berbagai opsi UDP yang andal tersedia dan masing-masing membawa beberapa elemen TCP ke UDP.
Saya tahu bahwa seringkali TCP adalah pilihan yang tepat tetapi memiliki daftar alternatif seringkali berguna dalam membantu seseorang sampai pada kesimpulan itu. Hal-hal seperti Enet, RUDP, dll. Yang dibangun di atas UDP memiliki pro dan kontra yang beragam, apakah Anda pernah menggunakannya, apa pengalaman Anda?
Untuk menghindari keraguan, tidak ada lagi informasi, ini adalah pertanyaan hipotetis dan yang saya harap akan memperoleh daftar tanggapan yang merinci berbagai pilihan dan alternatif yang tersedia bagi seseorang yang perlu membuat keputusan.
sumber
Jawaban:
Sulit untuk menjawab pertanyaan ini tanpa beberapa informasi tambahan tentang domain masalahnya. Misalnya, berapa volume data yang Anda gunakan? Seberapa sering? Apa sifat datanya? (misalnya, apakah unik, satu data? Atau aliran data sampel? dll.) Untuk platform apa Anda mengembangkan? (mis. desktop / server / tertanam) Untuk menentukan apa yang Anda maksud dengan "terlalu lambat", media jaringan apa yang Anda gunakan?
Tetapi dalam istilah umum (sangat!) Saya pikir Anda harus berusaha sangat keras untuk mengalahkan tcp untuk kecepatan, kecuali jika Anda dapat membuat beberapa asumsi keras tentang data yang Anda coba kirim.
Misalnya, jika data yang Anda coba kirim sedemikian rupa sehingga Anda dapat mentolerir hilangnya satu paket (mis. Data sampel secara teratur di mana tingkat pengambilan sampelnya berkali-kali lebih tinggi daripada bandwidth sinyal) maka Anda mungkin dapat mengorbankan beberapa keandalan transmisi dengan memastikan bahwa Anda dapat mendeteksi kerusakan data (misalnya melalui penggunaan CRC yang baik)
Tetapi jika Anda tidak dapat mentolerir hilangnya satu paket, maka Anda harus mulai memperkenalkan jenis teknik keandalan yang sudah dimiliki tcp. Dan, tanpa melakukan sejumlah pekerjaan yang wajar, Anda mungkin menemukan bahwa Anda mulai membangun elemen-elemen itu menjadi solusi ruang pengguna dengan semua masalah kecepatan yang melekat yang menyertainya.
sumber
Bagaimana dengan SCTP . Ini adalah protokol standar oleh IETF (RFC 4960)
Ini memiliki kemampuan chunking yang dapat membantu kecepatan.
Pembaruan: perbandingan antara TCP dan SCTP menunjukkan bahwa kinerja dapat dibandingkan kecuali dua antarmuka dapat digunakan.
Pembaruan: artikel pengantar yang bagus .
sumber
ENET - http://enet.bespin.org/
Saya telah bekerja dengan ENET sebagai protokol UDP yang andal dan menulis versi ramah soket asinkron untuk klien saya yang menggunakannya di server mereka. Ini bekerja dengan cukup baik tetapi saya tidak suka overhead yang ditambahkan oleh ping peer to peer ke koneksi yang tidak aktif; ketika Anda memiliki banyak koneksi, melakukan ping ke semuanya secara teratur adalah pekerjaan yang sangat sibuk.
ENET memberi Anda opsi untuk mengirim beberapa 'saluran' data dan agar data yang dikirim tidak dapat diandalkan, dapat diandalkan, atau diurutkan. Ini juga termasuk ping peer to peer tersebut yang bertindak sebagai tetap hidup.
sumber
Kami memiliki beberapa pelanggan industri pertahanan yang menggunakan UDT (Transfer Data berbasis UDP) (lihat http://udt.sourceforge.net/ ) dan sangat menyukainya. Saya melihat itu memiliki lisensi BSD yang ramah juga.
sumber
RUDP - Protokol Datagram Pengguna yang Andal
Ini memberikan:
Tampaknya sedikit lebih dapat dikonfigurasi sehubungan dengan tetap hidup daripada ENet tetapi tidak memberi Anda banyak opsi (yaitu semua data dapat diandalkan dan diurutkan bukan hanya bit yang Anda putuskan seharusnya). Ini terlihat cukup mudah untuk diterapkan.
sumber
Seperti yang ditunjukkan orang lain, pertanyaan Anda sangat umum, dan apakah ada sesuatu yang 'lebih cepat' dari TCP atau tidak sangat bergantung pada jenis aplikasinya.
TCP umumnya secepat yang didapat untuk streaming data yang andal dari satu host ke host lainnya. Namun, jika aplikasi Anda melakukan banyak semburan kecil lalu lintas dan menunggu respons, UDP mungkin lebih tepat untuk meminimalkan latensi.
Ada jalan tengah yang mudah. Algoritme Nagle adalah bagian dari TCP yang membantu memastikan bahwa pengirim tidak membebani penerima aliran data yang besar, yang mengakibatkan kemacetan dan kehilangan paket.
Jika Anda memerlukan pengiriman TCP yang andal dan teratur, serta respons UDP yang cepat, dan tidak perlu khawatir tentang kemacetan pengiriman aliran data yang besar, Anda dapat menonaktifkan algoritme Nagle:
sumber
Siapa pun yang memutuskan bahwa daftar di atas tidak cukup dan bahwa mereka ingin mengembangkan UDP yang andal SENDIRI harus melihat spesifikasi Google QUIC karena ini mencakup banyak kasus sudut yang rumit dan potensi serangan penolakan layanan. Saya belum bermain-main dengan implementasi ini, dan Anda mungkin tidak menginginkan atau membutuhkan semua yang disediakannya, tetapi dokumen ini sangat berharga untuk dibaca sebelum memulai desain UDP baru yang "dapat diandalkan".
Titik awal yang bagus untuk QUIC ada di sini , di Blog Chromium.
Dokumen desain QUIC saat ini dapat ditemukan di sini .
sumber
Kata kunci dalam kalimat Anda adalah 'berpotensi'. Saya pikir Anda benar-benar perlu membuktikan kepada diri sendiri bahwa TCP, pada kenyataannya, terlalu lambat untuk kebutuhan Anda jika Anda membutuhkan keandalan dalam protokol Anda.
Jika Anda ingin mendapatkan keandalan dari UDP maka pada dasarnya Anda akan mengimplementasikan ulang beberapa fitur TCP di atas UDP yang mungkin akan membuat segalanya lebih lambat daripada hanya menggunakan TCP di tempat pertama.
sumber
Protocol DCCP, terstandarisasi dalam RFC 4340 , "Datagram Congestion Control Protocol" mungkin adalah yang Anda cari.
Sepertinya diterapkan di Linux .
sumber
Semoga RFC 5405 , "Pedoman Penggunaan UDP Unicast untuk Desainer Aplikasi" akan berguna untuk Anda.
sumber
Apakah Anda mempertimbangkan untuk mengompresi data Anda?
Seperti yang dinyatakan di atas, kami kekurangan informasi tentang sifat sebenarnya dari masalah Anda, tetapi mengompresi data untuk memindahkannya dapat membantu.
sumber
RUDP . Banyak server soket untuk game menerapkan hal serupa.
sumber
Cara terbaik untuk mencapai keandalan menggunakan UDP adalah dengan membangun keandalan dalam program aplikasi itu sendiri (misalnya, dengan menambahkan mekanisme pengakuan dan transmisi ulang)
sumber