นี่เป็นเอกสารล่าสุดของโปรโตคอล Raknet มันมีข้อมูลเกี่ยวกับชนิดข้อมูลที่ใช้ในโปรโตคอลและรายละเอียดเกี่ยวกับแต่ละแพ็คเก็ตและฟิลด์ที่เกี่ยวข้อง
TODO: ปรับเปลี่ยนเพื่อให้ตาดีขึ้นและลบสิ่งที่ไร้ประโยชน์มากมาย และจัดระเบียบสิ่งต่าง ๆ เช่น enums/ค่าคงที่ใน 1 สถานที่และยังลบสิ่งที่ทำซ้ำ
เอกสารนี้ถือว่าคุณต้องการวิธีการรักษาความปลอดภัยที่คล้ายกัน/เดียวกันของ Libcat นั่นคือเหตุผลว่าทำไมถ้าเซิร์ฟเวอร์ที่คุณกำหนดเป้าหมายไม่มี libcat หรืออะไรก็ตามเช่นเดียวกับที่ แต่พวกเขายังเปิดใช้งานความปลอดภัยลูกค้าจะผิดพลาดเพราะพวกเขาจะให้คุกกี้คุณไม่มีการพิสูจน์ตัวตนหรือสิ่งที่ชอบ แต่คุณสามารถดึงคำขอสำหรับการสนับสนุนทั้งสองกรณี
| พิมพ์ | ขนาด | บันทึก |
|---|---|---|
| Uint8 | 1 ไบต์ | จำนวนเต็ม 8 บิตที่ไม่ได้ลงชื่อ |
| Uint16 | 2 ไบต์ | จำนวนเต็ม 16 บิตที่ไม่ได้ลงชื่อ |
| Uint24 | 3 ไบต์ | จำนวนเต็ม 24 บิตที่ไม่ได้ลงชื่อโดยมีค่าต่ำสุด 0 และค่าสูงสุดของ 16777215 |
| uint32 | 4 ไบต์ | จำนวนเต็ม 32 บิตที่ไม่ได้ลงชื่อ |
| uint64 | 4/8 ไบต์ | จำนวนเต็ม 64 บิตที่ไม่ได้ลงนาม (4 ไบต์สำหรับระบบ 32 บิต, 8 ไบต์สำหรับระบบ 64 บิต) |
| uint16-string | ตัวแปร | สตริงที่เข้ารหัส UTF-8 ที่มีความยาว 2 ไบต์ก่อนหน้าสตริง |
| เวทมนตร์ | 16 ไบต์ | อาร์เรย์ของจำนวนเต็ม 8 บิตที่ไม่ได้ลงนามพร้อมลำดับเฉพาะ [0x00, 0xFF, 0xFF, 0x00, 0xFE, 0xFE, 0xFE, 0xFE, 0xFD, 0xFD, 0xFD, 0xFD, 0x12, 0x34, 0x56, 0x78] |
| Pad-with-Zero | ตัวแปร | ไบต์ NULL ที่ใช้สำหรับช่องว่างภายในที่มีขนาดที่คุณเลือก |
| บูล | 1 ไบต์ | เขียนหรืออ่านเป็นจำนวนเต็ม 8 บิตที่ไม่ได้ลงชื่อเพียงครั้งเดียวโดยมีค่า 0 หรือ 1 (ศูนย์ถูกใช้เพื่อเป็นตัวแทนของเท็จและหนึ่งถูกใช้เพื่อเป็นตัวแทนของจริง) |
| ที่อยู่ | 7-29 ไบต์ | IPv4: 1 ไบต์ (เวอร์ชันที่อยู่), 4 ไบต์ (ที่อยู่ IP), 2 ไบต์ (พอร์ต), IPv6: 1 ไบต์ (เวอร์ชันที่อยู่), สั้นที่ไม่ได้ลงชื่อสำหรับครอบครัวที่อยู่ (ใน Little-Endian) สั้นที่ไม่ได้ลงนามสำหรับหมายเลขพอร์ต |
| นิดหน่อย | 1 บิต | เขียนหรืออ่านบิตภายในบัฟเฟอร์หลังจากเสร็จสิ้น |
| ลอย | 4 ไบต์ | IEEE 754 หมายเลขลอยความแม่นยำเดียว |
คุณสามารถกำหนดสิ่งเหล่านั้นได้ทันทีโดยไม่ต้องอ่านว่าพวกเขาทำอย่างไรหากคุณต้องการทำให้การใช้งานของคุณเร็วขึ้น
| ชื่อ | ค่า |
|---|---|
| mtusize | 1492 |
| udpheadersize | 28 |
| publickeysize | 294 |
| requstchallengesize | 64 |
| RespondencryptionKey | 128 |
| MaxNumberOflocalAddresses | 10 |
| IdentityProofsize | 294 |
| ClientProofsize | 32 |
| defaultprotocolversion | 6 |
| numberofarrangedstreams | 32 |
| ชื่อ | รหัสประจำตัว | พิมพ์ |
|---|---|---|
| ไม่ได้เชื่อมต่อ | 0x01 | ออฟไลน์ |
| ไม่ได้เชื่อมต่อกับการเชื่อมต่อ | 0x02 | ออฟไลน์ |
| ไม่ได้เชื่อมต่อกัน | 0x1c | ออฟไลน์ |
| การเชื่อมต่อ | 0x00 | ออนไลน์ [จาก/ถึง DataGram] |
| เชื่อมต่อกัน | 0x03 | ออนไลน์ [จาก/ถึง DataGram] |
| OpenConnectionRequestone | 0x05 | ออฟไลน์ |
| OpenConnectionRepleNone | 0x06 | ออฟไลน์ |
| OpenConnectionRequesttwo | 0x07 | ออฟไลน์ |
| OpenConnectionRep | 0x08 | ออฟไลน์ |
| ConnectionRequest | 0x09 | ออนไลน์ [จาก/ถึง DataGram] |
| remotesystemrequirespublickey | 0x0a | ออฟไลน์ |
| ความปลอดภัยของเรา | 0x0b | ทั้งคู่ [?] |
| Connectionattemptfailed | 0x11 | ออฟไลน์ |
| เชื่อมต่อแล้ว | 0x12 | ออฟไลน์ |
| ConnectionRequestaccepted | 0x10 | ออนไลน์ [จาก/ถึง DataGram] |
| การเชื่อมต่อใหม่ | 0x13 | ออนไลน์ [จาก/ถึง DataGram] |
| การยกเลิกการเชื่อมต่อ | 0x15 | ออนไลน์ |
| connectionlost | 0x16 | ทั้งคู่ [?] |
| การเข้ากันไม่ได้ protocolversion | 0x19 | ออนไลน์ |
รอแพ็คเก็ตที่ไม่ได้เชื่อมต่อจากไคลเอนต์
รอแพ็คเก็ต OpenConnectionRequestone จากไคลเอนต์
รอแพ็คเก็ต OpenConnectionRequestTwo จากไคลเอนต์
รอดาต้าแกรมจากไคลเอนต์
ส่งแพ็คเก็ตที่ไม่ได้เชื่อมต่อไปยังเซิร์ฟเวอร์
ส่งแพ็กเก็ต OpenConnectionRequestone ไปยังเซิร์ฟเวอร์
ส่งแพ็กเก็ต OpenConnectionRequestTwo ไปยังเซิร์ฟเวอร์
ส่งดาต้าแกรมไปยังเซิร์ฟเวอร์
แพ็คเก็ตนี้ใช้เพื่อตรวจสอบว่าเซิร์ฟเวอร์ออนไลน์หรือไม่
| สนาม | พิมพ์ | ความเอนเอียง | บันทึก |
|---|---|---|---|
| OnlyReplyOnopenconnections | บูล | N/A | หากตั้งค่าเป็นจริงเซิร์ฟเวอร์จะส่งการตอบกลับหากการเชื่อมต่อของไคลเอ็นต์กับเซิร์ฟเวอร์เปิดอยู่ในขณะนี้ สิ่งนี้ช่วยป้องกันการส่งคำตอบไปยังลูกค้าที่ปิดการเชื่อมต่อ รหัสข้อความที่ได้สำหรับคำขอจะ UnconnectedPingOpenConnections หากตั้งค่าเป็นเท็จตัวระบุไม่จำเป็นต้องเปลี่ยนแปลง |
| รหัสประจำตัว | Uint8 | N/A | ตัวระบุที่ไม่ซ้ำกันของแพ็กเก็ต |
| ClientSendTime | uint64 | endian ใหญ่ | การประทับเวลาไคลเอนต์ที่ใช้ในการคำนวณเวลาแฝง |
| เวทมนตร์ | uint8 [16] | N/A | ลำดับวิเศษเพื่อระบุแพ็กเก็ต |
| ลูกค้า | uint64 | endian ใหญ่ | ตัวระบุที่ไม่ซ้ำกันสำหรับลูกค้า |
แพ็คเก็ตนี้เป็นการตอบสนองต่อแพ็คเก็ตปิงที่ไม่ได้เชื่อมต่อ
| สนาม | พิมพ์ | ความเอนเอียง | บันทึก |
|---|---|---|---|
| รหัสประจำตัว | Uint8 | N/A | ตัวระบุที่ไม่ซ้ำกันของแพ็กเก็ต |
| เซิร์ฟเวอร์ | uint64 | endian ใหญ่ | การประทับเวลาเซิร์ฟเวอร์ที่ใช้ในการคำนวณเวลาแฝง |
| ServerGuid | uint64 | endian ใหญ่ | ตัวระบุที่ไม่ซ้ำกันสำหรับเซิร์ฟเวอร์ |
| เวทมนตร์ | uint8 [16] | N/A | ลำดับวิเศษเพื่อระบุแพ็กเก็ต |
| การตอบสนอง | uint16-string | endian ใหญ่ | โดยทั่วไปข้อมูลการตอบสนองใช้สำหรับข้อมูลเซิร์ฟเวอร์ |
แพ็คเก็ตนี้ใช้เพื่อให้การเชื่อมต่อมีชีวิตอยู่ระหว่างไคลเอนต์และเซิร์ฟเวอร์
| สนาม | พิมพ์ | ความเอนเอียง | บันทึก |
|---|---|---|---|
| รหัสประจำตัว | Uint8 | N/A | ตัวระบุที่ไม่ซ้ำกันของแพ็กเก็ต |
| ClientSendTime | uint64 | endian ใหญ่ | การประทับเวลาไคลเอนต์ที่ใช้ในการคำนวณเวลาแฝง |
แพ็คเก็ตนี้เป็นการตอบสนองต่อแพ็คเก็ต Ping ที่เชื่อมต่อ
| สนาม | พิมพ์ | ความเอนเอียง | บันทึก |
|---|---|---|---|
| รหัสประจำตัว | Uint8 | N/A | ตัวระบุที่ไม่ซ้ำกันของแพ็กเก็ต |
| ClientSendTime | uint64 | endian ใหญ่ | การประทับเวลาของลูกค้าจาก PING |
| เซิร์ฟเวอร์ | uint64 | endian ใหญ่ | การประทับเวลาเซิร์ฟเวอร์ที่ใช้ในการคำนวณเวลาแฝง |
แพ็คเก็ตนี้ใช้เพื่อเริ่มกระบวนการจับมือกันระหว่างไคลเอนต์และเซิร์ฟเวอร์
| สนาม | พิมพ์ | ความเอนเอียง | บันทึก |
|---|---|---|---|
| รหัสประจำตัว | Uint8 | N/A | ตัวระบุที่ไม่ซ้ำกันของแพ็กเก็ต |
| เวทมนตร์ | uint8 [16] | N/A | ลำดับวิเศษเพื่อระบุแพ็กเก็ต |
| การออกเสียง | Uint8 | N/A | เวอร์ชันโปรโตคอลที่ลูกค้ารองรับ |
| mtusize | Pad-with-Zero | N/A | ขนาดหน่วยส่งสูงสุด (MTU) ของไคลเอนต์ |
เมื่อใช้ Pad-With-Zero ให้เพิ่มขนาด MTU ตำแหน่งการอ่านปัจจุบันบวก 28 (ขนาดส่วนหัว UDP) สำหรับการอ่าน สำหรับการเขียนให้ได้ขนาด MTU ที่ถูกลบออกด้วยตำแหน่งการเขียนบัฟเฟอร์ปัจจุบัน (หรือขนาดของมัน) บวก 28 (ขนาดส่วนหัว UDP) บวกกับขนาดบัฟเฟอร์ปัจจุบัน ในการตรวจสอบความถูกต้องของบัฟเฟอร์แพ็คเก็ตให้ตรวจสอบว่าขนาดของมันคือ 28 (ขนาดส่วนหัว UDP) บวกกับขนาดบัฟเฟอร์ปัจจุบัน
แพ็คเก็ตนี้คือการตอบสนองต่อคำขอการเชื่อมต่อแบบเปิดหนึ่งแพ็คเก็ต
| สนาม | พิมพ์ | ความเอนเอียง | บันทึก |
|---|---|---|---|
| รหัสประจำตัว | Uint8 | N/A | ตัวระบุที่ไม่ซ้ำกันของแพ็กเก็ต |
| เวทมนตร์ | uint8 [16] | N/A | ลำดับวิเศษเพื่อระบุแพ็กเก็ต |
| ServerGuid | uint64 | endian ใหญ่ | ตัวระบุที่ไม่ซ้ำกันสำหรับเซิร์ฟเวอร์ |
| Serverhassecurity | บูล | N/A | ไม่ว่าเซิร์ฟเวอร์จะต้องมีความปลอดภัยหรือไม่ |
| mtusize | Uint16 | endian ใหญ่ | ขนาดหน่วยส่งสูงสุด (MTU) ของเซิร์ฟเวอร์ |
แพ็คเก็ตนี้คือการตอบสนองต่อคำขอการเชื่อมต่อแบบเปิดหนึ่งแพ็คเก็ตพร้อมข้อมูลความปลอดภัยเพิ่มเติม
| สนาม | พิมพ์ | ความเอนเอียง | บันทึก |
|---|---|---|---|
| รหัสประจำตัว | Uint8 | N/A | ตัวระบุที่ไม่ซ้ำกันของแพ็กเก็ต |
| เวทมนตร์ | uint8 [16] | N/A | ลำดับวิเศษเพื่อระบุแพ็กเก็ต |
| ServerGuid | uint64 | endian ใหญ่ | ตัวระบุที่ไม่ซ้ำกันสำหรับเซิร์ฟเวอร์ |
| Serverhassecurity | บูล | N/A | ไม่ว่าเซิร์ฟเวอร์จะต้องมีความปลอดภัยหรือไม่ |
| hascookie | บูล | N/A | แพ็คเก็ตมีคุกกี้หรือไม่ |
| คุกกี้ | uint32 | endian ใหญ่ | ค่าคุกกี้ |
| Serverpublickey | uint8 [294] | N/A | คีย์สาธารณะที่ใช้สำหรับการเข้ารหัส |
| mtusize | Uint16 | endian ใหญ่ | ขนาดหน่วยส่งสูงสุด (MTU) ของเซิร์ฟเวอร์ |
แพ็คเก็ตนี้ใช้เพื่อทำกระบวนการจับมือกันระหว่างไคลเอนต์และเซิร์ฟเวอร์ให้เสร็จสมบูรณ์
| สนาม | พิมพ์ | ความเอนเอียง | บันทึก |
|---|---|---|---|
| รหัสประจำตัว | Uint8 | N/A | ตัวระบุที่ไม่ซ้ำกันของแพ็กเก็ต |
| เวทมนตร์ | uint8 [16] | N/A | ลำดับวิเศษเพื่อระบุแพ็กเก็ต |
| Serveraddress | uint8 [7-29] | N/A | ที่อยู่ IP ของเซิร์ฟเวอร์และพอร์ตคอมโบ |
| mtusize | Uint16 | endian ใหญ่ | ขนาดหน่วยส่งสูงสุด (MTU) ของไคลเอนต์ |
| ลูกค้า | uint64 | endian ใหญ่ | ตัวระบุที่ไม่ซ้ำกันสำหรับลูกค้า |
แพ็คเก็ตนี้ใช้เพื่อทำกระบวนการจับมือกันระหว่างไคลเอนต์และเซิร์ฟเวอร์ให้เสร็จสมบูรณ์
| สนาม | พิมพ์ | ความเอนเอียง | บันทึก |
|---|---|---|---|
| รหัสประจำตัว | Uint8 | N/A | ตัวระบุที่ไม่ซ้ำกันของแพ็กเก็ต |
| เวทมนตร์ | uint8 [16] | N/A | ลำดับวิเศษเพื่อระบุแพ็กเก็ต |
| คุกกี้ | uint32 | endian ใหญ่ | ค่าคุกกี้ |
| CONTASSCHALLENGE | บูล | N/A | ไม่ว่าระบบจะต้องใช้ความท้าทายในการจับมือกัน |
| ท้าทาย | uint8 [64] | N/A | ไบต์การจับมือกันของระบบ |
| Serveraddress | uint8 [7-29] | N/A | ที่อยู่ IP ของเซิร์ฟเวอร์และพอร์ตคอมโบ |
| mtusize | Uint16 | endian ใหญ่ | ขนาดหน่วยส่งสูงสุด (MTU) ของไคลเอนต์ |
| ลูกค้า | uint64 | endian ใหญ่ | ตัวระบุที่ไม่ซ้ำกันสำหรับลูกค้า |
หมายเหตุ: หากแพ็คเก็ต OpenConnectionRepleNone มีความปลอดภัย แต่แพ็คเก็ตนี้ไม่มีความท้าทายไคลเอนต์ควรส่งแพ็คเก็ต RemotesystemRepublickey ทันทีเพื่อแจ้งเซิร์ฟเวอร์ว่าไม่มีความท้าทายในแพ็กเก็ต OpenConnectionRequesttwo
คุณสามารถเขียนวิธีการคำนวณผลการเชื่อมต่อของคุณเอง แต่ด้านล่างนี้เป็นวิธีมาตรฐาน
การคำนวณการเชื่อมต่อเอารายงาน :
bitwise and เพื่อตรวจสอบว่าจำเป็นต้องตรวจสอบด้านล่างโดยใช้ contains address และ contains guid หรือไม่clientGuid เชื่อมโยงกับไคลเอนต์ที่มีที่อยู่ไคลเอนต์ที่แตกต่างกันให้ตั้งสถานะการเชื่อมต่อเป็น 3clientGuid ที่แตกต่างกันแล้วให้ตั้งสถานะการเชื่อมต่อเป็น 4เมื่อคุณคำนวณผล
ConnectionOutcomeคุณจะต้องตรวจสอบว่ามันเท่ากับ 1 จากนั้นส่งแพ็กเก็ตOpenConnectionReplyTwoหรือไม่
หาก
ConnectionOutcomeไม่ใช่ 0 ให้ส่งแพ็กเก็ตAlreadyConnected
แพ็คเก็ตนี้คือการตอบสนองต่อคำขอการเชื่อมต่อแบบเปิดสองแพ็คเก็ต
| สนาม | พิมพ์ | ความเอนเอียง | บันทึก |
|---|---|---|---|
| รหัสประจำตัว | Uint8 | N/A | ตัวระบุที่ไม่ซ้ำกันของแพ็กเก็ต |
| เวทมนตร์ | uint8 [16] | N/A | ลำดับวิเศษเพื่อระบุแพ็กเก็ต |
| ServerGuid | uint64 | endian ใหญ่ | ตัวระบุที่ไม่ซ้ำกันสำหรับเซิร์ฟเวอร์ |
| clientAddress | uint8 [7-29] | N/A | ที่อยู่ IP ไคลเอนต์และพอร์ตคอมโบ |
| mtusize | Uint16 | endian ใหญ่ | ขนาดหน่วยส่งสูงสุด (MTU) ของเซิร์ฟเวอร์ |
| ต้องการ | นิดหน่อย | N/A | ไม่ว่าการเชื่อมต่อจะต้องมีการเข้ารหัสหรือไม่ |
| การเข้ารหัส | uint8 [128] | N/A | คีย์การเข้ารหัสของไคลเอนต์ - มันถูกเขียนหรืออ่านเฉพาะหากฟิลด์ requiresEncryption กำหนดค่าเป็นจริง |
แพ็คเก็ตนี้ใช้เพื่อสร้างการเชื่อมต่อระหว่างไคลเอนต์และเซิร์ฟเวอร์ที่เปิดใช้งานหรือปิดใช้งานความปลอดภัย
| สนาม | พิมพ์ | ความเอนเอียง | บันทึก |
|---|---|---|---|
| รหัสประจำตัว | Uint8 | N/A | ตัวระบุที่ไม่ซ้ำกันของแพ็กเก็ต |
| ลูกค้า | uint64 | endian ใหญ่ | ตัวระบุที่ไม่ซ้ำกันสำหรับลูกค้า |
| ClientSendTime | uint64 | endian ใหญ่ | การประทับเวลาของลูกค้าเมื่อมีการร้องขอให้เชื่อมต่อ |
| ความปลอดภัย | บูล | N/A | ไม่ว่าการเชื่อมต่อจะต้องมีความปลอดภัยหรือไม่ |
| ทนต่อลูกค้า | uint8 [32] | N/A | หลักฐานการรับรองความถูกต้องของลูกค้า |
| ความเป็นไปได้ | บูล | N/A | ไม่ว่าแพ็คเก็ตจะต้องมีการพิสูจน์ตัวตนหรือไม่ |
| IdentityProof | uint8 [294] | N/A | หลักฐานการระบุตัวตนของลูกค้า |
หมายเหตุ: หากการพิสูจน์ตัวตนนั้นไม่ถูกต้องและตั้งค่า
doIdentityให้เป็นจริงให้ส่งแพ็คเก็ตRemoteSystemRequiresPublicKeyทันทีที่มี ID ประเภทของClientIdentityIsInvalidหากdoIdentityถูกตั้งค่าเป็นเท็จและไม่มีหลักฐานการระบุตัวตนให้ส่งแพ็กเก็ตRemoteSystemRequiresPublicKeyที่มี ID ประเภทของClientIdentityIsMissing
แพ็คเก็ตนี้ใช้เพื่อโยนข้อผิดพลาดที่เกี่ยวข้องกับคำขอคีย์สาธารณะสำหรับการตรวจสอบสิทธิ์ไคลเอนต์และการระบุตัวตน
| สนาม | พิมพ์ | ความเอนเอียง | บันทึก |
|---|---|---|---|
| รหัสประจำตัว | Uint8 | N/A | ตัวระบุที่ไม่ซ้ำกันของแพ็กเก็ต |
| เป็นตัวพิมพ์ใหญ่ | Uint8 | N/A | ประเภทของคำขอคีย์สาธารณะ |
| ชื่อ | รหัสประจำตัว |
|---|---|
| ServerPublickeyismissing | 0 |
| ลูกค้า | 1 |
| clientidentityisinvalid | 2 |
แพ็คเก็ตนี้จะถูกส่งเมื่อเซิร์ฟเวอร์ไม่จำเป็นต้องมีความปลอดภัย แต่ก็ยังบังคับ
| สนาม | พิมพ์ | ความเอนเอียง | บันทึก |
|---|---|---|---|
| รหัสประจำตัว | Uint8 | N/A | ตัวระบุที่ไม่ซ้ำกันของแพ็กเก็ต |
| clientAddress | uint8 [7-29] | N/A | ที่อยู่ IP ไคลเอนต์และพอร์ตคอมโบ |
| ServerGuid | uint64 | endian ใหญ่ | ตัวระบุที่ไม่ซ้ำกันสำหรับเซิร์ฟเวอร์ |
แพ็คเก็ตนี้จะถูกส่งเมื่อความพยายามนับพยายามเข้าร่วมเซิร์ฟเวอร์สูงกว่าจำนวนที่กำหนด (ขึ้นอยู่กับการใช้งานของคุณ) หรือไคลเอนต์ไม่มีที่อยู่ที่ได้รับมอบหมาย นี่คือสิ่งที่คุณตรวจสอบและส่งหากเป็นไปตามข้อกำหนดก่อนที่จะส่งแพ็คเก็ต OpenConnectionRequestOne
| สนาม | พิมพ์ | ความเอนเอียง | บันทึก |
|---|---|---|---|
| รหัสประจำตัว | Uint8 | N/A | ตัวระบุที่ไม่ซ้ำกันของแพ็กเก็ต |
แพ็คเก็ตนี้จะถูกส่งเมื่อไคลเอนต์เชื่อมต่ออยู่แล้ว
| สนาม | พิมพ์ | ความเอนเอียง | บันทึก |
|---|---|---|---|
| รหัสประจำตัว | Uint8 | N/A | ตัวระบุที่ไม่ซ้ำกันของแพ็กเก็ต |
| เวทมนตร์ | uint8 [16] | N/A | ลำดับวิเศษเพื่อระบุแพ็กเก็ต |
| ลูกค้า | uint64 | endian ใหญ่ | ตัวระบุที่ไม่ซ้ำกันสำหรับลูกค้า |
แพ็คเก็ตนี้เป็นการตอบสนองต่อคำขอการเชื่อมต่อที่เปิดใช้งานความปลอดภัย
| สนาม | พิมพ์ | ความเอนเอียง | บันทึก |
|---|---|---|---|
| รหัสประจำตัว | Uint8 | N/A | ตัวระบุที่ไม่ซ้ำกันของแพ็กเก็ต |
| clientAddress | uint8 [7-29] | N/A | ที่อยู่ IP ไคลเอนต์และพอร์ตคอมโบ |
| clientIndex | Uint16 | endian ใหญ่ | ตัวระบุที่ไม่ซ้ำกันที่กำหนดให้กับลูกค้า |
| ServerMachineAddresses | ที่อยู่ [10] | N/A | ที่อยู่เครื่องเซิร์ฟเวอร์ท้องถิ่น |
| ClientSendTime | uint64 | endian ใหญ่ | การประทับเวลาสำหรับลูกค้า |
| เซิร์ฟเวอร์ | uint64 | endian ใหญ่ | การประทับเวลาสำหรับเซิร์ฟเวอร์ |
แพ็คเก็ตนี้จะถูกส่งไปยังไคลเอนต์อื่น ๆ ทั้งหมดเมื่อไคลเอนต์ใหม่เชื่อมต่อกับเซิร์ฟเวอร์
| สนาม | พิมพ์ | ความเอนเอียง | บันทึก |
|---|---|---|---|
| รหัสประจำตัว | Uint8 | N/A | ตัวระบุที่ไม่ซ้ำกันของแพ็กเก็ต |
| Serveraddress | uint8 [7-29] | N/A | ที่อยู่ IP ของเซิร์ฟเวอร์และพอร์ตคอมโบ |
| clientmachineaddresses | ที่อยู่ [10] | N/A | ที่อยู่เครื่องในท้องถิ่นของไคลเอนต์ |
| ClientSendTime | uint64 | endian ใหญ่ | การประทับเวลาสำหรับลูกค้า |
| เซิร์ฟเวอร์ | uint64 | endian ใหญ่ | การประทับเวลาสำหรับเซิร์ฟเวอร์ |
หลังจากที่คุณส่งหรือรับแพ็คเก็ตนี้ไปยังเซิร์ฟเวอร์คุณจะต้องให้การเชื่อมต่อมีชีวิตอยู่โดยการส่งแพ็คเก็ต ConnectedPing เป็นระยะ แพ็คเก็ตเหล่านี้เป็นวิธีที่จะพูดว่า "เฮ้ฉันยังอยู่ที่นี่และเชื่อมต่อกับเซิร์ฟเวอร์" เซิร์ฟเวอร์ยังส่งแพ็คเก็ต ConnectedPong กลับมาตอบสนองเพื่อยืนยันว่าการเชื่อมต่อยังคงทำงานอยู่ กระบวนการปิงปองนี้ช่วยป้องกันไม่ให้การเชื่อมต่อหมดเวลาเนื่องจากปัญหาการไม่ใช้งานหรือเครือข่าย
แพ็คเก็ตนี้จะถูกส่งเมื่อไคลเอนต์ตัดการเชื่อมต่อจากเซิร์ฟเวอร์
| สนาม | พิมพ์ | ความเอนเอียง | บันทึก |
|---|---|---|---|
| รหัสประจำตัว | Uint8 | N/A | ตัวระบุที่ไม่ซ้ำกันของแพ็กเก็ต |
แพ็คเก็ตนี้จะถูกส่งเมื่อการเชื่อมต่อกับไคลเอนต์หายไป
| สนาม | พิมพ์ | ความเอนเอียง | บันทึก |
|---|---|---|---|
| รหัสประจำตัว | Uint8 | N/A | ตัวระบุที่ไม่ซ้ำกันของแพ็กเก็ต |
| ลูกค้า | uint64 | endian ใหญ่ | ตัวระบุที่ไม่ซ้ำกันสำหรับลูกค้า |
| clientAddress | uint8 [7-29] | N/A | ที่อยู่ IP ไคลเอนต์และพอร์ตคอมโบ |
แพ็คเก็ตนี้จะถูกส่งเมื่อไคลเอนต์พยายามเชื่อมต่อกับเซิร์ฟเวอร์ด้วยรุ่นโปรโตคอลที่เข้ากันไม่ได้
| สนาม | พิมพ์ | ความเอนเอียง | บันทึก |
|---|---|---|---|
| รหัสประจำตัว | Uint8 | N/A | ตัวระบุที่ไม่ซ้ำกันของแพ็กเก็ต |
| การออกเสียง | Uint8 | N/A | เวอร์ชันโปรโตคอลที่รองรับโดยเซิร์ฟเวอร์ |
| เวทมนตร์ | uint8 [16] | N/A | ลำดับวิเศษเพื่อระบุแพ็กเก็ต |
| ServerGuid | uint64 | endian ใหญ่ | ตัวระบุที่ไม่ซ้ำกันสำหรับเซิร์ฟเวอร์ |
แพ็คเก็ตนี้ใช้สำหรับการส่งและรับข้อมูลระหว่างลูกค้าและเซิร์ฟเวอร์ มันอาจเป็นหนึ่งในสามประเภท: ValidDatagram, AckedDatagram หรือ NackedDatagram
| สนาม | พิมพ์ | ความเอนเอียง | บันทึก |
|---|---|---|---|
| isvalid | นิดหน่อย | N/A | จริงเสมอ |
| isack | นิดหน่อย | N/A | ถ้าเป็นจริงแพ็คเก็ตจะเป็น ackeddatagram |
| isnack | นิดหน่อย | N/A | ถ้าเป็นจริงแพ็คเก็ตจะเป็น nackeddatagram |
หาก
isAckและisNackเป็นทั้งเท็จแพ็กเก็ตเป็น ValidDatagram
แพ็คเก็ตนี้เป็นการตอบสนองต่อ ValidDatagram ที่ระบุว่าเซิร์ฟเวอร์ได้รับข้อมูล
| สนาม | พิมพ์ | ความเอนเอียง | บันทึก |
|---|---|---|---|
| ต้องใช้สายรัด | นิดหน่อย | N/A | หากเป็นจริงแพ็คเก็ตจะรวม B และเป็นค่า |
| ข | ลอย | endian ใหญ่ | ไม่ได้ใช้ |
| เช่น | ลอย | endian ใหญ่ | อัตราการมาถึงข้อมูล |
| ช่วง | พิสัย | N/A | อาร์เรย์ของค่าช่วงที่ได้รับ |
แพ็คเก็ตนี้เป็นการตอบสนองต่อ ValidDatagram ที่ระบุว่าเซิร์ฟเวอร์ยังไม่ได้รับข้อมูลที่คาดหวังทั้งหมด
| สนาม | พิมพ์ | ความเอนเอียง | บันทึก |
|---|---|---|---|
| ช่วง | พิสัย | N/A | อาร์เรย์ของค่าช่วงที่ไม่ได้รับ |
โครงสร้างนี้ใช้เพื่อแสดงช่วงของ AckedDatagrams และช่วงที่ขาดหายไปของ NackedDatagrams
| สนาม | พิมพ์ | ความเอนเอียง | บันทึก |
|---|---|---|---|
| ขนาด | Uint16 | endian ใหญ่ | จำนวนช่วงในอาร์เรย์ |
| การออก | บูล | N/A | หากขั้นต่ำเท่ากับสูงสุดแล้วจะถูกตั้งค่าเป็นจริง |
| นาที | Uint24 | endian เล็ก ๆ น้อย ๆ | ค่าต่ำสุดในช่วง |
| สูงสุด | Uint24 | endian เล็ก ๆ น้อย ๆ | ค่าสูงสุดในช่วง - ไม่ได้เขียนหากเป็นโสด |
แพ็คเก็ตนี้ใช้สำหรับการส่งและรับข้อมูลระหว่างลูกค้าและเซิร์ฟเวอร์
| สนาม | พิมพ์ | ความเอนเอียง | บันทึก |
|---|---|---|---|
| IspacketPair | นิดหน่อย | N/A | ถ้าเป็นจริงแพ็คเก็ตเป็นหนึ่งในสองแพ็คเก็ตที่เกี่ยวข้อง |
| iscontinuoussend | นิดหน่อย | N/A | ถ้าเป็นจริงแพ็คเก็ตจะเป็นแพ็กเก็ตส่งต่อเนื่อง |
| ต้องใช้สายรัด | นิดหน่อย | N/A | หากเป็นจริงแพ็คเก็ตจะรวม B และเป็นค่า |
| รันกูนัม | Uint24 | endian เล็ก ๆ น้อย ๆ | หมายเลขลำดับของดาต้าแกรม |
| แคปซูล | DataGramcapsule [] | N/A | อาร์เรย์ของแคปซูลในแพ็คเก็ต |
การตรวจสอบช่องทางการจัดเรียงที่เสียหาย : (ดาตาแกรมที่ถูกต้องจะต้องได้รับการจัดลำดับและจัดเรียง (ไม่มีใบเสร็จรับเงิน ACK))
หาก arrangmentChannel มีมากขึ้นหรือเท่ากับจำนวนสตรีมที่มีการจัดเรียงซึ่งคือ 2 ^ 5 ดังนั้นมันจะถูก correupted (ข้ามและทำสิ่งที่จำเป็น)
การจัดเรียงดาตาแกรมที่ถูกต้องทุกประเภทของค่าอาร์เรย์สูงสุดคือจำนวนสตรีมที่จัดเรียงและต้องไม่มากขึ้นหรือเท่ากับ
การค้นหาจำนวนหลุมในดาต้าแกรมที่ได้รับ : (ดาตาแกรมที่ถูกต้องจะต้อง Reliable or in sequence ก่อนดำเนินการต่อไป)
คุณจะต้องตรวจสอบจำนวนหลุมในฐานข้อมูลที่ถูกต้องที่ Reliable or in sequence และเหตุผลคือการตรวจสอบคำสั่งซื้อของพวกเขาและทำหน้าที่เป็นเช็คว่ามีดาต้าแก rangeNumber ที่ถูกต้องที่หายไปหรือไม่
receivedPacketsBaseIndex : เพิ่มขึ้นเฉพาะในกรณีที่ Datagram ที่ถูก Reliable or in sequence
receivedPacketQueue : มันเป็นสิ่งที่เก็บ rangeNumber ของ datagram ที่ถูกต้องเป็นกุญแจสำคัญในรายการและค่าของมันเป็นจริงไม่ใช่ดาต้าแกรมมันอาจเป็นเท็จ แต่หลังจากพบ coditions DS_Queue อย่างที่จะระบุไว้ด้านล่าง
ในการค้นหาการนับจำนวนหลุมลบ rangeNumber ของ Datagenumb ที่ได้รับในปัจจุบันพร้อมกับ receivedPacketsBaseIndex และคุณสมบัติที่เพิ่มขึ้นทุกครั้งที่ไม่มีจำนวนหลุม ( receivedPacketsBaseIndex เพิ่มขึ้นหาก Reliable or in sequence )
receivedPacketQueue หากมีอยู่และเพิ่ม (ล่วงหน้า) เพิ่มขึ้น receivedPacketsBaseIndexuint24 ที่ถูก bitwise right shifted โดย 1 แล้วมันเป็นแพ็คเก็ตที่ซ้ำกัน (ข้ามและทำสิ่งที่จำเป็น)receivedPacketQueuereceivedPacketQueue และไม่เท็จเท็จแล้วเติมหลุมโดยแทนที่คีย์ของจำนวนหลุมใน receivedPacketQueue ด้วยคีย์ว่าค่าเท่ากับเท็จหากเงื่อนไขเหล่านี้ระบุไว้ไม่พบแล้ว:
bitwise and ค่า uint32 สูงสุดหากจำเป็น) มากกว่าขนาด receivedPacketQueue แล้วเติมด้วยการผลักค่าที่แท้จริงในคิว หลังจากนั้นคุณสามารถสร้างลูปและตรวจสอบว่าขนาดของ receivedPacketQueue มากกว่า 0 และค่าแรกของ receivedPacketQueue นั้นเป็นเท็จจากนั้นลบองค์ประกอบสุดท้ายของ receivedPacketQueue จากนั้นเพิ่ม receivedPacketsBaseIndex
หลังจากนั้นคุณสามารถจัดการกับดาตาแกรมที่ถูกต้องได้ตามปกติ
โครงสร้างนี้แสดงถึงแคปซูลใน ValidDatagram
| สนาม | พิมพ์ | ความเอนเอียง | บันทึก |
|---|---|---|---|
| ความน่าเชื่อถือ | 3 บิต | endian ใหญ่ | ประเภทของความน่าเชื่อถือที่ใช้ |
| ถูกต้อง | นิดหน่อย | N/A | ถ้าเป็นจริงแพ็คเก็ตจะถูกแบ่งส่วน |
| ขนาด | Uint16 | endian ใหญ่ | ขนาดของฟิลด์บัฟเฟอร์ลงในบิต |
| Reliablecapsuleindex | Uint24 | endian เล็ก ๆ น้อย ๆ | ดัชนีที่ใช้สำหรับแพ็คเก็ตที่เชื่อถือได้ (หมายถึงใช้ความน่าเชื่อถือสำหรับสิ่งนี้) |
| SequencedCapsuleIndex | Uint24 | endian เล็ก ๆ น้อย ๆ | ดัชนีที่ใช้สำหรับแพ็คเก็ตที่มีลำดับ (หมายถึงใช้ความน่าเชื่อถือสำหรับสิ่งนี้) |
| การจัดเตรียม | capsurearrangement | N/A | การจัดเรียงแคปซูลที่ใช้สำหรับแพ็คเก็ตที่จัดลำดับและจัดเรียง (หมายถึงใช้ความน่าเชื่อถือสำหรับสิ่งนี้) |
| ส่วน | แคปซัลเซิล | N/A | ส่วนของแคปซูลที่ใช้เมื่อมีการแบ่งส่วนแคปซูล |
| บัฟเฟอร์ | บัฟเฟอร์ | N/A | ข้อมูลบัฟเฟอร์ที่มีข้อมูลต้องการส่งผ่านเครือข่าย |
โครงสร้างนี้แสดงถึงการจัดเรียงของแคปซูลใน ValidDatagram
| สนาม | พิมพ์ | ความเอนเอียง | บันทึก |
|---|---|---|---|
| จัดเรียง capsuleindex | Uint24 | endian เล็ก ๆ น้อย ๆ | ดัชนีของแคปซูลที่จัดเรียง |
| การจัดเรียง Channel | Uint8 | N/A | ช่องที่ใช้สำหรับการจัดเรียง |
โครงสร้างนี้แสดงถึงการแบ่งส่วนของแคปซูลใน ValidDatagram
| สนาม | พิมพ์ | ความเอนเอียง | บันทึก |
|---|---|---|---|
| ขนาด | uint32 | endian ใหญ่ | ขนาดของเซ็กเมนต์ |
| รหัสประจำตัว | Uint16 | endian ใหญ่ | ตัวระบุที่ไม่ซ้ำกันที่เกี่ยวข้องกับเซ็กเมนต์ |
| ดัชนี | uint32 | endian ใหญ่ | ดัชนีของเซ็กเมนต์ |
แต่ละดาตาแกรมที่ส่งใน Raknet จะได้รับการกำหนดความน่าเชื่อถือ TypeID ที่ระบุวิธีการจัดการข้อมูลโดยโปรโตคอล ตารางต่อไปนี้แสดงรายการ TydeID ความน่าเชื่อถือที่มีอยู่และคุณสมบัติของพวกเขา:
| ชื่อ | รหัสประจำตัว | เชื่อถือได้ | ถูกจัดเรียง | เป็นลำดับ | ลักษณะ/คุณสมบัติ |
|---|---|---|---|---|---|
| ไม่น่าเชื่อถือ | 0 | เลขที่ | เลขที่ | เลขที่ | ความน่าเชื่อถือ TydeID นี้ส่งดาต้าแกรมโดยไม่มีการรับประกันว่าพวกเขาจะมาถึงปลายทาง พวกเขาไม่รับประกันว่าจะจัดส่งตามลำดับใด ๆ หรือเลย |
| unreliablesequenced | 1 | เลขที่ | ใช่ | ใช่ | ความน่าเชื่อถือ TydeID นี้จะส่งดาต้าแกรมโดยไม่มีการรับประกันว่าพวกเขาจะมาถึงปลายทาง แต่ทำให้มั่นใจได้ว่าพวกเขาจะถูกส่งตามลำดับที่พวกเขาถูกส่ง |
| เชื่อถือได้ | 2 | ใช่ | เลขที่ | เลขที่ | ความน่าเชื่อถือ TydeID นี้ส่งดาต้าแกรมรับประกันว่าจะส่งตามลำดับที่ถูกส่ง หากดาตาแกรมหายไป raknet จะส่งสัญญาณใหม่จนกว่าจะได้รับการยอมรับจากผู้รับ |
| มีความน่าเชื่อถือ | 3 | ใช่ | ใช่ | เลขที่ | ความน่าเชื่อถือ TydeID นี้ส่งดาต้าแกรมรับประกันว่าจะส่งตามลำดับที่ถูกส่ง หากดาตาแกรมหาย |
| เชื่อถือได้ | 4 | ใช่ | ใช่ | ใช่ | ความน่าเชื่อถือ TydeID นี้จะส่งดาต้าแกรมรับประกันว่าจะส่งตามลำดับที่ถูกส่งและตรวจสอบให้แน่ใจว่าพวกเขาจะถูกส่งตามลำดับ |
| ไม่น่าเชื่อถือพร้อมกับการรับ | 5 | เลขที่ | เลขที่ | เลขที่ | ความน่าเชื่อถือนี้ TydeID ส่งดาต้าแกรมโดยไม่มีการรับประกันใด ๆ ว่าพวกเขาจะมาถึงปลายทาง แต่ตัวรับสัญญาณจะส่งใบเสร็จรับเงินตอบรับเมื่อได้รับดาตาแกรมนี้ |
| เชื่อถือได้ | 6 | ใช่ | เลขที่ | เลขที่ | ความน่าเชื่อถือนี้ TydeID ส่งดาต้าแกรมรับประกันว่าจะส่งตามลำดับที่พวกเขาถูกส่งและผู้รับส่งใบเสร็จรับเงินรับทราบเมื่อได้รับข้อมูลนี้ |
| ReliablearRangedWithUtackReceipt | 7 | ใช่ | ใช่ | เลขที่ | ความน่าเชื่อถือ TydeID นี้จะส่งดาตาแกรมรับประกันว่าจะส่งตามลำดับที่ถูกส่ง แต่ดาตาแกรมทั้งหมดก่อนที่จะไม่ได้รับการยอมรับ |
ที่นี่คุณสามารถค้นหาคำจำกัดความความน่าเชื่อถือทุกอย่างที่ใช้ในสถานที่อื่น ๆ ในเอกสาร
Sequenced และจัดเรียงที่เชื่อถือได้และจัดเรียงที่เชื่อถือได้ด้วย ack recepitRaknet ใช้การส่งซ้ำแบบเลือกซ้ำเพื่อให้แน่ใจว่าการส่งมอบข้อมูลที่เชื่อถือได้ เมื่อมีการส่งดาต้าแกรมจะถูกกำหนดหมายเลขลำดับ หากดาต้าแกรมไม่ได้รับการยอมรับภายในระยะเวลาที่กำหนดเวลาหนึ่ง Raknet จะส่งดาต้าแกรมโดยใช้หมายเลขลำดับเดียวกันอีกครั้ง เมื่อตัวรับสัญญาณได้รับข้อมูลซ้ำที่มีหมายเลขลำดับเดียวกันมันสามารถยกเลิกได้เนื่องจากได้รับทราบหมายเลขลำดับนั้นแล้ว
Ackqueue และ Nackqueue ใช้เพื่อติดตามว่าดาตาแกรมใดได้รับการยอมรับและไม่ได้ Ackqueue เก็บรายการหมายเลขลำดับดาต้าแกรมที่ได้รับการยอมรับสำเร็จในขณะที่ Nackqueue เก็บรายการหมายเลขลำดับดาต้าแกรมที่ยังไม่ได้รับการยอมรับและจำเป็นต้องได้รับการส่งสัญญาณใหม่ เมื่อได้รับดาตาแกรมด้วยหมายเลขลำดับที่ได้รับการยอมรับแล้วก็สามารถยกเลิกได้
PacketPair เป็นเทคนิคที่ใช้โดย Raknet เพื่อปรับปรุงประสิทธิภาพของ DataGram retransmissions เมื่อได้รับการยอมรับดาตาแกรม Raknet จะส่งดาต้าแกรมถัดไปในลำดับเช่นกัน สิ่งนี้ช่วยให้ผู้รับสามารถเริ่มประมวลผลข้อมูลถัดไปได้ทันทีลดเวลาแฝงและปรับปรุงปริมาณงาน
ENCTENUYSEND เป็นคุณลักษณะของ RAKNET ที่อนุญาตให้ส่งดาต้าแกรมอย่างต่อเนื่องโดยไม่ต้องรอรับการตอบรับ สิ่งนี้สามารถปรับปรุงประสิทธิภาพในบางกรณี แต่ยังสามารถนำไปสู่การสูญเสียแพ็คเก็ตและการส่งสัญญาณซ้ำเนื่องจากผู้ส่งไม่รอข้อเสนอแนะก่อนที่จะส่งดาต้าแกรมถัดไป
Raknet ใช้กลไกการประกอบใหม่เพื่อสร้างดาต้าแกรมที่แบ่งส่วนซึ่งอาจได้รับตามลำดับ เมื่อมีการแบ่งส่วนดาต้าแกรมแต่ละเซ็กเมนต์จะถูกกำหนดตัวระบุที่ไม่ซ้ำกัน เมื่อผู้รับได้รับส่วนจะถูกบัฟเฟอร์จนกว่าจะได้รับส่วนทั้งหมดที่มีตัวระบุเดียวกัน เมื่อได้รับทุกส่วนแล้วพวกเขาจะถูกรวมเข้ากับดาต้าแกรมดั้งเดิม
การควบคุมการไหลเป็นกลไก Raknet ที่ใช้ในการจัดการอัตราการส่งข้อมูลระหว่างผู้ส่งและตัวรับสัญญาณ ช่วยให้มั่นใจได้ว่าตัวรับสัญญาณสามารถจัดการข้อมูลที่เข้ามาได้ด้วยความเร็วที่สามารถดำเนินการได้ป้องกันไม่ให้บัฟเฟอร์ของตัวรับสัญญาณล้น การควบคุมการไหลช่วยรักษาความสมดุลระหว่างความเร็วในการส่งของผู้ส่งและความสามารถในการประมวลผลของผู้รับโดยเพิ่มประสิทธิภาพโดยรวมและความเสถียรของการสื่อสาร
Congestion Manager มีการควบคุมความแออัดตรวจสอบหมายเลขช่วงข้ามเพื่อส่ง Nacks และสิ่งอื่น ๆ
TODO: เพิ่มเอกสาร
การควบคุมความแออัดเป็นเทคนิค Raknet ที่ใช้เพื่อป้องกันความแออัดของเครือข่ายโดยการปรับสมดุลอัตราการส่งข้อมูล เทคนิคเช่นการควบคุมความแออัดของ TCP, การลดลงของแพ็คเก็ต, การ จำกัด อัตรา, การปรับการจราจร, QoS และการปรับสมดุลโหลด เทคนิคเหล่านี้ช่วยให้มั่นใจได้ว่าการส่งข้อมูลที่เชื่อถือได้และการส่งที่มีประสิทธิภาพใน Raknet
การแบ่งส่วนใน Raknet ช่วยเพิ่มการส่งข้อมูลโดยการแบ่งข้อความขนาดใหญ่ออกเป็นกลุ่มที่เล็กลง ส่วนเหล่านี้โดยมีส่วนหัวที่ระบุตำแหน่งและขนาดทำให้มั่นใจได้ว่าการประกอบใหม่ที่ประสบความสำเร็จในตอนท้ายของผู้รับ โดยการเปรียบเทียบขนาดบัฟเฟอร์กับขนาดเกียร์สูงสุด (MTU) หากบัฟเฟอร์เกิน MTU มันจะถูกแบ่งออกเป็นส่วนสำหรับการส่ง กลไกนี้ใน Raknet ช่วยป้องกันการสูญเสียข้อมูลจัดการน้ำหนักบรรทุกขนาดใหญ่และรับประกันการส่งที่เชื่อถือได้ในแอปพลิเคชันเครือข่าย
"B" แสดงถึงความสามารถในการเชื่อมโยงหรือจำนวนข้อมูลสูงสุดที่สามารถส่งต่อวินาทีผ่านลิงก์เครือข่าย ความสามารถในการเชื่อมโยงถูกกำหนดโดยปัจจัยหลายอย่างรวมถึงโครงสร้างพื้นฐานเครือข่ายการกำหนดค่าเครือข่ายและทรัพยากรที่มีอยู่ ด้วยการใช้ค่าลอยความจุเครือข่ายสามารถแสดงได้อย่างแม่นยำและแม่นยำยิ่งขึ้นทำให้สามารถใช้ประโยชน์จากทรัพยากรที่มีอยู่ได้ดีขึ้น
"As" หมายถึงอัตราการมาถึงของข้อมูลซึ่งเป็นอัตราที่ผู้ส่งสร้างและส่งข้อมูล การใช้ค่าลอยช่วยให้การเป็นตัวแทนของอัตราการมาถึงที่แม่นยำยิ่งขึ้นซึ่งอาจแตกต่างกันไปตามข้อกำหนดของแอปพลิเคชันและเงื่อนไขเครือข่าย โดยการเปรียบเทียบอัตราการมาถึงกับความสามารถในการเชื่อมโยงผู้ส่งสามารถกำหนดจำนวนข้อมูลที่สามารถส่งผ่านลิงก์เครือข่ายโดยไม่ทำให้เกิดความแออัดหรือการลดลงของประสิทธิภาพ
ในการกำหนดขนาดของแคปซูลคุณสามารถทำตามขั้นตอนเหล่านี้:
reliableCapsuleIndexsequencedCapsuleIndexarrangedCapsuleIndex และจากนั้น 1 ขั้นตอนสำหรับ arrangementChannel Channelsize 2 ขั้นตอนสำหรับ id และ 4 ขั้นตอนสำหรับ index ของเซ็กเมนต์ userpacketenum ID คือ 0x86 ซึ่งเป็นจุดเริ่มต้นของจุดเริ่มต้นของจุดที่คุณสามารถเริ่มใช้รหัสแพ็คเก็ตที่กำหนดเองของคุณ
สิ่งที่แนะนำคือการสร้าง PacketAggregator พิจารณาว่าคุณมีการใช้งานที่เสร็จสมบูรณ์แล้วส่งและรับมัน
คุณสามารถใส่ ID ที่คุณเลือกได้เช่น: UserPacketEnumID + ID ของคุณเอง (ต้องไม่ทำให้ UserPacketEnumID เกิน uint8 limit )
ตัวอย่างเช่น: UserPacketEnumID + 22 = 0x9c
โครงสร้างแพ็คเก็ตง่าย ๆ แสดงให้เห็นว่า PacketAggregator สามารถเป็นอย่างไร:
| สนาม | พิมพ์ | ความเอนเอียง | บันทึก |
|---|---|---|---|
| รหัสประจำตัว | Uint8 | N/A | ตัวระบุที่ไม่ซ้ำกันของแพ็กเก็ต |
| การบีบอัด | Uint8 | อัลกอริทึมการบีบอัด [ไม่สามารถเป็นได้, OpenSsl, Zlib, GZIP, Snappy, อะไรก็ได้] | |
| ลำธาร | บัฟเฟอร์ [] | อาร์เรย์ของสตรีมแพ็คเก็ต (แต่ละองค์ประกอบในอาร์เรย์สตรีมแสดงถึงบัฟเฟอร์แพ็คเก็ตซึ่งถูกเข้ารหัส/และจะต้องถอดรหัสในการ compressionAlgorithm ) |
หลังจากนั้นคุณจะส่งมันในบัฟเฟอร์ DataGram Capsule/s ที่ถูกต้อง
ในการส่งแพ็คเก็ตที่ไม่ใช่ Raknet ก่อนอื่นให้ตรวจสอบว่าจำเป็นต้องแบ่งส่วนหรือไม่โดยการเปรียบเทียบว่าขนาดบัฟเฟอร์แคปซูลมากกว่าขนาด MTU ลบ 2 บวก 3 บวกกับ 4 ครั้ง 1 (สำหรับความยาวไบต์ข้อมูลส่วนหัวของดาต้าแกรม) จากนั้นลบค่าที่กำหนดด้วยขนาดแคปซูล หากจำเป็นต้องแบ่งกลุ่มให้เลือกสตรีมของแคปซูลก่อนที่จะเพิ่มลงในคิวดาต้าแกรมสำหรับการส่ง หากไม่จำเป็นต้องแบ่งส่วนให้เพิ่มโดยตรงไปยังคิว โปรดจำไว้ว่าแพ็คเก็ตที่แบ่งส่วนจะต้องไม่น่าเชื่อถือ หากเป็นเช่นนั้นให้แปลงเป็นแพ็กเก็ตที่เชื่อถือได้เพื่อรับประกันการส่งมอบชิ้นส่วนแพ็กเก็ตทั้งหมดที่ประสบความสำเร็จและสั่งซื้อ
วิธีที่จะแบ่งส่วนเป็นส่วน:
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: