Peringatan
RNL termasuk kode kriptografinya sejauh ini tidak diaudit, sehingga RNL hanya ditujukan untuk game real-time dan aplikasi multimedia tanpa memproses data penting apa pun, tetapi tidak untuk aplikasi serius dengan data penting!
Keterangan
RNL adalah singkatan dari "Perpustakaan Jaringan Realtime"
RNL adalah perpustakaan jaringan berbasis UDP untuk aplikasi dan permainan waktu nyata, terinspirasi oleh ENet, yojimbo, libgren, dan sebagainya.
RNL dirancang berdasarkan pola umum yang digunakan dalam game real-time, yang terikat pada simulasi, bukan terikat pada I/O, dan sepenuhnya stateful, sehingga IO asinkron tidak terlalu masuk akal. Jadi desain inti RNL adalah single-threaded, bukan multi-threaded. Namun Anda dapat menggunakan beberapa instance TRNLHost di dalam beberapa thread yang berbeda (satu hingga sangat sedikit instance per satu thread), sehingga Anda dapat menghosting beberapa pertandingan game jaringan di mesin yang sama, selama mesin yang satu ini kuat dan cukup cepat untuk menghosting beberapa game. permainan jaringan cocok pada saat yang sama.
Dan di sisi klien game, seluruh jaringan harus berjalan, jika memungkinkan, di threadnya sendiri (juga jika mungkin, disematkan inti CPU), untuk kemungkinan beberapa gangguan dan masalah serupa lainnya. (offtopic: hal yang sama juga berlaku untuk thread audio, kecuali ada yang menyukai kemungkinan masalah underrun buffer audio dan sebagainya, ketika tidak mendapatkan cukup waktu CPU pada titik waktu yang tepat. :-))
Dan untuk game yang lebih besar dengan banyak klien dalam satu dunia game, Anda harus menggunakan beberapa instance TRNLHost yang terbagi lagi, sehingga setiap TRNLHost harus menangani hanya beberapa klien yang terhubung, di banyak thread dan pada gilirannya di beberapa server khusus fisik, yang juga pada gilirannya dapat berkomunikasi satu sama lain untuk meniru kesan dari satu dunia game yang sangat besar. Setidaknya satu instance TRNLHost dirancang untuk jumlah klien rendah, karena ini adalah kasus umum untuk penembak ego, game balap, dan sebagainya. Atau dengan kata lain untuk dunia game besar dengan banyak klien: Divide and Conquer (misalnya dengan sebagian sektor dunia game yang tumpang tindih dengan batas-batas wilayah hanya sebagai contoh ide konsep Divide-and-Conquer)
Dukung saya
Dukung saya di Patreon
Fitur
- Sebagian besar desain kode berorientasi objek sepenuhnya
- dukungan IPv6
- Lintas platform
- Windows (dengan FreePascal dan Delphi)
- Linux (dengan FreePascal)
- *BSD (dengan FreePascal)
- Android (dengan FreePascal dan Delphi)
- Darwin (MacOS(X) dan iOS) (dengan FreePascal dan Delphi)
- Protokol berbasis UDP
- Urutan
- Saluran
- Dengan kemungkinan jenis saluran gratis berikut yang dapat dikonfigurasi:
- Pesanan dapat diandalkan
- Dapat diandalkan tanpa pesanan
- Pesanan tidak dapat diandalkan
- Tidak dapat diandalkan tanpa urutan
- Keandalan
- Fragmentasi dan perakitan kembali
- Pengumpulan
- Kemampuan beradaptasi
- Portabilitas
- Kemungkinan menggunakan model peer-to-peer atau bahkan model hybrid peer-to-peer dan klien/server campuran, bukan hanya model klien/server murni, dan tentu saja juga model klien/server klasik
- Generator nomor pseudo-acak (CSPRNG) yang aman secara kriptografis
- Berdasarkan arc4random tetapi dengan ChaCha20 sebagai pengganti RC4 sebagai blok bangunan dasar
- Berbagai sumber entropi (karena Anda tidak boleh mempercayai satu sumber entropi saja, karena sumber tersebut mungkin memiliki pintu belakang)
- Termasuk penggunaan instruksi rdseed/rdrand pada prosesor x86 yang lebih baru sebagai sumber entropi berbasis perangkat keras kuasi tambahan opsional, jika instruksi ini didukung oleh prosesor yang berjalan saat ini
- Otentikasi bersama
- Berdasarkan protokol seperti Station-to-Station (STS), yang mengasumsikan bahwa para pihak memiliki kunci tanda tangan, yang digunakan untuk menandatangani pesan, sehingga memberikan keamanan minifikasi terhadap serangan man-in-the-middle, tidak seperti Diffie- Metode Hellman tanpa ekstensi seperti itu.
- Kunci privat/publik jangka panjang adalah kunci ED25519 dan hanya digunakan untuk tujuan penandatanganan
- Kerahasiaan maju menggunakan kurva elips ephemeral Diffie-Hellman (kurva 25519)
- Konsekuensi dari hal ini dan fakta lainnya adalah bahwa setiap koneksi selalu memiliki kunci jangka pendek privat dan publik baru yang berbeda di kedua sisi dan oleh karena itu juga kunci rahasia jangka pendek bersama yang baru.
- Kunci pribadi/publik jangka pendek adalah kunci X25519 dan kunci rahasia bersama jangka pendek hanya digunakan untuk tujuan penyandian berbasis AEAD
- Enkripsi Otentikasi dengan enkripsi paket Associated Data (AEAD).
- Berdasarkan ChaCha20 sebagai cipher dan Poly1305 sebagai kode otentikasi pesan kriptografi
- Putar ulang perlindungan data paket aplikasi
- Berdasarkan berbagai mekanisme perlindungan pada tahap pembuatan koneksi dan nomor urut paket terenkripsi
- Mekanisme pembentukan koneksi yang tertunda sebagai mekanisme minifikasi permukaan serangan tambahan
- Token koneksi dan autentikasi (sebagai opsi opsional, di mana Anda harus memiliki saluran komunikasi out-of-band yang terpisah, misalnya backend master berbasis HTTPS untuk menghasilkan dan menangani hal ini) sebagai mekanisme minifikasi permukaan serangan tambahan terhadap amplifikasi DDoS serangan
- Token koneksi ditransfer dalam bentuk teks yang jelas, sehingga diperiksa dengan cepat pada paket data pertama dari upaya koneksi, tanpa perlu mendekripsi token koneksi terlebih dahulu sebelum memungkinkan untuk memeriksa token, jadi untuk menghemat waktu CPU pada saat ini. Opsi ini terutama digunakan untuk melawan serangan amplifikasi DDoS, yang berarti bahwa server tidak akan langsung merespons jika token koneksi tidak cocok pada paket data pertama dari upaya koneksi, sehingga serangan amplifikasi DDoS hanya akan masuk ke dalam serangan tersebut. Tidak ada apa-apa. Akibatnya, token ini hanya berlaku untuk jangka waktu singkat, yang juga berlaku untuk sisi backend utama infrastruktur Anda.
- Token autentikasi ditransfer terenkripsi, setelah pertukaran kunci pribadi/publik, pembuatan kunci rahasia bersama, dll. berhasil diproses. Token autentikasi, berbeda dengan token koneksi, BUKAN merupakan tindakan balasan terhadap serangan kategori DDoS, melainkan token autentikasi, seperti namanya, hanya untuk tujuan autentikasi saluran komunikasi out-of-band yang terpisah, dengan kata lain, sebagai tambahan perlindungan terhadap koneksi yang tidak sah, di mana Anda dapat memeriksanya lebih detail di sisi backend utama infrastruktur Anda, sebelum "klien" dapat terhubung ke server sebenarnya, tempat semua tindakan nyata terjadi.
- Pembatas kecepatan upaya koneksi
- Dapat dikonfigurasi dengan dua konstanta, burst dan periode
- Pembatas kecepatan bandwidth yang dapat dikonfigurasi
- Fitur jaringan virtual opsional (misalnya untuk solusi loopback lokal tanpa API jaringan cepat untuk pertandingan game pemain tunggal, yang harus tetap berbasis konsep server/klien)
- Simulator interferensi jaringan (misalnya untuk testcase dan sebagainya)
- Kemungkinan kehilangan paket simulasi yang dapat dikonfigurasi (masing-masing untuk paket masuk dan keluar)
- Latensi simulasi yang dapat dikonfigurasi (masing-masing untuk paket masuk dan keluar)
- Jitter simulasi yang dapat dikonfigurasi (masing-masing untuk paket masuk dan keluar)
- Kemungkinan paket duplikat simulasi yang dapat dikonfigurasi (masing-masing untuk paket masuk dan keluar)
- Mekanisme penyesuaian kesulitan respons permintaan tantangan koneksi dinamis
- Dapat dikonfigurasi dengan nilai faktor
- Berdasarkan mekanisme penentuan gaya penghalusan riwayat frame per detik, namun hanya frame per detik, upaya koneksi per detik
- Lebih banyak algoritma kompresi sebagai pilihan
- Deflate (LZ77 yang kompatibel dengan bit-stream zlib dan hybrid Huffman kanonik, hanya fixed-static-canonical-huffman dalam implementasi ini di sisi kompresor, tetapi sisi dekompresor berfitur lengkap)
- LZBRRC (kompresor gaya LZ77 bersama dengan backend pembuat kode rentang entropi)
- BRRC (pembuat kode rentang entropi orde 0 murni)
- CRC32C bukan CRC32 (tanpa C di akhir)
- Dan masih banyak lagi hal lainnya. . .
Fitur yang direncanakan (alias Todo) dalam urutan prioritas acak
Pedoman umum untuk kontributor kode
Pedoman umum untuk kontributor kode
Lisensi
Lisensi zlib
saluran IRC
Saluran IRC #rnl di Freenode
Terima kasih
- Terima kasih kepada Lee Salzman untuk ENet sebagai inspirasi ide implementasi desain API dasar
- Terima kasih kepada Glenn Fiedler atas inspirasi ide implementasi yang berorientasi pada keamanan
- Terima kasih kepada Sergey Ignatchenko ("No Bugs" Hare) atas inspirasinya juga atas ide implementasi yang berorientasi pada keamanan