Ini adalah dokumentasi protokol Raknet terbaru. Ini mencakup informasi tentang tipe data yang digunakan dalam protokol dan detail tentang setiap paket dan bidang terkaitnya.
TODO: Modifikasi untuk membuatnya lebih baik untuk mata dan menghilangkan banyak hal yang tidak berguna. Dan juga mengatur hal -hal, seperti enum/konstanta di 1 tempat, dan juga menghilangkan hal -hal yang berulang.
Dokumentasi ini mengasumsikan Anda menginginkan metode keamanan yang sama/sama dari libcat, itu sebabnya jika server yang Anda targetkan tidak memiliki libcat atau apa pun yang sama seperti itu, tetapi mereka juga memiliki keamanan yang diaktifkan, klien akan macet karena mereka hanya akan memberi Anda cookie, tidak ada bukti identitas atau apa pun dari suka. Tetapi Anda dapat menarik permintaan untuk mendukung kedua kasus.
| Jenis | Ukuran | Catatan |
|---|---|---|
| uint8 | 1 byte | Integer 8-bit yang tidak ditandatangani |
| uint16 | 2 byte | Integer 16-bit yang tidak ditandatangani |
| uint24 | 3 byte | Integer 24-bit yang tidak ditandatangani dengan nilai minimum 0 dan nilai maksimum 16777215 |
| uint32 | 4 byte | Integer 32-bit yang tidak ditandatangani |
| uint64 | 4/8 byte | Integer 64-bit yang tidak ditandatangani (4 byte untuk sistem 32-bit, 8 byte untuk sistem 64-bit) |
| uint16-string | variabel | String yang disandikan UTF-8 dengan panjang 2 byte sebelum string |
| sihir | 16 byte | Array bilangan bulat 8-bit yang tidak ditandatangani dengan urutan spesifik [0x00, 0xFF, 0xFF, 0x00, 0xFE, 0xFE, 0xFE, 0xFE, 0xFD, 0xFD, 0xFD, 0xFD, 0x12, 0x34, 0x56, 0x78] |
| pad-with-nol | variabel | Byte nol digunakan untuk bantalan dengan ukuran pilihan Anda |
| bool | 1 byte | Tulis atau baca sebagai bilangan bulat 8-bit yang tidak ditandatangani, dengan nilai 0 atau 1 (nol digunakan untuk mewakili false, dan satu digunakan untuk mewakili benar) |
| alamat | 7-29 byte | IPv4: 1 byte (versi alamat), 4 byte (alamat IP), 2 byte (port), ipv6: 1 byte (versi alamat), tidak ditandatangani pendek untuk keluarga alamat (dalam sedikit endian), tidak ditandatangani pendek untuk nomor port, bilangan bulat tanpa tanda untuk info aliran, 16 byte untuk alamat, integer yang tidak ditandatangani untuk culup ID. |
| sedikit | 1 bit | Tulis atau baca bit di dalam buffer setelah Anda menyelesaikannya |
| mengambang | 4 byte | IEEE 754 nomor floating-point presisi tunggal |
Anda dapat langsung mendefinisikannya tanpa membaca bagaimana mereka dibuat jika Anda ingin membuat implementasi Anda lebih cepat.
| Nama | Nilai |
|---|---|
| Mtusize | 1492 |
| UdpheaderSize | 28 |
| PublicKeySize | 294 |
| RequstChallengesize | 64 |
| RESPONINGINGECRYPERKEY | 128 |
| MaxNumberoflocalAddresses | 10 |
| IdentityproofSize | 294 |
| Klien tahan klien | 32 |
| DefaultProtocolversion | 6 |
| NumberofarrangedStreams | 32 |
| Nama | PENGENAL | Jenis |
|---|---|---|
| Unconnectedping | 0x01 | Offline |
| UnconnectedpingOpenconnections | 0x02 | Offline |
| UnconnectedPong | 0x1c | Offline |
| Terhubung | 0x00 | Online [dari/ke datagram] |
| ConnectedPong | 0x03 | Online [dari/ke datagram] |
| OpenConnectionRequestone | 0x05 | Offline |
| OpenConnectionReplyone | 0x06 | Offline |
| OpenConnectionRequesttwo | 0x07 | Offline |
| OpenConnectionReplytwo | 0x08 | Offline |
| ConnectionRequest | 0x09 | Online [dari/ke datagram] |
| Remotesystemrequirespublickey | 0x0a | Offline |
| OurSystemRequiressecurity | 0x0b | KEDUANYA [?] |
| ConnectionAttemptFailed | 0x11 | Offline |
| Sudah terhubung | 0x12 | Offline |
| Connectionrequestcepted | 0x10 | Online [dari/ke datagram] |
| NewincomingConnection | 0x13 | Online [dari/ke datagram] |
| Disconnectionnotification | 0x15 | ON LINE |
| ConnectionLost | 0x16 | KEDUANYA [?] |
| Tidak kompatibelprotocolversion | 0x19 | ON LINE |
Tunggu paket yang tidak terhubung dari klien.
Tunggu paket OpenConnectionRequestone dari klien.
Tunggu paket OpenConnectionRequesttwo dari klien.
Tunggu datagram dari klien.
Kirim paket yang tidak terhubung ke server.
Kirim paket OpenConnectionRequestone ke server.
Kirim paket OpenConnectionRequestTwo ke server.
Kirim DataGram ke server.
Paket ini digunakan untuk menentukan apakah server online atau tidak.
| Bidang | Jenis | Endianness | Catatan |
|---|---|---|---|
| Onlyreplyonopenconnections | bool | N/a | Jika diatur ke True, server hanya akan mengirim balasan jika koneksi klien ke server saat ini terbuka. Ini membantu mencegah pengiriman tanggapan kepada klien yang telah menutup koneksi mereka. ID pesan yang dihasilkan untuk permintaan tersebut adalah UnconnectedPingOpenConnections . Jika diatur ke false, maka pengidentifikasi tidak perlu diubah. |
| pengenal | uint8 | N/a | Pengidentifikasi unik dari paket ini |
| ClientSendTime | uint64 | Endian Besar | Cap waktu klien digunakan untuk menghitung latensi |
| sihir | uint8 [16] | N/a | Urutan ajaib untuk mengidentifikasi paket |
| ClientGuid | uint64 | Endian Besar | Pengidentifikasi unik untuk klien |
Paket ini adalah respons terhadap paket ping yang tidak terhubung.
| Bidang | Jenis | Endianness | Catatan |
|---|---|---|---|
| pengenal | uint8 | N/a | Pengidentifikasi unik dari paket ini |
| ServerSendtime | uint64 | Endian Besar | Timestamp server digunakan untuk menghitung latensi |
| serverguid | uint64 | Endian Besar | Pengidentifikasi unik untuk server |
| sihir | uint8 [16] | N/a | Urutan ajaib untuk mengidentifikasi paket |
| Responsedata | uint16-string | Endian Besar | Data respons biasanya digunakan untuk informasi server |
Paket ini digunakan untuk menjaga koneksi tetap hidup antara klien dan server.
| Bidang | Jenis | Endianness | Catatan |
|---|---|---|---|
| pengenal | uint8 | N/a | Pengidentifikasi unik dari paket ini |
| ClientSendTime | uint64 | Endian Besar | Cap waktu klien digunakan untuk menghitung latensi |
Paket ini adalah respons terhadap paket ping yang terhubung.
| Bidang | Jenis | Endianness | Catatan |
|---|---|---|---|
| pengenal | uint8 | N/a | Pengidentifikasi unik dari paket ini |
| ClientSendTime | uint64 | Endian Besar | Cap waktu klien dari ping |
| ServerSendtime | uint64 | Endian Besar | Timestamp server digunakan untuk menghitung latensi |
Paket ini digunakan untuk memulai proses jabat tangan antara klien dan server.
| Bidang | Jenis | Endianness | Catatan |
|---|---|---|---|
| pengenal | uint8 | N/a | Pengidentifikasi unik dari paket ini |
| sihir | uint8 [16] | N/a | Urutan ajaib untuk mengidentifikasi paket |
| protokolversi | uint8 | N/a | Versi Protokol Didukung oleh Klien |
| mtusize | pad-with-nol | N/a | Ukuran unit transmisi maksimum (MTU) klien |
Saat menggunakan pad-with-nol, tambahkan ke ukuran MTU posisi bacaan saat ini ditambah 28 (ukuran header UDP) untuk dibaca. Untuk menulis, buat ukuran MTU dikurangi dengan posisi penulisan buffer saat ini (atau ukurannya) ditambah 28 (ukuran header UDP) ditambah ukuran buffer saat ini. Untuk memvalidasi buffer paket, periksa apakah ukurannya 28 (ukuran header UDP) ditambah ukuran buffer saat ini.
Paket ini adalah respons terhadap permintaan koneksi terbuka satu paket.
| Bidang | Jenis | Endianness | Catatan |
|---|---|---|---|
| pengenal | uint8 | N/a | Pengidentifikasi unik dari paket ini |
| sihir | uint8 [16] | N/a | Urutan ajaib untuk mengidentifikasi paket |
| serverguid | uint64 | Endian Besar | Pengidentifikasi unik untuk server |
| ServerHassecurity | bool | N/a | Apakah server membutuhkan keamanan atau tidak |
| mtusize | uint16 | Endian Besar | Ukuran unit transmisi maksimum (MTU) server |
Paket ini adalah respons terhadap permintaan koneksi terbuka satu paket dengan informasi keamanan tambahan.
| Bidang | Jenis | Endianness | Catatan |
|---|---|---|---|
| pengenal | uint8 | N/a | Pengidentifikasi unik dari paket ini |
| sihir | uint8 [16] | N/a | Urutan ajaib untuk mengidentifikasi paket |
| serverguid | uint64 | Endian Besar | Pengidentifikasi unik untuk server |
| ServerHassecurity | bool | N/a | Apakah server membutuhkan keamanan atau tidak |
| Hascookie | bool | N/a | Apakah paket itu termasuk cookie |
| kue | uint32 | Endian Besar | Nilai kue |
| ServerPublickey | uint8 [294] | N/a | Kunci publik yang digunakan untuk enkripsi |
| mtusize | uint16 | Endian Besar | Ukuran unit transmisi maksimum (MTU) server |
Paket ini digunakan untuk menyelesaikan proses jabat tangan antara klien dan server.
| Bidang | Jenis | Endianness | Catatan |
|---|---|---|---|
| pengenal | uint8 | N/a | Pengidentifikasi unik dari paket ini |
| sihir | uint8 [16] | N/a | Urutan ajaib untuk mengidentifikasi paket |
| ServerAddress | uint8 [7-29] | N/a | Alamat IP server dan kombo port |
| mtusize | uint16 | Endian Besar | Ukuran unit transmisi maksimum (MTU) klien |
| ClientGuid | uint64 | Endian Besar | Pengidentifikasi unik untuk klien |
Paket ini digunakan untuk menyelesaikan proses jabat tangan antara klien dan server.
| Bidang | Jenis | Endianness | Catatan |
|---|---|---|---|
| pengenal | uint8 | N/a | Pengidentifikasi unik dari paket ini |
| sihir | uint8 [16] | N/a | Urutan ajaib untuk mengidentifikasi paket |
| kue | uint32 | Endian Besar | Nilai kue |
| mengandung tantangan | bool | N/a | Apakah sistem membutuhkan tantangan jabat tangan |
| tantangan | uint8 [64] | N/a | Byte tantangan jabat tangan sistem |
| ServerAddress | uint8 [7-29] | N/a | Alamat IP server dan kombo port |
| mtusize | uint16 | Endian Besar | Ukuran unit transmisi maksimum (MTU) klien |
| ClientGuid | uint64 | Endian Besar | Pengidentifikasi unik untuk klien |
Catatan: Jika paket OpEnnectionReplyone memiliki keamanan tetapi paket ini tidak mengandung tantangan, klien harus segera mengirim paket RemotesystemRequirespublickey untuk memberi tahu server bahwa tidak ada tantangan dalam paket OpEnconnectionRequestTWo.
Anda dapat menulis cara Anda sendiri untuk menghitung hasil koneksi tetapi ini di bawah ini adalah cara standar.
Menghitung koneksi outcome :
bitwise and untuk memeriksa apakah cek di bawah ini diperlukan menggunakan contains address dan contains guid .clientGuid sudah dikaitkan dengan klien yang memiliki alamat klien yang berbeda, atur status koneksi ke 3.clientGuid yang berbeda, atur status koneksi ke 4.Setelah Anda menghitung
ConnectionOutcome, Anda perlu memeriksa apakah itu sama dengan 1 lalu kirim paketOpenConnectionReplyTwo.
Jika
ConnectionOutcometidak 0, kirim paketAlreadyConnected.
Paket ini adalah respons terhadap permintaan koneksi terbuka dua paket.
| Bidang | Jenis | Endianness | Catatan |
|---|---|---|---|
| pengenal | uint8 | N/a | Pengidentifikasi unik dari paket ini |
| sihir | uint8 [16] | N/a | Urutan ajaib untuk mengidentifikasi paket |
| serverguid | uint64 | Endian Besar | Pengidentifikasi unik untuk server |
| ClientAddress | uint8 [7-29] | N/a | Alamat IP klien dan kombo port |
| mtusize | uint16 | Endian Besar | Ukuran unit transmisi maksimum (MTU) server |
| Membutuhkan resep | sedikit | N/a | Apakah koneksi membutuhkan enkripsi atau tidak |
| EncryptionKey | uint8 [128] | N/a | Kunci enkripsi klien - hanya ditulis atau dibaca jika bidang requiresEncryption diatur ke true. |
Paket ini digunakan untuk membuat koneksi antara klien dan server dengan keamanan diaktifkan atau dinonaktifkan.
| Bidang | Jenis | Endianness | Catatan |
|---|---|---|---|
| pengenal | uint8 | N/a | Pengidentifikasi unik dari paket ini |
| ClientGuid | uint64 | Endian Besar | Pengidentifikasi unik untuk klien |
| ClientSendTime | uint64 | Endian Besar | Cap waktu klien saat diminta untuk terhubung |
| Dosecurity | bool | N/a | Apakah koneksi membutuhkan keamanan atau tidak |
| tahan klien | uint8 [32] | N/a | Bukti otentikasi klien |
| Doidentity | bool | N/a | Apakah paket membutuhkan bukti identitas |
| tahan identitas | uint8 [294] | N/a | Bukti identitas klien |
Catatan: Jika bukti identitas tidak valid dan
doIdentitydisetel ke true, segera kirim paketRemoteSystemRequiresPublicKeydengan tipe IDClientIdentityIsInvalid. JikadoIdentitydiatur ke False dan tidak ada bukti identitas, kirim paketRemoteSystemRequiresPublicKeydengan tipe IDClientIdentityIsMissing.
Paket ini digunakan untuk melempar kesalahan yang terkait dengan permintaan kunci publik untuk otentikasi dan identifikasi klien.
| Bidang | Jenis | Endianness | Catatan |
|---|---|---|---|
| pengenal | uint8 | N/a | Pengidentifikasi unik dari paket ini |
| typeid | uint8 | N/a | Jenis Permintaan Kunci Publik |
| Nama | PENGENAL |
|---|---|
| ServerPublickeyismissing | 0 |
| ClientIdentityismissing | 1 |
| ClientIdentityIsInvalid | 2 |
Paket ini dikirim ketika server tidak memerlukan keamanan tetapi masih wajib.
| Bidang | Jenis | Endianness | Catatan |
|---|---|---|---|
| pengenal | uint8 | N/a | Pengidentifikasi unik dari paket ini |
| ClientAddress | uint8 [7-29] | N/a | Alamat IP klien dan kombo port |
| serverguid | uint64 | Endian Besar | Pengidentifikasi unik untuk server |
Paket ini dikirim ketika upaya menghitung yang mencoba bergabung dengan server lebih tinggi dari jumlah tertentu (tergantung pada implementasi Anda) atau klien tidak berisi alamat yang ditetapkan; Inilah yang Anda periksa dan kirim jika persyaratan dipenuhi sebelum mengirim paket OpenConnectionRequestOne .
| Bidang | Jenis | Endianness | Catatan |
|---|---|---|---|
| pengenal | uint8 | N/a | Pengidentifikasi unik dari paket ini |
Paket ini dikirim saat klien sudah terhubung.
| Bidang | Jenis | Endianness | Catatan |
|---|---|---|---|
| pengenal | uint8 | N/a | Pengidentifikasi unik dari paket ini |
| sihir | uint8 [16] | N/a | Urutan ajaib untuk mengidentifikasi paket |
| ClientGuid | uint64 | Endian Besar | Pengidentifikasi unik untuk klien |
Paket ini adalah respons terhadap permintaan koneksi dengan keamanan yang diaktifkan.
| Bidang | Jenis | Endianness | Catatan |
|---|---|---|---|
| pengenal | uint8 | N/a | Pengidentifikasi unik dari paket ini |
| ClientAddress | uint8 [7-29] | N/a | Alamat IP klien dan kombo port |
| ClientIndex | uint16 | Endian Besar | Pengidentifikasi unik yang ditugaskan untuk klien |
| servermachineaddresses | alamat [10] | N/a | Alamat Mesin Lokal Server |
| ClientSendTime | uint64 | Endian Besar | Cap waktu untuk klien |
| ServerSendtime | uint64 | Endian Besar | Cap waktu untuk server |
Paket ini dikirim ke semua klien lain ketika klien baru terhubung ke server.
| Bidang | Jenis | Endianness | Catatan |
|---|---|---|---|
| pengenal | uint8 | N/a | Pengidentifikasi unik dari paket ini |
| ServerAddress | uint8 [7-29] | N/a | Alamat IP server dan kombo port |
| clientmachineaddresses | alamat [10] | N/a | Alamat Mesin Lokal Klien |
| ClientSendTime | uint64 | Endian Besar | Cap waktu untuk klien |
| ServerSendtime | uint64 | Endian Besar | Cap waktu untuk server |
Setelah Anda mengirim atau menerima paket ini ke server, Anda harus menjaga koneksi tetap hidup dengan mengirim paket ConnectedPing secara berkala. Paket -paket ini pada dasarnya adalah cara untuk mengatakan "Hei, saya masih di sini dan terhubung ke server." Server juga mengirim paket ConnectedPong kembali sebagai tanggapan untuk mengonfirmasi bahwa koneksi masih aktif. Proses ping-pong ini membantu mencegah koneksi dari waktu keluar karena tidak aktif atau masalah jaringan.
Paket ini dikirim ketika klien terputus dari server.
| Bidang | Jenis | Endianness | Catatan |
|---|---|---|---|
| pengenal | uint8 | N/a | Pengidentifikasi unik dari paket ini |
Paket ini dikirim ketika koneksi ke klien hilang.
| Bidang | Jenis | Endianness | Catatan |
|---|---|---|---|
| pengenal | uint8 | N/a | Pengidentifikasi unik dari paket ini |
| ClientGuid | uint64 | Endian Besar | Pengidentifikasi unik untuk klien |
| ClientAddress | uint8 [7-29] | N/a | Alamat IP klien dan kombo port |
Paket ini dikirim ketika klien mencoba untuk terhubung ke server dengan versi protokol yang tidak kompatibel.
| Bidang | Jenis | Endianness | Catatan |
|---|---|---|---|
| pengenal | uint8 | N/a | Pengidentifikasi unik dari paket ini |
| protokolversi | uint8 | N/a | Versi Protokol didukung oleh server |
| sihir | uint8 [16] | N/a | Urutan ajaib untuk mengidentifikasi paket |
| serverguid | uint64 | Endian Besar | Pengidentifikasi unik untuk server |
Paket ini digunakan untuk mengirim dan menerima data antara klien dan server. Ini bisa menjadi salah satu dari tiga jenis: ValidDATAGRAM, ACKEDDATAGRAM, atau NackedDATAGRAM.
| Bidang | Jenis | Endianness | Catatan |
|---|---|---|---|
| isvalid | sedikit | N/a | Selalu benar |
| Isack | sedikit | N/a | Jika benar, paket itu adalah ACKEDDATAGRAM |
| ISNACK | sedikit | N/a | Jika benar, paket itu adalah nackeddatagram |
Jika
isAckdanisNackkeduanya salah, paketnya adalah ValidDATAGRAM.
Paket ini merupakan respons terhadap validdatagram yang menunjukkan bahwa server telah menerima data.
| Bidang | Jenis | Endianness | Catatan |
|---|---|---|---|
| membutuhkanbanda | sedikit | N/a | Jika benar, paket tersebut mencakup nilai B dan AS |
| B | mengambang | Endian Besar | Tidak digunakan |
| SEBAGAI | mengambang | Endian Besar | Tingkat kedatangan data |
| rentang | Jangkauan | N/a | Array nilai rentang yang diterima |
Paket ini merupakan respons terhadap validdatagram yang menunjukkan bahwa server belum menerima semua data yang diharapkan.
| Bidang | Jenis | Endianness | Catatan |
|---|---|---|---|
| rentang | Jangkauan | N/a | Array nilai rentang yang tidak diterima |
Struktur ini digunakan untuk mewakili rentang Ackeddatagram dan rentang nackeddatagram yang hilang.
| Bidang | Jenis | Endianness | Catatan |
|---|---|---|---|
| ukuran | uint16 | Endian Besar | Jumlah rentang dalam array |
| issingle | bool | N/a | Jika min sama dengan maks, maka ini diatur ke true |
| Min | uint24 | Endian kecil | Nilai minimum dalam kisaran |
| Max | uint24 | Endian kecil | Nilai maksimum dalam kisaran - tidak ditulis jika lajang |
Paket ini digunakan untuk mengirim dan menerima data antara klien dan server.
| Bidang | Jenis | Endianness | Catatan |
|---|---|---|---|
| IspacketPair | sedikit | N/a | Jika benar, paket tersebut adalah salah satu dari dua paket terkait |
| iscontinuoussend | sedikit | N/a | Jika benar, paket itu adalah paket kirim berkelanjutan |
| membutuhkanbanda | sedikit | N/a | Jika benar, paket tersebut mencakup nilai B dan AS |
| RangenBer | uint24 | Endian kecil | Nomor urutan datagram |
| kapsul | DatagramCapsule [] | N/a | Array kapsul dalam paket |
Memeriksa saluran pengaturan yang korup : (Datagram yang valid harus `diurutkan dan diatur (tidak ada penerimaan ACK))
Jika arrangmentChannel lebih besar atau setara dengan jumlah aliran yang diatur yang tersedia yaitu 2 ^ 5 maka itu adalah correupted (lewati dan lakukan apa yang dibutuhkan).
Setiap jenis pengaturan datagram yang valid dari nilai maksimal array adalah jumlah aliran yang diatur dan tidak boleh lebih besar atau setara dengan.
Hitung lubang menemukan dalam datagram yang diterima : (Datagram yang valid harus Reliable or in sequence sebelum melanjutkan lebih lanjut)
Anda perlu memeriksa jumlah lubang dalam datagram yang valid yang Reliable or in sequence dan alasannya adalah untuk memeriksa pesanan mereka dan itu berfungsi sebagai cek jika ada semacam datagram valid yang hilang yang diterima atau rangeNumber yang salah digunakan dalam pengiriman atau apa pun alasan lain.
receivedPacketsBaseIndex : Ini hanya bertambah jika datagram yang valid Reliable or in sequence
receivedPacketQueue : Ini adalah sesuatu yang menyimpan rangeNumber datagram yang valid sebagai kunci dalam daftar dan nilainya DS_Queue bukan datagram, itu bisa salah tetapi setelah bertemu beberapa kodisi yang akan dinyatakan di bawah ini (salah berarti bahwa kami mendapatkannya dengan cara yang berhasil dan benar kami tidak berhasil.
Untuk menemukan jumlah lubang, kurangi, rangeNumber Datagram yang diterima saat ini dengan receivedPacketsBaseIndex dan properti itu bertambah setiap kali tidak ada jumlah lubang ( receivedPacketsBaseIndex hanya bertambah jika Reliable or in sequence ).
receivedPacketQueue jika ada dan menambahkan (pra-) bertambah dari receivedPacketsBaseIndex .uint24 yang bitwise right shifted dengan 1 maka itu adalah paket yang digandakan (lewati dan lakukan apa yang dibutuhkan).receivedPacketQueuereceivedPacketQueue dan tidak sama dengan False maka isi lubang dengan mengganti kunci jumlah lubang di receivedPacketQueue dengan kunci bahwa nilainya sama dengan False.Jika kondisi ini dinyatakan tidak terpenuhi:
bitwise and nilai maksimum uint32 jika diperlukan) lebih besar dari ukuran receivedPacketQueue kemudian isi dengan mendorong nilai yang benar dalam antrian. Setelah itu, Anda dapat membuat loop dan memeriksa apakah ukuran receivedPacketQueue lebih besar dari 0 dan nilai pertama dari receivedPacketQueue adalah false maka lepaskan elemen terakhir dari receivedPacketQueue kemudian menambah receivedPacketsBaseIndex .
Setelah itu Anda dapat menangani datagram yang valid secara normal.
Struktur ini mewakili kapsul dalam validdatagram.
| Bidang | Jenis | Endianness | Catatan |
|---|---|---|---|
| keandalan | 3 bit | Endian Besar | Jenis keandalan yang digunakan |
| ISSESMENTID | sedikit | N/a | Jika benar, paket tersegmentasi |
| ukuran | uint16 | Endian Besar | Ukuran bidang buffer di sana dalam bit |
| RELIBEBLECAPSULEDEX | uint24 | Endian kecil | Indeks yang digunakan untuk paket yang andal (artinya menggunakan keandalan untuk ini) |
| SequencedCapsuleIndex | uint24 | Endian kecil | Indeks yang digunakan untuk paket berurutan (artinya menggunakan keandalan untuk ini) |
| pengaturan | Capsulearrangement | N/a | Pengaturan kapsul yang digunakan untuk paket yang diurutkan dan diatur (artinya menggunakan keandalan untuk ini) |
| segmen | Capsulesegment | N/a | Segmen kapsul yang digunakan saat kapsul tersegmentasi |
| penyangga | Penyangga | N/a | Data buffer yang berisi data ingin dikirim melalui jaringan |
Struktur ini mewakili pengaturan kapsul di Validdatagram.
| Bidang | Jenis | Endianness | Catatan |
|---|---|---|---|
| aturedCapsuleIndex | uint24 | Endian kecil | Indeks kapsul yang diatur |
| Pengaturan Channel | uint8 | N/a | Saluran yang digunakan untuk pengaturan |
Struktur ini mewakili segmentasi kapsul dalam validdatagram.
| Bidang | Jenis | Endianness | Catatan |
|---|---|---|---|
| ukuran | uint32 | Endian Besar | Ukuran segmen |
| pengenal | uint16 | Endian Besar | Pengidentifikasi unik yang terkait dengan segmen ini |
| indeks | uint32 | Endian Besar | Indeks segmen |
Setiap datagram yang dikirim Raknet diberi tipeid keandalan yang menentukan bagaimana data harus ditangani oleh protokol. Tabel berikut mencantumkan TypeID reliabilitas yang tersedia dan propertinya:
| Nama | PENGENAL | Dapat diandalkan | Diatur | Diurutkan | Karakteristik/fitur |
|---|---|---|---|---|---|
| Tidak dapat diandalkan | 0 | TIDAK | TIDAK | TIDAK | TipeID reliabilitas ini mengirimkan datagram tanpa jaminan bahwa mereka akan tiba di tujuan. Mereka tidak dijamin akan dikirimkan dalam urutan tertentu atau sama sekali |
| Tidak dipercaya | 1 | TIDAK | Ya | Ya | TipeID reliabilitas ini mengirimkan datagram tanpa jaminan bahwa mereka akan tiba di tujuan tetapi memastikan bahwa mereka dikirimkan dalam urutan yang mereka kirim |
| Dapat diandalkan | 2 | Ya | TIDAK | TIDAK | TipeID reliabilitas ini mengirimkan datagram yang dijamin akan dikirimkan sesuai urutan yang mereka kirim. Jika datagram hilang, Raknet akan mentransmisikannya sampai diakui oleh penerima |
| Relsiblearranged | 3 | Ya | Ya | TIDAK | TipeID reliabilitas ini mengirimkan datagram yang dijamin akan dikirimkan sesuai urutan yang mereka kirim. Jika datagram hilang, raknet tidak akan mentransmisikannya dan semua datagram sebelumnya yang belum diakui |
| Reliblesequenced | 4 | Ya | Ya | Ya | TipeID reliabilitas ini mengirimkan datagram yang dijamin akan dikirimkan sesuai urutan mereka dikirim dan memastikan bahwa mereka dikirim secara berurutan |
| Tidak dapat diandalkan dengan receipt | 5 | TIDAK | TIDAK | TIDAK | TipeID reliabilitas ini mengirimkan datagram tanpa jaminan bahwa mereka akan tiba di tujuan, tetapi penerima mengirimkan tanda terima pengakuan setelah menerima kwitansi datagram ini |
| Dapat diandalkan denganReceipt | 6 | Ya | TIDAK | TIDAK | TipeID reliabilitas ini mengirimkan datagram yang dijamin akan dikirimkan sesuai urutan yang mereka kirim, dan penerima mengirimkan kwitansi pengakuan setelah menerima kwitansi datagram ini |
| Reliblearrangedwithackreceipt | 7 | Ya | Ya | TIDAK | TipeID reliabilitas ini mengirimkan datagram yang dijamin akan dikirimkan dalam urutan yang mereka kirim tetapi semua datagram sebelum yang belum diakui, dan penerima mengirimkan tanda terima pengakuan setelah menerima data ini |
Di sini Anda dapat menemukan setiap definisi keandalan yang digunakan di tempat lain di dokumentasi.
Sequenced dan diatur dapat diatur dan dapat diatur dengan ACK RecepitRaknet menggunakan transmisi ulang selektif untuk memastikan pengiriman datagram yang andal. Ketika datagram dikirim, itu diberi nomor urutan. Jika datagram tidak diakui dalam periode batas waktu tertentu, Raknet akan mentransmisikan kembali datagram menggunakan nomor urutan yang sama. Ketika penerima menerima datagram duplikat dengan nomor urutan yang sama, ia dapat membuangnya, karena telah mengakui nomor urutan itu.
Ackqueue dan nackqueue digunakan untuk melacak datagram mana yang telah diakui dan yang belum. Ackqueue menyimpan daftar nomor urutan datagram yang telah berhasil diakui, sementara Nackqueue menyimpan daftar nomor urutan datagram yang belum diakui dan perlu ditransmisikan kembali. Ketika datagram diterima dengan nomor urutan yang telah diakui, itu dapat dibuang.
PacketPair adalah teknik yang digunakan oleh Raknet untuk meningkatkan efisiensi transmisi datagram. Ketika datagram diakui, Raknet mengirimkan datagram berikutnya dalam urutan juga. Ini memungkinkan penerima untuk mulai memproses datagram berikutnya segera, mengurangi latensi dan meningkatkan throughput.
ContinuousSend adalah fitur Raknet yang memungkinkan Datagram dikirim terus menerus tanpa menunggu pengakuan. Ini dapat meningkatkan kinerja dalam beberapa kasus, tetapi juga dapat menyebabkan kehilangan paket dan transmisi, karena pengirim tidak menunggu umpan balik sebelum mengirim datagram berikutnya.
Raknet menggunakan mekanisme pemasangan kembali untuk merekonstruksi datagram tersegmentasi yang mungkin diterima rusak. Ketika datagram tersegmentasi, setiap segmen diberi pengidentifikasi yang unik. Ketika penerima menerima segmen, itu disangga sampai semua segmen dengan pengidentifikasi yang sama telah diterima. Setelah semua segmen diterima, mereka dipasang kembali ke dalam Datagram asli.
Kontrol aliran adalah mekanisme Raknet yang digunakan untuk mengelola laju transmisi data antara pengirim dan penerima. Ini memastikan bahwa penerima dapat menangani data yang masuk dengan kecepatan yang dapat diproses, mencegah kewalahan atau meluap penyangga penerima. Kontrol aliran membantu menjaga keseimbangan antara kecepatan transmisi pengirim dan kemampuan pemrosesan penerima, mengoptimalkan efisiensi dan stabilitas komunikasi secara keseluruhan.
Manajer kemacetan memegang kendali kemacetan, memeriksa nomor jangkauan yang dilewati untuk mengirim nack, dan hal -hal lainnya.
TODO: Tambahkan dokumen
Kontrol kemacetan adalah teknik Raknet yang digunakan untuk mencegah kemacetan jaringan dengan menyeimbangkan laju transmisi data. Teknik -teknik seperti kontrol kemacetan TCP, penurunan paket, pembatasan tingkat, pembentukan lalu lintas, QoS, dan penyeimbangan beban digunakan. Teknik -teknik ini memastikan pengiriman data yang andal dan transmisi yang efisien di Raknet.
Segmentasi di Raknet meningkatkan pengiriman data dengan membagi pesan besar menjadi segmen yang lebih kecil. Segmen -segmen ini, dengan header yang menunjukkan posisi dan ukuran, memastikan keberhasilan pemasangan kembali di ujung penerima. Dengan membandingkan ukuran buffer dengan ukuran unit transmisi maksimum (MTU), jika buffer melebihi MTU, ia dibagi menjadi segmen untuk transmisi. Mekanisme ini di Raknet mencegah kehilangan data, mengelola muatan besar, dan menjamin transmisi yang andal dalam aplikasi jaringan.
"B" mewakili kapasitas tautan atau jumlah maksimum data yang dapat ditransmisikan per detik melalui tautan jaringan. Kapasitas tautan ditentukan oleh banyak faktor, termasuk infrastruktur jaringan, konfigurasi jaringan, dan sumber daya yang tersedia. Dengan menggunakan nilai float, kapasitas jaringan dapat diwakili secara lebih akurat dan tepat, memungkinkan pemanfaatan sumber daya yang tersedia dengan lebih baik.
"Sebagai" mewakili tingkat kedatangan data, yang merupakan tingkat di mana data dihasilkan dan dikirim oleh pengirim. Penggunaan nilai float memungkinkan representasi yang lebih tepat dari tingkat kedatangan, yang dapat bervariasi berdasarkan persyaratan aplikasi dan kondisi jaringan. Dengan membandingkan tingkat kedatangan dengan kapasitas tautan, pengirim dapat menentukan jumlah data yang dapat dikirim melalui tautan jaringan tanpa menyebabkan kemacetan atau degradasi kinerja.
Untuk menentukan ukuran kapsul, Anda dapat mengikuti langkah -langkah ini:
reliableCapsuleIndex .sequencedCapsuleIndex .arrangedCapsuleIndex , dan kemudian dengan 1 langkah untuk arrangementChannel .size , 2 langkah untuk id , dan 4 langkah untuk index segmen. ID UserPacketenum adalah 0x86 , yang menandai awal di mana Anda dapat mulai menggunakan ID paket khusus Anda.
Yang direkomendasikan adalah membuat PacketAggregator mengingat Anda memiliki implementasi yang lengkap kemudian mengirim dan menerimanya.
Anda dapat menempatkan ID pilihan Anda, seperti: UserPacketEnumID + ID Anda sendiri (itu tidak boleh membuat UserPacketEnumID melampaui uint8 limit )
Misalnya: UserPacketEnumID + 22 = 0x9c
Struktur paket sederhana yang menampilkan apa yang bisa menjadi PacketAggregator :
| Bidang | Jenis | Endianness | Catatan |
|---|---|---|---|
| pengenal | uint8 | N/a | Pengidentifikasi unik dari paket ini |
| Compressionalgorithma | uint8 | Algoritma kompresi [tidak bisa tidak ada, openssl, zlib, gzip, tajam, apapun] | |
| stream | penyangga[] | Array aliran paket (masing -masing elemen dalam array aliran mewakili buffer paket yang dikodekan/dan harus diterjemahkan dalam compressionAlgorithm ) |
Setelah itu Anda akan mengirimkannya di buffer kapsul/s Datagram yang valid
Untuk mengirim paket non-Raknet, pertama-tama tentukan apakah segmentasi diperlukan dengan membandingkan apakah ukuran buffer kapsul lebih besar dari ukuran MTU minus 2, ditambah 3, ditambah 4 kali 1 (untuk panjang byte header data datagram), dan mengurangi 11 jika keamanan digunakan. Kemudian, kurangi nilai yang diberikan dengan ukuran kapsul. Jika segmentasi diperlukan, segemnt aliran kapsul sebelum menambahkannya ke antrian datagram untuk transmisi. Jika tidak ada segmentasi yang diperlukan, tambahkan langsung ke antrian. Ingat, paket tersegmentasi tidak boleh tidak dapat diandalkan; Jika ya, konversinya menjadi paket yang dapat diandalkan untuk menjamin pengiriman yang berhasil dan dipesan dari semua bagian paket.
Cara untuk membagi ke bagian:
get the capsule size and also the capsule buffer size then the size that you used to check if is greater than the capsule buffer size and define them.
to get the count of how many segments is needed to be made: subtract the capsule buffer size with 1 then divide it with the size that you used to check if is greater than the capsule buffer size then sum them with 1 (not two times) or you can ceil instead of subtracting 1 and adding 1 at the end
then define a current segment index outside the loop and is 0 by default
then do a loop that will use the count of how many segments then the segmentation process will start:
after that define a variable representing start offset and it is equals to current segment index multiplied by the size that you used to check if is greater than the capsule buffer size
after that define a variable representing bytes to send that is equals to capsule buffer size subtracted by start offset
check if bytes to send is greater than the size that you used to check if is greater than the capsule buffer size and if true set the bytes to send value to the size that you used to check...
after that create a new variable representing the end offset
check if the bytes to send is not the size that you used to check if is greater than the capsule buffer size then set the end offset to the capsule buffer size subtracted by the current segment index multiplied by the size that you used to check if is greater than the capsule buffer size
if the check fails then the end offset will be the bytes to send
after that slice the capsule buffer with the start offset and end offset then you can do the feilds in the capsule.
you will need an array that has the capsules that contains the segments that will then be sent in queue.
the segment id will be the sender last segment id property that will increment outside the loop every time.
Here are a list of resources to help you better understand the RakNet protocol: