Ruffles adalah perpustakaan UDP yang dikelola sepenuhnya yang dirancang untuk kinerja tinggi dan latensi rendah.
Ada banyak perpustakaan RUDP seperti enet, lidgren, litenetlib. Sementara banyak dari mereka hebat, Ruffles bertujuan untuk mengisi satu ceruk yang sebagian besar tidak diisi, bahwa menjadi perpustakaan yang sepenuhnya dikelola sepenuhnya.
Untuk membandingkan dengan contoh -contoh di atas, enet luar biasa dan cukup banyak apa yang diinginkan Ruffles, tetapi tidak dikelola. Lidgren, Litenetlib dan banyak perpustakaan yang dikelola lainnya dapat terasa terlalu kembung dan mengandung banyak fitur yang tidak perlu dan seringkali jauh lebih lambat.
Ruffles memiliki banyak fitur yang tidak dimiliki LIB lainnya. Lihat di bawah untuk ringkasan dan penjelasan rinci masing -masing.
Protokol Ruffles membutuhkan tantangan yang harus diselesaikan sebelum koneksi dapat dibuat. Saat ini, tantangannya adalah tantangan hashcash seperti yang disediakan oleh server, brute force diselesaikan oleh klien dan dikirimkan. (Menggunakan fungsi hash Fowler-noll-vo bukan SHA1 saat ini).
Amplifikasi DOS dicegah dengan membutuhkan ukuran pesan koneksi yang tidak proporsional. Selain itu, karena tantangan koneksi tidak layak secara komputasi untuk menyerang pada lapisan 4.
Ruffles memiliki jumlah slot koneksi yang tetap yang dapat digunakan untuk koneksi yang tertunda, ini membatasi kegunaan serangan pengisian slot pada lapisan 4. Koneksi yang tertunda memiliki batas waktu yang tetap untuk menyelesaikan tantangan hashcash mahal secara komputasi sebelum tersingkir, slot akan tersedia sekali lagi setelah itu. Karena ini hanya membatasi serangan pengisian slot, Ruffles juga memiliki mekanisme keamanan di mana hash cash harus diselesaikan dalam pesan pertama. Tantangan ini dihasilkan oleh klien dan server akan memverifikasi bahwa tanggal yang digunakan baru -baru ini dan bahwa IV belum digunakan, memaksa klien untuk mengkomputasi kembali tantangan hashcash setiap kali mereka ingin menginisialisasi jabat tangan.
Dengan mitigasi keamanan ini, satu -satunya cara untuk menurunkan server adalah dengan menghabiskan semua sumber daya CPU.
Ruffles menangani semua manajemen koneksi untuk Anda. Ini adalah protokol yang berorientasi pada koneksi sepenuhnya dengan paket kiper heartbeat yang dikirim untuk memastikan koneksi masih hidup.
Ruffles sepenuhnya bebas sampah, ini dilakukan dengan pengalokasi memori khusus di ruang GC. Ini memastikan tidak ada memori yang bocor ke pengumpul sampah kecuali untuk tujuan mengubah ukuran. Ini membuat ruffles berkobar dengan cepat. Ini juga menghindari salinan memori sebanyak mungkin. Karena ruffles masih berjalan di ruang GC, setiap bocor memori dalam ruffles akan ditangani oleh pengumpul sampah dan pengguna akan diberitahu karena destruktor memori dipanggil bersama dengan stacktrace di mana memori yang bocor pada awalnya dialokasikan. Lihat Implementasi.
Saat ini ada beberapa cara mengirim pesan dalam ruffles. Jenisnya adalah:
Semua pesan dijamin akan dikirimkan, pesanan tidak dijamin, duplikat dijatuhkan. Menggunakan jendela geser tetap.
Semua pesan dijamin akan dikirimkan dengan pesanan juga dijamin, duplikat dijatuhkan. Menggunakan jendela geser tetap.
Semua pesan dijamin akan dikirimkan dengan pesanan juga dijamin, duplikat dijatuhkan. Menggunakan jendela geser tetap. Memungkinkan pesan besar terfragmentasi.
Pengiriman tidak dijamin juga tidak pesanan. Duplikat dijatuhkan.
Pengiriman tidak dijamin tetapi pesanannya. Paket dan duplikat yang lebih tua dijatuhkan.
Pengiriman tidak dijamin juga tidak pesanan. Duplikat tidak dijatuhkan.
Paket UDP mentah yang tidak memerlukan koneksi.
Semua pesan tidak dijamin akan dikirimkan. Jika Anda mengirim beberapa pesan, setidaknya satu adalah Guranteed untuk tiba. Jika Anda mengirim satu pesan, dijamin akan tiba. Pesan akan selalu beres. Duplikat dijatuhkan.
Semua pesan dijamin akan dikirimkan, pesanan tidak dijamin, duplikat dijatuhkan. Menggunakan jendela geser tetap. Memungkinkan pesan besar terfragmentasi.
Ruffles secara asli multi -berulir dan menggunakan utas pekerja latar belakang secara default untuk menangani jaringan I/O.
Semua API publik dalam ruffles dirancang agar utas aman dan dapat diakses dari utas apa pun.
Ruffles bebas ketergantungan 100%, dengan demikian sangat portabel dan harus berjalan pada sebagian besar platform.
Ruffles mendukung mode soket ganda IPv6. Ini melakukan ini dengan menggunakan dua soket yang terikat ke port yang sama, sehingga mencapai fungsionalitas tumpukan ganda penuh yang tidak terlihat oleh pengguna.
Paket kecil akan ditunda untuk dikirim, ini memungkinkan mereka untuk digabungkan menjadi satu paket yang lebih besar. Ini dapat dinonaktifkan dan diaktifkan berdasarkan per paket. Ukuran penundaan dan gabungan maks juga dapat dikonfigurasi.
Paket dapat dikirim sebagai rianlesequencedFragmented atau reliableFragmented yang memungkinkan satu paket berukuran hingga 2^15*1450 byte = 47513600 byte = 47,5 megabyte.
Paket ACK digabung menjadi bitfields untuk membuatnya jauh lebih kompak.
Statistik terperinci dapat diambil dari koneksi, termasuk byte yang dikirim, paket yang dikirim, waktu perjalanan pulang pergi dan banyak lagi.
Secara otomatis menemukan MTU terbesar yang mungkin untuk setiap koneksi.
Batasi jumlah lalu lintas yang diizinkan untuk dikirim ke koneksi. Algoritma khusus dapat disesuaikan dengan antarmuka IbandwidthTracker.
Ini adalah hal yang ingin saya dan rencanakan untuk ditambahkan
Berikut adalah fitur yang dipertimbangkan tetapi tidak diputuskan. Ini untuk mencegah kembung.
Saluran yang terfragmentasi saat ini tidak memiliki laju aliran untuk ACK yang diturunkan kembali.
Karena bug Unity, ruffles tidak berfungsi dengan baik di IL2CPP secara default. Bug telah dilaporkan ke Unity. Jika Anda perlu menjalankan ruffles dengan IL2CPP, kompilasi dengan Ini telah ditambal. Jangan ragu untuk menggunakan IL2CPP di proyek Anda.MILLISECONDS_SELECT Define. Ini akan membuat metode soket. Pilih menggunakan batas waktu berbasis milidetik alih -alih mikrodetik.