Carambolas adalah perpustakaan dukungan tujuan umum yang terus berkembang yang terdiri dari beberapa rakitan .NET Standard 2.0 . Secara khusus, Ini fitur implementasi protokol UDP multi-channel khusus yang dimaksudkan untuk aplikasi jaringan produk latensi rendah/bandwidth rendah dengan batasan waktu real-time yang lembut .
Rilis pertama adalah inti minimal dengan modul jaringan yang berfungsi penuh. Repositori ini disusun di sekitar satu solusi karena saya berencana untuk memperluas dengan menambahkan modul baru di masa depan.
Cakupan uji masih minimal sehingga tidak ada tingkat kebenaran yang harus disiratkan tanpa pemeriksaan ketat dari kode sumber. Ini adalah proyek yang sedang berlangsung di tahap paling awal.
Binari akan segera tersedia di bagian arsip atau dalam bentuk paket nuget.
Tuan rumah lokal diwakili oleh contoh carambolas.net.host . Itu harus digunakan untuk terhubung ke host jarak jauh atau menerima koneksi yang masuk.
Setiap host jarak jauh diwakili oleh contoh carambolas.net.peer .
Peristiwa seperti koneksi, pemutusan dan data diterima melalui objek host sementara objek rekan dapat digunakan untuk mengirim data atau secara aktif memutuskan sambungan.
Pada titik ini, hubungkan, putuskan sambungan, kirim dan terima operasi tidak memblokir; Buka dan tutup memblokir (untuk alasan yang jelas).
Perhatikan bahwa objek host yang sama dapat digunakan untuk secara aktif meminta koneksi dan menerima koneksi yang masuk semua yang membuatnya dapat digunakan dalam topologi P2P. Peran klien/server tidak ditegakkan dan muncul hanya dengan bagaimana host dikonfigurasi. Host bahkan dapat mengirim permintaan koneksi ke beberapa host jarak jauh secara bersamaan.
Contoh :
Objek host instantiated untuk terhubung ke rekan jarak jauh. Loop batin bertanggung jawab untuk memastikan peristiwa tidak terakumulasi ke iterasi berikutnya.
using ( var host = new Host ( "MyHost" )
{
host . Open ( IPEndPoint . Any , new Host . Settings ( 0 ) ) ;
host . Connect ( new IPEndPoint ( IPAddress . Loopback , 1313 ) , out Peer peer ) ;
.. .
while ( true )
{
while ( host . TryGetEvent ( out Event e ) )
{
if ( e . EventType == EventType . Data )
Console . WriteLine ( $ "DATA: { e . Peer } { e . Data } " ) ;
else if ( e . EventType == EventType . Connection )
Console . WriteLine ( $ "CONNECTED: { e . Peer } " ) ;
else if ( e . EventType == EventType . Disconnection )
{
Console . WriteLine ( $ "DISCONNECTED: { e . Peer } { e . Reason } " ) ;
return ;
}
}
Thread . Sleep ( 33 ) ;
}
}Objek host instantiated untuk menunggu hingga 10 koneksi yang masuk. Loop batin bertanggung jawab untuk memastikan peristiwa tidak terakumulasi ke iterasi berikutnya.
using ( var host = new Host ( "MyHost" )
{
host . Open ( new IPEndPoint ( IPAddress . Loopback , 1313 ) , new Host . Settings ( 10 ) ) ;
.. .
while ( true )
{
while ( host . TryGetEvent ( out Event e ) )
{
if ( e . EventType == EventType . Data )
Console . WriteLine ( $ "DATA: { e . Peer } { e . Data } " ) ;
else if ( e . EventType == EventType . Connection )
Console . WriteLine ( $ "CONNECTED: { e . Peer } " ) ;
else if ( e . EventType == EventType . Disconnection )
{
Console . WriteLine ( $ "DISCONNECTED: { e . Peer } { e . Reason } " ) ;
return ;
}
}
Thread . Sleep ( 33 ) ;
}
} Proyek ini berasal dari tahun 2015 ketika saya datang ke Kanada untuk mempelajari desain dan pengembangan video game di Toronto Film School. Motivasi asli adalah membuat kompilasi kelas aksesori yang dapat digunakan kembali dalam berbagai proyek Unity3D. Setelah beberapa saat, saya mulai meneliti solusi jaringan untuk permainan multipemain prospek dan fokus bergeser ke arah merancang modul jaringan yang dapat digunakan kembali. Awalnya, saya mendekati masalah sebagai masalah sederhana mengintegrasikan UNET atau perpustakaan pihak ke -3 lainnya yang dapat saya temukan saat itu. Segera setelah itu, saya mulai menabrak segala macam masalah dari asumsi yang rusak hingga pertukaran implementasi tersembunyi. Tidak jarang menemukan daftar fitur yang meningkat (hampir menyesatkan), merancang ketidakcocokan atau implementasi yang rusak. Secara khusus, yang paling mengganggu saya adalah bahwa banyak aspek dari solusi tampaknya secara acak sewenang -wenang dengan sedikit atau tanpa penjelasan mengapa pendekatan itu lebih disukai atau batas tertentu yang dikenakan. Saya akan menghabiskan berjam -jam menginspeksi sumber proyek untuk mencatat untuk mencari tahu mengapa sesuatu seperti itu hanya untuk menyadari bahwa bagian lain dari kode bertentangan langsung.
Semua ini membuat saya lebih banyak bekerja dan akhirnya saya memutuskan untuk membangun perpustakaan jaringan yang ringan sendiri dengan daftar fitur yang masuk akal yang dapat saya terapkan dan verifikasi. Tidak terburu -buru, tidak ada tenggat waktu. Hanya upaya asli untuk mengimplementasikan solusi teknis terbaik yang bisa saya rancang.
Sementara itu, saya lulus, kembali ke pekerjaan penuh waktu dan harus mengesampingkan proyek ini. Setahun yang lalu, setelah menemukan beberapa catatan lama, saya memulihkan arsip prototipe saya dan memutuskan untuk mengumpulkan bangunan komprehensif dengan semua informasi yang saya kumpulkan sehingga tidak hanya orang lain yang bisa bereksperimen dengannya tetapi juga memahami cara kerjanya dan mengapa.
Rakitan yang dikelola dapat dibangun di platform apa pun dengan kompiler yang mendukung C# 7.3 atau lebih tinggi. Tes dan aplikasi aksesori memerlukan Netcore 2.2.
Perpustakaan asli dapat dibangun menggunakan CMake dengan GCC atau Visual Studio.
Versi OS yang didukung:
Untuk platform lain, atau dengan tidak adanya perpustakaan asli yang diperlukan, kode fallback ada bahwa meskipun secara umum mungkin kurang efisien harus berfungsi penuh dan transparan.
Semua proyek C# dan skrip build dikonfigurasi untuk menyimpan file dan biner perantara di bawah folder build yang terletak di root proyek sehingga build dapat dengan mudah diperiksa, diverifikasi, dan dibersihkan.
Kode ini menggunakan Dllimport untuk mengikat perpustakaan asli. Dllimport dapat selalu menggunakan nama perpustakaan Windows dan secara otomatis akan menambahkan awalan/sufiks platform lain sesuai kebutuhan. Misalnya, carambolas.net.native.dll, nama perpustakaan asli net di windows, menjadi libcarambolas.net.native.dll.so di linux dan libcarambolas.net.native.dll.dynlib pada macOS. Bangun skrip yang sudah membuat perpustakaan dengan nama yang tepat.
Solusi Visual Studio disertakan untuk kenyamanan, jadi tidak ada langkah build tambahan yang diperlukan untuk windows. Pastikan saja untuk memilih platform yang sesuai dengan sistem operasi host Anda (baik x86 atau x64). Ini diperlukan untuk membangun aplikasi pengujian dan untuk tes unit. Semua rakitan .NET dibangun untuk AnyCPU terlepas dari platform solusi yang dipilih, tetapi Visual Studio harus tahu perpustakaan asli apa yang akan dibangun untuk pengujian karena mereka diharapkan akan digunakan berdampingan dengan rakitan terkait mereka.
Gunakan nugetpack.bat untuk mengkompilasi perpustakaan asli dan rakitan portabel dan membuat paket nuget semuanya dalam satu tindakan.
Gunakan build.bat untuk membangun semua proyek untuk rilis tanpa menggunakan Visual Studio.
Visual Studio untuk Mac belum diuji dan tidak didukung, jadi jangan berharap itu berhasil.
Pastikan untuk memiliki CMake (> = 2.8) dan GCC untuk dapat mengkompilasi perpustakaan asli. Dotnet Core SDK 2.1 diperlukan untuk mengkompilasi rakitan dan menghasilkan paket nuget.
Gunakan nugetpack.sh untuk mengkompilasi perpustakaan asli dan rakitan portabel dan membuat paket nuget semuanya dalam satu tindakan.
Gunakan build.sh untuk membangun semua proyek untuk rilis tanpa menggunakan Visual Studio.
Pastikan untuk memiliki cmake (> = 2.8), build-esensial dan GCC-multilib diinstal untuk dapat mengkompilasi perpustakaan asli untuk x86 dan x64.
Di Ubuntu Run: $ sudo apt-get install GCC-esensial GCC-MULTILIB G ++-Multilib Cmake
Dotnet Core SDK 2.1 diperlukan untuk menyusun rakitan dan menghasilkan paket nuget.
Di Ubuntu Run:
$ wget https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
$ sudo dpkg -i packages-microsoft-prod.deb
$ sudo apt-get update;
sudo apt-get install -y apt-transport-https &&
sudo apt-get update &&
sudo apt-get install -y dotnet-sdk-2.1
Gunakan nugetpack.sh untuk mengkompilasi perpustakaan asli dan rakitan portabel dan membuat paket nuget semuanya dalam satu tindakan.
Gunakan build.sh untuk membangun semua proyek untuk rilis tanpa menggunakan Visual Studio.
Satu set minimum tes unit diimplementasikan di sekitar fitur utama menggunakan proyek Xunit.
Carambolas.net.tests.host adalah aplikasi konsol sederhana yang digunakan untuk memverifikasi fungsionalitas jaringan dasar secara manual. Ini sangat berguna saat berpihak pada wireshark dan canggung
Carambolas.net.tests.integration adalah seperangkat tes integrasi untuk carambolas.net juga diimplementasikan dengan Xunit. Tes berjalan secara berurutan, masing -masing memulai dua utas terpisah (server dan klien), yang berkomunikasi melalui antarmuka loopback untuk jumlah waktu tertentu. Loopback mewakili jaringan yang ideal di mana waktu pulang-pergi minimum, paket tidak pernah tiba dari urutan dan tidak pernah hilang kecuali ada luapan bufffer. Karakteristik ini berguna untuk memvalidasi jalur eksekusi normal.
Wireshark adalah alat debugging yang tak ternilai yang dapat digunakan untuk memantau aktivitas jaringan dan memeriksa paket. Selain itu, Wireshark mendukung kelas khusus plugin yang disebut Disektor yang dapat digunakan untuk menganalisis protokol khusus.
Proyek ini mencakup distor dasar Wireshark untuk Carambolas. Untuk menggunakannya, pastikan Wireshark sudah terpasang.
Clumsy adalah program penangkapan paket jaringan yang berjalan dalam mode pengguna dan mampu mencegat paket untuk mensimulasikan kondisi jaringan yang terdegradasi secara real-time.
Tambahkan baris filter pra-set seperti yang berikut ini di file config.txt untuk mempengaruhi host yang dihubungkan oleh antarmuka loopback pada port yang sama yang digunakan dalam tes integrasi (1313):
carambolas: udp and outbound and loopback and (udp.DstPort == 1313 or udp.SrcPort == 1313)
Perhatikan bahwa ada beberapa peringatan saat menggunakan canggung dengan antarmuka loopback. Dari manual pengguna yang canggung:
- Paket inbound loopback tidak dapat ditangkap atau dipasang kembali. Ketika Anda memikirkannya, sangat sulit untuk mengatakan itu adalah paket masuk atau keluar saat Anda mengirim paket dari komputer ke dirinya sendiri. Faktanya, platform penyaringan Windows yang mendasarinya tampaknya mengklasifikasikan semua paket loopback sebagai keluar. Hal yang perlu diingat adalah bahwa ketika Anda memproses pada paket loopback, Anda tidak dapat memiliki "masuk" di filter Anda. Penting untuk mengetahui bahwa komputer Anda mungkin memiliki IP selain 127.0.0.1, seperti IP intranet yang dialokasikan oleh router Anda. Ini juga dianggap sebagai paket loopback.
- Paket loopback ditangkap dua kali. Karena kami tidak memiliki paket loopback masuk, semua paket loopback dianggap keluar. Jadi canggung akan memprosesnya dua kali: pertama kali adalah saat mengirim, dan kedua kalinya saat menerima. Contoh sederhana adalah bahwa ketika filter hanya "keluar", dan menerapkan lag 500ms. Saat Anda melakukan ping localhost, itu akan menjadi lag 1000ms. Anda dapat mengatasinya dengan menentukan port tujuan dan hal -hal seperti ini. Tetapi akan lebih mudah untuk mengingat hal ini dan berhati -hatilah saat mengatur parameter.
- Penangkapan Paket Inbound tidak berfungsi sepanjang waktu. Seperti yang disebutkan sebelumnya, paket loopback inbound tidak dapat dipasang kembali. Masalahnya adalah bahwa pada kesempatan beberapa paket dapat diklasifikasikan sebagai paket masuk, bahkan jika IP tujuan bukan dari komputer Anda. Ini hanya mempengaruhi paket non-loopback. Jika Anda hanya mengerjakan localhost itu akan baik -baik saja. Tujuan dari rilis di masa depan adalah untuk mendiagnosis apa yang menyebabkan ini dan memberikan solusi.
- Tidak dapat memfilter berdasarkan sistem proses penangkapan jaringan yang luas terdaftar sebagai fitur. Tapi sebenarnya ini karena tidak ada cara mudah untuk memberikan solusi yang kuat.
Saya selalu terbuka untuk kontribusi, baik dalam bentuk laporan bug, perbaikan bug (bahkan lebih baik!) Atau peningkatan cakupan tes.
Permintaan fitur dipersilakan tetapi dapat disimpan dalam simpanan tergantung pada seberapa luas, layak, atau diinginkannya. Jika permintaan fitur terlalu kompleks, mungkin tergantung pada sponsor karena saya memiliki sumber daya terbatas (waktu dan uang) untuk didedikasikan.
Jika Anda ingin mendukung proyek ini, saya mungkin tertarik mendengar dari Anda, jadi hubungi!
Dalam bahasa Portugis, carambolas adalah bentuk jamak dari carambola (= starfruit). Istilah ini juga digunakan secara bahasa sehari -hari di daerah tertentu di Brasil untuk mengungkapkan keheranan atau ketidaksabaran.
Sebelum Carambolas, saya melakukan setidaknya setengah lusin upaya untuk mengatur ide-ide saya dalam proyek yang dapat digunakan. Dengan Carambolas saya memutuskan untuk membangun serangkaian prototipe untuk belajar tentang masalah desain dan menguji pendekatan yang berbeda. Setiap prototipe memiliki nama kode yang dibentuk oleh surat dan nomor mulai dari A1. Kode sumber yang awalnya diimpor dalam repositori ini adalah iterasi ke -75 dari prototipe ke -9, oleh karena itu A9.
Perpustakaan asli sebagian besar disediakan untuk alasan kinerja, oleh karena itu mereka benar -benar opsional. Adalah tidak masuk akal untuk mencoba memberikan implementasi asli untuk setiap platform yang mungkin (pikirkan semua desktop, seluler, konsol, tertanam ...) dan mengandalkan secara eksklusif pada perpustakaan asli akan mengurangi platform target menjadi hanya segelintir, mungkin hanya desktop (Windows, Linux dan MacOS). Jadi sebagai aturan praktis, harus selalu ada implementasi fallback dalam kode yang dikelola untuk setiap fungsi yang diimplementasikan oleh perpustakaan asli.
Karena perpustakaan asli opsional, program tidak dapat mengetahui apakah file yang hilang seharusnya ada atau tidak, maka mengapa tidak ada kesalahan yang dilemparkan atau dicatat untuk perpustakaan asli yang hilang. Menurut definisi, perpustakaan asli yang hilang tidak pernah menjadi kesalahan.
Secara umum, Anda tidak bisa. Dan Anda seharusnya tidak, setidaknya tidak dari perspektif API. Seharusnya tidak masalah bagi pengguna (atau programmer aplikasi) apa strategi implementasi yang mendasari digunakan oleh ketergantungan, dalam hal ini Carambolas. Namun informasi ini mungkin relevan untuk penyebaran sehingga, setiap kali objek Interop dibuat yang juga memiliki fallback otomatis, kode tersebut menghasilkan info log indikatif. Misalnya, carambolas.net.socket akan menghasilkan info log yang mirip dengan "menggunakan carambolas.net.sockets.native.socket" ketika perpustakaan asli ditemukan untuk implementasi soket yang mendasarinya. Dengan cara ini jika Anda menggunakan perpustakaan asli dalam pikiran Anda dapat menentukan apakah mereka benar -benar digunakan.
Ini berarti Anda menggunakan perpustakaan asli yang rusak atau disusun untuk arsitektur CPU yang salah.
Perpustakaan asli harus pergi berdampingan dengan rakitan interop yang sesuai dan meskipun rakitan dapat dikompilasi sekali untuk arsitektur CPU, perpustakaan asli tidak bisa. Mereka harus mencocokkan arsitektur CPU dari sistem operasi yang berjalan, jika tidak mereka diperlakukan sebagai file yang korup dan .NET melempar sistem. Perhatikan bahwa ini tidak sama dengan mencoba memuat perpustakaan yang tidak ditemukan yang menurut definisi bukan kesalahan.
Produk Bandwidth-Delay (BDP) adalah produk dari kapasitas transmisi jaringan tautan (dalam bit per detik) dan waktu penundaan pulang-pergi (dalam detik). Ini mewakili jumlah data yang sangat maksimal yang dapat disimpan jaringan sebelum pengakuan dapat tiba.
BDP dapat digunakan untuk mengklasifikasikan jaringan sesuai dengan apakah itu di atas atau di bawah ambang batas tertentu. Jaringan dengan BDP besar disebut jaringan panjang lemak (LFN). LFN dapat berupa jaringan dengan waktu pulang-pergi rata-rata yang sangat besar (tanpa bandwidth, seperti pada tautan satelit) atau jaringan lebar (bandwidth tinggi) yang menampilkan waktu pulang-pergi yang sangat kecil (seperti pada tautan Gigabit Ethernet).
Periksa Wikipedia untuk informasi lebih lanjut tentang hal itu.
Objek carammbolas.net.socket berfungsi sebagai fasad untuk implementasi soket asli atau implementasi fallback yang bergantung pada system.net.sockets.socket. Ini membantu memisahkan dan mengurangi kompleksitas objek host dan peer. Lihat DOC/README-CARAMBOLAS.NET untuk informasi lebih lanjut.
System.net.ipaddress dan System.net.ipendpoint adalah objek yang dapat berubah yang mempromosikan sejumlah alokasi yang tidak perlu dalam semua implemen saat ini dari .NET Core dan .NET Framework. Carambolas.net.ipaddress dan carambolas.net.ipendpoint adalah tipe nilai abadi yang berkontribusi untuk mengurangi tekanan GC. Lihat DOC/README-CARAMBOLAS.NET untuk informasi lebih lanjut.
Aead dengan Chacha20 dan Poly1305 didukung di luar kotak. Strategi khusus dapat diimplementasikan dengan menyediakan host dengan implementasi carambolas.net.Iscipher dan carambolas.net.IscipherFactory Interfaces. Satu -satunya persyaratan adalah:
Aplikasi pengguna gratis untuk mengompres data sebelum dikirim tetapi saat ini tidak ada mekanisme untuk memberikan kompresi/dekompresi otomatis dari pesan individual atau paket lengkap.
Semua kode sumber dan binari apa pun yang diproduksi untuk digunakan bersama aplikasi pengguna dilisensikan di bawah lisensi MIT.
Carambolas.CommandLinearguments didasarkan pada artikel oleh GriffonRL dengan kode sumber yang diterbitkan di bawah lisensi MIT dengan ide -ide tambahan dari artikel lain oleh Jake Ginnivan yang diperluas pada sumber asli.
Carambolas.security.criptography.crc32c didasarkan pada CRC32.net dengan paksa di bawah lisensi MIT.
Carambolas.security.criptography.nacl didasarkan dan diperluas pada NaCl.core oleh David de Smet di bawah lisensi MIT.
Disektor protokol yang ditulis di LUA untuk Wireshark tersedia di bawah lisensi GPLV3. Seharusnya hanya digunakan sebagai file input untuk Wireshark untuk memperluas kemampuannya dan memungkinkannya untuk menampilkan lebih banyak informasi tentang paket UDP yang diformat sesuai dengan protokol jaringan Carambolas. Oleh karena itu benar -benar terpisah dan tidak berinteraksi, bergantung, atau berkontribusi dengan cara apa pun ke file sumber, rakitan, atau perpustakaan asli apa pun.