這是最新的Raknet協議文檔。它包括有關協議中使用的數據類型的信息以及有關每個數據包及其相關字段的詳細信息。
Todo:修改以使眼睛更好,並刪除很多無用的東西。還可以組織事物,例如1位的枚舉/常數,還可以刪除重複的事物。
本文檔假設您需要類似/相同的安全方法,這就是為什麼如果要定位的服務器沒有libcat或其他任何相同的原因,但是它們也啟用了安全性,客戶端將崩潰,因為它們只會為您提供cookie,沒有身份證明或任何喜歡的東西。但是您可以提取支持這兩種情況的請求。
| 類型 | 尺寸 | 筆記 |
|---|---|---|
| UINT8 | 1字節 | 未簽名的8位整數 |
| UINT16 | 2個字節 | 未簽名的16位整數 |
| Uint24 | 3個字節 | 未簽名的24位整數,最小值為0,最大值為16777215 |
| Uint32 | 4個字節 | 未簽名的32位整數 |
| Uint64 | 4/8字節 | 未簽名的64位整數(32位系統的4個字節,8個字節,用於64位系統) |
| UINT16弦 | 多變的 | UTF-8編碼的字符串,長度為2個字節之前的字符串之前 |
| 魔法 | 16個字節 | 具有特定序列的無符號8位整數的陣列[0x00, 0xFF, 0xFF, 0x00, 0xFE, 0xFE, 0xFE, 0xFE, 0xFD, 0xFD, 0xFD, 0xFD, 0x12, 0x34, 0x56, 0x78] |
| 零件為零 | 多變的 | 空字節用於填充,您選擇的尺寸很大 |
| 布爾 | 1字節 | 編寫或讀取為單個未簽名的8位整數,值為0或1(零用於表示false,而一個用於表示true) |
| 地址 | 7-29字節 | IPv4:1字節(地址版本),4個字節(IP地址),2個字節(端口),IPv6:1字節(地址版本),無符號地址家族的縮寫(小時),端口號無簽名的縮寫,無符號的flow Integer for Flow Infoger,16個字節,地址為16個字節,無標準的Integer for Scope ID。 |
| 位元 | 1位 | 完成緩衝區後,寫或閱讀鑽頭 |
| 漂浮 | 4個字節 | IEEE 754單位浮點數 |
如果您想更快地實施,可以立即定義這些內容,而無需閱讀它們的製作方式。
| 姓名 | 價值 |
|---|---|
| mtusize | 1492 |
| udpheadersize | 28 |
| publickysize | 294 |
| requstchallengize | 64 |
| 響應關聯鍵 | 128 |
| maxnumberoflocaladdresses | 10 |
| 識別型 | 294 |
| 顧客介紹 | 32 |
| DefaultProtolocoLversion | 6 |
| 數字 | 32 |
| 姓名 | ID | 類型 |
|---|---|---|
| 未連接 | 0x01 | 離線 |
| 未連接的培根連接 | 0x02 | 離線 |
| 未連接的龐 | 0x1c | 離線 |
| 連接 | 0x00 | 在線[/到數據報] |
| 連接 | 0x03 | 在線[/到數據報] |
| OpenConnectionRequestone | 0x05 | 離線 |
| OpenConnectionReplyly | 0x06 | 離線 |
| OpenConnectionRequesttwo | 0x07 | 離線 |
| OpenConnectionReplyplytwo | 0x08 | 離線 |
| ConnectionRequest | 0x09 | 在線[/到數據報] |
| 遙控系統RequirespublicKey | 0x0a | 離線 |
| Oursystemrequiressecurity | 0x0b | 兩個都 [? ] |
| ConnectionAttEmptFail | 0x11 | 離線 |
| 已經連接了 | 0x12 | 離線 |
| ConnectionRequestaccept | 0x10 | 在線[/到數據報] |
| 新IncomingConnection | 0x13 | 在線[/到數據報] |
| 斷開指示 | 0x15 | 在線的 |
| ConnectionLost | 0x16 | 兩個都 [? ] |
| 不兼容的交流 | 0x19 | 在線的 |
等待客戶的無關數據包。
等待客戶端的OpenConnectionRequestone數據包。
等待客戶端的OpenConnectionRequesttwo數據包。
等待客戶端的數據報。
將未連接的數據包發送到服務器。
將OpenConnectionRequestone數據包發送到服務器。
將OpenConnectionRequestTwo數據包發送到服務器。
將數據報發送到服務器。
該數據包用於確定服務器是否在線。
| 場地 | 類型 | 伊尼亞語 | 筆記 |
|---|---|---|---|
| Onlyplyplyplynopenconnections | 布爾 | N/A。 | 如果設置為true,則只有在客戶端的連接到服務器當前打開時,服務器才會發送回复。這有助於防止向關閉聯繫的客戶發送響應。該請求的結果消息ID將是UnconnectedPingOpenConnections 。如果設置為false,則標識符無需更改。 |
| ID | UINT8 | N/A。 | 數據包的唯一標識符 |
| 客戶結構時間 | Uint64 | 大恩迪安 | 客戶時間戳用於計算延遲 |
| 魔法 | uint8 [16] | N/A。 | 識別數據包的魔術序列 |
| 客戶端 | Uint64 | 大恩迪安 | 客戶的唯一標識符 |
該數據包是對未連接的PING數據包的響應。
| 場地 | 類型 | 伊尼亞語 | 筆記 |
|---|---|---|---|
| ID | UINT8 | N/A。 | 數據包的唯一標識符 |
| ServerSendTime | Uint64 | 大恩迪安 | 服務器時間戳用於計算延遲 |
| Serverguid | Uint64 | 大恩迪安 | 服務器的唯一標識符 |
| 魔法 | uint8 [16] | N/A。 | 識別數據包的魔術序列 |
| 反應室 | UINT16弦 | 大恩迪安 | 通常用於服務器信息的響應數據 |
該數據包用於使客戶端和服務器之間的連接保持活力。
| 場地 | 類型 | 伊尼亞語 | 筆記 |
|---|---|---|---|
| ID | UINT8 | N/A。 | 數據包的唯一標識符 |
| 客戶結構時間 | Uint64 | 大恩迪安 | 客戶時間戳用於計算延遲 |
該數據包是對連接的PING數據包的響應。
| 場地 | 類型 | 伊尼亞語 | 筆記 |
|---|---|---|---|
| ID | UINT8 | N/A。 | 數據包的唯一標識符 |
| 客戶結構時間 | Uint64 | 大恩迪安 | ping的客戶時間戳 |
| ServerSendTime | Uint64 | 大恩迪安 | 服務器時間戳用於計算延遲 |
該數據包用於啟動客戶端和服務器之間的握手過程。
| 場地 | 類型 | 伊尼亞語 | 筆記 |
|---|---|---|---|
| ID | UINT8 | N/A。 | 數據包的唯一標識符 |
| 魔法 | uint8 [16] | N/A。 | 識別數據包的魔術序列 |
| 協議vers | UINT8 | N/A。 | 客戶支持的協議版本 |
| mtusize | 零件為零 | N/A。 | 客戶的最大傳輸單元(MTU)大小 |
使用零件時,添加到MTU尺寸時,當前的閱讀位置加28(UDP標頭尺寸)進行讀數。對於寫作,請減去MTU大小,並使用當前的緩衝區寫入位置(或其大小)加28(UDP標頭尺寸)加上當前的緩衝區大小。要驗證數據包緩衝區,請檢查其大小是否為28(UDP標頭尺寸)以及當前的緩衝區大小。
該數據包是對一個數據包的打開連接請求的響應。
| 場地 | 類型 | 伊尼亞語 | 筆記 |
|---|---|---|---|
| ID | UINT8 | N/A。 | 數據包的唯一標識符 |
| 魔法 | uint8 [16] | N/A。 | 識別數據包的魔術序列 |
| Serverguid | Uint64 | 大恩迪安 | 服務器的唯一標識符 |
| ServerHassecurity | 布爾 | N/A。 | 服務器是否需要安全性 |
| mtusize | UINT16 | 大恩迪安 | 服務器的最大傳輸單元(MTU)尺寸 |
此數據包是對一個包含其他安全信息的打開連接請求的響應。
| 場地 | 類型 | 伊尼亞語 | 筆記 |
|---|---|---|---|
| ID | UINT8 | N/A。 | 數據包的唯一標識符 |
| 魔法 | uint8 [16] | N/A。 | 識別數據包的魔術序列 |
| Serverguid | Uint64 | 大恩迪安 | 服務器的唯一標識符 |
| ServerHassecurity | 布爾 | N/A。 | 服務器是否需要安全性 |
| Hascookie | 布爾 | N/A。 | 該數據包是否包括cookie |
| 餅乾 | Uint32 | 大恩迪安 | cookie值 |
| ServerPublicKey | UINT8 [294] | N/A。 | 用於加密的公鑰 |
| mtusize | UINT16 | 大恩迪安 | 服務器的最大傳輸單元(MTU)尺寸 |
該數據包用於完成客戶端和服務器之間的握手過程。
| 場地 | 類型 | 伊尼亞語 | 筆記 |
|---|---|---|---|
| ID | UINT8 | N/A。 | 數據包的唯一標識符 |
| 魔法 | uint8 [16] | N/A。 | 識別數據包的魔術序列 |
| ServerAddress | UINT8 [7-29] | N/A。 | 服務器IP地址和端口組合 |
| mtusize | UINT16 | 大恩迪安 | 客戶的最大傳輸單元(MTU)大小 |
| 客戶端 | Uint64 | 大恩迪安 | 客戶的唯一標識符 |
該數據包用於完成客戶端和服務器之間的握手過程。
| 場地 | 類型 | 伊尼亞語 | 筆記 |
|---|---|---|---|
| ID | UINT8 | N/A。 | 數據包的唯一標識符 |
| 魔法 | uint8 [16] | N/A。 | 識別數據包的魔術序列 |
| 餅乾 | Uint32 | 大恩迪安 | cookie值 |
| 包含挑戰 | 布爾 | N/A。 | 系統是否需要握手挑戰 |
| 挑戰 | uint8 [64] | N/A。 | 系統握手挑戰字節 |
| ServerAddress | UINT8 [7-29] | N/A。 | 服務器IP地址和端口組合 |
| mtusize | UINT16 | 大恩迪安 | 客戶的最大傳輸單元(MTU)大小 |
| 客戶端 | Uint64 | 大恩迪安 | 客戶的唯一標識符 |
注意:如果OpenConnectionReplylyone數據包具有安全性,但是該數據包不包含挑戰,則客戶端應立即發送遠程啟動repubrespublickey數據包,以通知服務器在OpenConnectionRequesttwo數據包中沒有挑戰。
您可以編寫自己的計算連接結果的方式,但這是標準方式。
計算連接之路:
bitwise and使用contains address檢查下面的檢查,並contains guid Boolean值。clientGuid已經與具有不同客戶端地址的客戶端關聯,請將連接狀態設置為3。clientGuid關聯,請將連接狀態設置為4。一旦計算了
ConnectionOutcome,您將需要檢查它是否等於1,然後發送OpenConnectionReplyTwo數據包。
如果
ConnectionOutcome不是0,請發送AlreadyConnected數據包。
此數據包是對兩個數據包的打開連接請求的響應。
| 場地 | 類型 | 伊尼亞語 | 筆記 |
|---|---|---|---|
| ID | UINT8 | N/A。 | 數據包的唯一標識符 |
| 魔法 | uint8 [16] | N/A。 | 識別數據包的魔術序列 |
| Serverguid | Uint64 | 大恩迪安 | 服務器的唯一標識符 |
| ClientAddress | UINT8 [7-29] | N/A。 | 客戶端IP地址和端口組合 |
| mtusize | UINT16 | 大恩迪安 | 服務器的最大傳輸單元(MTU)尺寸 |
| 需要吸收 | 位元 | N/A。 | 連接是否需要加密 |
| 加密鑰匙 | UINT8 [128] | N/A。 | 客戶端的加密密鑰 - 僅在設置為true的requiresEncryption時,僅編寫或讀取。 |
該數據包用於在客戶端和服務器之間建立具有啟用或禁用安全性的服務器之間的連接。
| 場地 | 類型 | 伊尼亞語 | 筆記 |
|---|---|---|---|
| ID | UINT8 | N/A。 | 數據包的唯一標識符 |
| 客戶端 | Uint64 | 大恩迪安 | 客戶的唯一標識符 |
| 客戶結構時間 | Uint64 | 大恩迪安 | 客戶要求連接時的時間戳 |
| dosecurity | 布爾 | N/A。 | 連接是否需要安全性 |
| 客戶防護 | uint8 [32] | N/A。 | 客戶身份驗證證明 |
| 行事 | 布爾 | N/A。 | 數據包是否需要身份證明 |
| 身份 | UINT8 [294] | N/A。 | 客戶身份證明 |
注意:如果身份證明是無效的,並且設置為TRUE,請立即發送帶有
ClientIdentityIsInvalid類型ID的RemoteSystemRequiresPublicKey設備doIdentity。如果doIdentity設置為false,並且沒有身份證明,請發送帶有ClientIdentityIsMissing類型ID的RemoteSystemRequiresPublicKey系統Repurepbublickeykekekekekekekeky。
該數據包用於拋出與公共密鑰請求有關客戶端身份驗證和標識的錯誤。
| 場地 | 類型 | 伊尼亞語 | 筆記 |
|---|---|---|---|
| ID | UINT8 | N/A。 | 數據包的唯一標識符 |
| TypeID | UINT8 | N/A。 | 公鑰請求的類型 |
| 姓名 | ID |
|---|---|
| ServerPublicKeySissing | 0 |
| 客戶識別症 | 1 |
| 客戶InternistityisInvalid | 2 |
當服務器不需要安全性,但仍然是強制性的,該數據包將發送。
| 場地 | 類型 | 伊尼亞語 | 筆記 |
|---|---|---|---|
| ID | UINT8 | N/A。 | 數據包的唯一標識符 |
| ClientAddress | UINT8 [7-29] | N/A。 | 客戶端IP地址和端口組合 |
| Serverguid | Uint64 | 大恩迪安 | 服務器的唯一標識符 |
當嘗試加入服務器的嘗試計數高於一定數量時(取決於您的實現),或者客戶端不包含分配的地址時,發送此數據包;如果在發送OpenConnectionRequestOne數據包之前滿足要求,這就是您檢查並發送的內容。
| 場地 | 類型 | 伊尼亞語 | 筆記 |
|---|---|---|---|
| ID | UINT8 | N/A。 | 數據包的唯一標識符 |
當客戶端已經連接時,將發送此數據包。
| 場地 | 類型 | 伊尼亞語 | 筆記 |
|---|---|---|---|
| ID | UINT8 | N/A。 | 數據包的唯一標識符 |
| 魔法 | uint8 [16] | N/A。 | 識別數據包的魔術序列 |
| 客戶端 | Uint64 | 大恩迪安 | 客戶的唯一標識符 |
此數據包是對啟用安全性的連接請求的響應。
| 場地 | 類型 | 伊尼亞語 | 筆記 |
|---|---|---|---|
| ID | UINT8 | N/A。 | 數據包的唯一標識符 |
| ClientAddress | UINT8 [7-29] | N/A。 | 客戶端IP地址和端口組合 |
| ClientIndex | UINT16 | 大恩迪安 | 分配給客戶的唯一標識符 |
| servermachineaddresses | 地址[10] | N/A。 | 服務器本地計算機地址 |
| 客戶結構時間 | Uint64 | 大恩迪安 | 客戶時間戳 |
| ServerSendTime | Uint64 | 大恩迪安 | 服務器的時間戳 |
當新客戶端連接到服務器時,此數據包將發送給所有其他客戶端。
| 場地 | 類型 | 伊尼亞語 | 筆記 |
|---|---|---|---|
| ID | UINT8 | N/A。 | 數據包的唯一標識符 |
| ServerAddress | UINT8 [7-29] | N/A。 | 服務器IP地址和端口組合 |
| 客戶端machineaddresses | 地址[10] | N/A。 | 客戶本地機器地址 |
| 客戶結構時間 | Uint64 | 大恩迪安 | 客戶時間戳 |
| ServerSendTime | Uint64 | 大恩迪安 | 服務器的時間戳 |
將該數據包發送或接收到服務器後,您需要通過發送定期ConnectedPing數據包來保持連接的活力。這些數據包本質上是說“嘿,我仍然在這裡並連接到服務器”的一種方法。該服務器還將ConnectedPong數據包發送迴響應,以確認連接仍然處於活動狀態。由於不活動或網絡問題,這種乒乓球過程有助於防止連接定時出現。
當客戶端與服務器斷開連接時,該數據包將發送。
| 場地 | 類型 | 伊尼亞語 | 筆記 |
|---|---|---|---|
| ID | UINT8 | N/A。 | 數據包的唯一標識符 |
當與客戶端的連接丟失時,將發送此數據包。
| 場地 | 類型 | 伊尼亞語 | 筆記 |
|---|---|---|---|
| ID | UINT8 | N/A。 | 數據包的唯一標識符 |
| 客戶端 | Uint64 | 大恩迪安 | 客戶的唯一標識符 |
| ClientAddress | UINT8 [7-29] | N/A。 | 客戶端IP地址和端口組合 |
當客戶端嘗試使用不兼容協議版本連接到服務器時,將發送此數據包。
| 場地 | 類型 | 伊尼亞語 | 筆記 |
|---|---|---|---|
| ID | UINT8 | N/A。 | 數據包的唯一標識符 |
| 協議vers | UINT8 | N/A。 | 服務器支持的協議版本 |
| 魔法 | uint8 [16] | N/A。 | 識別數據包的魔術序列 |
| Serverguid | Uint64 | 大恩迪安 | 服務器的唯一標識符 |
此數據包用於在客戶端和服務器之間發送和接收數據。它可以是三種類型之一:有效datagram,ackeddatagram或nackeddatagram。
| 場地 | 類型 | 伊尼亞語 | 筆記 |
|---|---|---|---|
| 伊斯瓦利德 | 位元 | N/A。 | 永遠是真的 |
| isack | 位元 | N/A。 | 如果是真的,則數據包是一個ackeddatagram |
| isnack | 位元 | N/A。 | 如果是真的,則數據包是一個nackeddatagram |
如果
isAck和isNack都是錯誤的,則數據包是有效的Datagram。
該數據包是對有效datagram的響應,表明服務器已收到數據。
| 場地 | 類型 | 伊尼亞語 | 筆記 |
|---|---|---|---|
| 需要bandas | 位元 | N/A。 | 如果為true,則數據包包括b和值 |
| b | 漂浮 | 大恩迪安 | 未使用 |
| 作為 | 漂浮 | 大恩迪安 | 數據到達率 |
| 範圍 | 範圍 | N/A。 | 接收到的範圍值陣列 |
該數據包是對有效datagram的響應,表明服務器尚未收到所有預期數據。
| 場地 | 類型 | 伊尼亞語 | 筆記 |
|---|---|---|---|
| 範圍 | 範圍 | N/A。 | 未收到的範圍值陣列 |
該結構用於表示Ackeddatagram的範圍和nackeddatagram的缺失範圍。
| 場地 | 類型 | 伊尼亞語 | 筆記 |
|---|---|---|---|
| 尺寸 | UINT16 | 大恩迪安 | 數組中的範圍數 |
| ISSINGLE | 布爾 | N/A。 | 如果最小等於最大,則將其設置為true |
| 最小 | Uint24 | 小末日 | 最小值 |
| 最大限度 | Uint24 | 小末日 | 範圍內的最大值 - 如果是單個的,則不會寫 |
此數據包用於在客戶端和服務器之間發送和接收數據。
| 場地 | 類型 | 伊尼亞語 | 筆記 |
|---|---|---|---|
| ispacketpair | 位元 | N/A。 | 如果是真的,則數據包是兩個相關數據包之一 |
| 連續的 | 位元 | N/A。 | 如果是真的,則數據包是連續發送數據包 |
| 需要bandas | 位元 | N/A。 | 如果為true,則數據包包括b和值 |
| 朗格伯 | Uint24 | 小末日 | 數據報的序列編號 |
| 膠囊 | datagramcapsule [] | N/A。 | 包中的膠囊陣列 |
檢查損壞的安排渠道:(有效的數據報必須進行`序列和安排(無ACK收據))
如果arrangmentChannel更大或等於可用的2 ^ 5的排列流數量,則它將被核斷(跳過並執行所需的操作)。
數組最大值的每個有效數據報導類型都是佈置流的數量,不得更大或等於。
在接收到的數據報中查找孔數:(有效的數據報必須Reliable or in sequence繼續前進之前)
您將需要在有效的數據報中檢查孔計數,該數據報的Reliable or in sequence ,其原因是檢查其訂單,並作為檢查是否有某種有效的數據報或錯誤的rangeNumber用於發送或其他原因。
receivedPacketsBaseIndex :僅當有效的數據報Reliable or in sequence
receivedPacketQueue :它是將有效數據報的rangeNumber存儲為列表中的關鍵,它的值是正確的,而不是數據報,它可能是錯誤的,但是在遇到了某些代碼之後,它將在下面說明(錯誤意味著我們可以成功地獲得它,這意味著我們無法成功地獲得DS_Queue ),並且它的數據結構是Inpplant riptim promptim in Inpplant rimptim prompt ryppections prompt in Inpply rypt promptimpection primst in Impand prinps prinps squequee in Inpplaaknet。
要查找孔計數,減去帶有receivedPacketsBaseIndex的當前接收到的有效數據報的rangeNumber ,並且每次沒有孔計數時屬性增量(僅在Reliable or in sequence ,只有receivedPacketsBaseIndex遞增)。
receivedPacketQueue中刪除,然後添加(pre-)將receivedPacketsBaseIndex遞增。bitwise right shifted 1的uint24的最大值,則它是一個重複的數據包(跳過並執行所需的操作)。receivedPacketQueue小屋大小receivedPacketQueue的索引/鑰匙,並且不等於false,請通過用receivedPacketQueue中的孔計數的鍵填充孔,其值等於false。如果未滿足這些條件的情況:
bitwise and uint32最大值)大於receivedPacketQueue大小,請通過在隊列中推動真實值來填充它。之後,您可以創建一個循環,並檢查receivedPacketQueue大小是否大於0,並且receivedPacketQueue的第一個值為false,然後刪除receivedPacketQueue的最後一個元素,然後將receivedPacketsBaseIndex遞增。
之後,您可以正常處理有效的數據報。
該結構代表有效Datagram中的膠囊。
| 場地 | 類型 | 伊尼亞語 | 筆記 |
|---|---|---|---|
| 可靠性 | 3位 | 大恩迪安 | 使用的可靠性類型 |
| 分段 | 位元 | N/A。 | 如果是真的,則分段數據包 |
| 尺寸 | UINT16 | 大恩迪安 | 緩衝區的大小在那裡 |
| ReliablecapsuleIndex | Uint24 | 小末日 | 用於可靠數據包的索引(這意味著為此使用可靠性) |
| 序列capsuleIndex | Uint24 | 小末日 | 用於測序數據包的索引(這意味著為此使用可靠性) |
| 安排 | 膠囊 | N/A。 | 用於測序和佈置數據包的膠囊的排列(這意味著為此使用可靠性) |
| 部分 | 膠囊 | N/A。 | 膠囊分割時使用的膠囊段 |
| 緩衝 | 緩衝 | N/A。 | 包含想要通過網絡發送的數據的緩衝區數據 |
該結構代表在有效datagram中膠囊的佈置。
| 場地 | 類型 | 伊尼亞語 | 筆記 |
|---|---|---|---|
| 佈置CapsuleIndex | Uint24 | 小末日 | 排列膠囊的索引 |
| 安排通道 | UINT8 | N/A。 | 用於安排的渠道 |
該結構表示有效datagram中膠囊的分割。
| 場地 | 類型 | 伊尼亞語 | 筆記 |
|---|---|---|---|
| 尺寸 | Uint32 | 大恩迪安 | 段的大小 |
| ID | UINT16 | 大恩迪安 | 與該細分市場關聯的唯一標識符 |
| 指數 | Uint32 | 大恩迪安 | 索引的索引 |
在Raknet中發送的每個數據報都分配了一個可靠性TypeID,該可靠性指定了協議應如何處理數據。下表列出了可用可靠性類型及其屬性:
| 姓名 | ID | 是可靠的 | 被安排 | 被測序 | 特徵/特徵 |
|---|---|---|---|---|---|
| 不可靠 | 0 | 不 | 不 | 不 | 此可靠性TypeID將發送數據報,而無需保證它們將到達目的地。他們不能保證以任何特定的順序或根本交付 |
| 無雜誌 | 1 | 不 | 是的 | 是的 | 此可靠性TypeID發送數據報,無保證它們將到達目的地,但可以確保以發送的順序交付它們 |
| 可靠的 | 2 | 是的 | 不 | 不 | 此可靠性TypeID發送保證按發送訂單交付的數據報。如果丟失了數據報,Raknet將重新將其重新發送到接收器確認為止 |
| Reliablearranged | 3 | 是的 | 是的 | 不 | 此可靠性TypeID發送保證按發送訂單交付的數據報。如果丟失了數據報,Raknet將不會重新將其重新啟動和所有數據報。 |
| 透露倍增 | 4 | 是的 | 是的 | 是的 | 此可靠性typeID發送保證按照發送的順序發送的數據報,並確保它們被順序交付 |
| 不可靠的WithackReceipt | 5 | 不 | 不 | 不 | 此可靠性TypeID發送數據報,無保證,它們將到達目的地,但是接收者在收到此數據報時會發送確認收據 |
| 可靠的WithackReceipt | 6 | 是的 | 不 | 不 | 此可靠性TypeID發送保證按發送訂單交付的數據報,並且接收者在收到此數據報時發送確認收據 |
| ReliaBlearrangedWithAckReceipt | 7 | 是的 | 是的 | 不 | 此可靠性typeID發送保證以發送的訂單交付的數據報,但所有數據報都沒有被確認,並且接收者在收到此數據雜誌後發送確認收據 |
在這裡,您可以找到在文檔中其他地方使用的所有可靠性定義。
Sequenced且可靠的安排和可靠的ACK RECEPITRaknet使用選擇性重複重新傳輸來確保數據報的可靠交付。發送數據報時,將分配一個序列號。如果在特定超時期內未確認數據報,則Raknet將使用相同的序列編號重新發送數據報。當接收器收到具有相同序列編號的重複數據報時,它可以丟棄它,因為它已經確認了該序列編號。
Ackqueue和Nackqueue用於跟踪已確認哪些數據報,尚未確認哪些數據報。 Ackqueue存儲了已成功確認的數據報序列編號的列表,而Nackqueue存儲了尚未確認且需要重新發送的數據報序列號列表。當收到具有已經確認的序列號的數據報時,可以將其丟棄。
PacketPair是Raknet用於提高數據報重傳效率的一種技術。確認數據報時,Raknet也將在序列中發送下一個數據報。這使得接收器可以立即開始處理下一個數據報,從而減少延遲並改善吞吐量。
連續記錄是Raknet的功能,它允許在不等待確認的情況下連續發送數據報。在某些情況下,這可以提高性能,但也可以導致數據包丟失和重新轉載,因為發件人在發送下一個數據報之前沒有等待反饋。
Raknet使用重新組裝機制來重建可能不訂單的分段數據報。分段數據報時,每個段都被分配一個唯一的標識符。當接收器接收一個細分市場時,將其進行緩衝,直到收到具有相同標識符的所有段為止。一旦收到所有段,它們就會重新組合到原始數據報中。
流量控制是一種用於管理髮件人和接收器之間數據傳輸速率的RAKNET機制。它確保接收器可以以其可以處理的速度處理傳入的數據,從而防止或溢出接收器的緩衝區。流量控制有助於保持發件人的傳輸速度和接收器的處理能力之間的平衡,從而優化通信的總體效率和穩定性。
擁堵經理擁有擁堵控制,檢查跳過的範圍數字以發送nacks以及其他東西。
托多:添加文檔
擁塞控制是一種RAKNET技術,用於通過平衡數據傳輸速率來防止網絡擁塞。使用TCP擁塞控制,數據包掉落,速率限制,交通形成,QoS和負載平衡等技術。這些技術可確保可靠的數據傳遞和Raknet中有效傳輸。
Raknet中的分割通過將大信息分為較小的細分市場來增強數據傳輸。這些細分市場帶有標頭表示位置和尺寸,可確保在接收器的末端成功重新組裝。通過將緩衝區大小與最大傳輸單元(MTU)大小進行比較,如果緩衝區超過MTU,則將其分為傳輸段。 Raknet中的這種機制可防止數據丟失,管理大量有效載荷並確保網絡應用程序中可靠的傳輸。
“ B”表示可以在網絡鏈接上每秒傳輸的鏈接容量或最大數據。鏈接容量由多種因素決定,包括網絡基礎架構,網絡配置和可用資源。通過使用浮點數,可以更準確,準確地表示網絡容量,從而更好地利用可用資源。
“ AS”代表數據到達率,這是發件人生成和發送數據的速率。浮點數的使用可以更精確地表示到達率,這可能會根據應用程序要求和網絡條件而變化。通過將到達率與鏈接容量進行比較,發件人可以確定可以通過網絡鏈接發送的數據量,而不會導致績效的擁塞或退化。
要確定膠囊的大小,您可以按照以下步驟操作:
reliableCapsuleIndex 。sequencedCapsuleIndex 。arrangedCapsuleIndex ,然後按1個步驟進行arrangementChannel 。size為4步, id的2個步驟以及該段index的4個步驟。 UserPacketenum ID為0x86 ,它標誌著您可以在哪裡開始使用自定義數據包ID的開始。
建議考慮到完成的實現,然後發送並接收它,建議創建一個PacketAggregator 。
您可以將ID放置一個ID,例如: UserPacketEnumID +您自己的ID(它一定不能使UserPacketEnumID超過uint8 limit )
例如: UserPacketEnumID + 22 = 0x9c
一個簡單的數據包結構,展示了PacketAggregator內容:
| 場地 | 類型 | 伊尼亞語 | 筆記 |
|---|---|---|---|
| ID | UINT8 | N/A。 | 數據包的唯一標識符 |
| 壓縮貢法 | UINT8 | 壓縮算法[可以無,openssl,zlib,gzip,ntappy,任何東西] | |
| 流 | 緩衝[] | 一個數據包流數組(流數組中的每個元素代表一個編碼/的數據包緩衝區,並且要在compressionAlgorithm中解碼) |
之後,您將其發送到有效的數據報膠囊/S緩衝區中
要發送非raknet數據包,請首先通過比較膠囊緩衝區大小是否大於MTU大小2負2,加3,加4倍1(對於數據報的數據標頭長度),並減去11,如果使用安全性,則減去11。然後,用膠囊大小減去給定值。如果需要進行分割,請在將其添加到數據報隊列以進行傳輸之前,然後將其添加到膠囊的流中。如果不需要分割,請將其直接添加到隊列中。請記住,分段的數據包不可不可靠;如果是,請將它們轉換為可靠的數據包,以確保所有數據包零件的成功和有序交付。
將其分為部分的方式:
獲取膠囊尺寸以及膠囊緩衝尺寸,然後您用來檢查是否大於膠囊緩衝區大小並定義它們的大小。
要計算需要製作多少個片段:減去膠囊緩衝尺寸的大小,然後將其與過去檢查是否大於膠囊緩衝尺寸大的大小進行分配,然後用1(不是兩次)將它們總結為1(不是兩次),或者您可以減去1並在最後添加1個
然後在循環外定義current segment index ,默認為0
然後進行一個循環,以使用數量數量的計數,然後將分割過程啟動:
在此之後,定義一個表示start offset的變量,它等於current segment index乘以您過去檢查是否大於膠囊緩衝區大小的大小
在此之後,定義一個代表bytes to send的變量,該字節等於膠囊緩衝區大小從start offset減去
檢查要bytes to send是否大於您用來檢查是否大於膠囊緩衝區大小的大小,以及是否設置bytes to send到您用來檢查的大小...
之後,創建一個代表end offset的新變量
檢查bytes to send是否不是您用來檢查是否大於膠囊緩衝尺寸大小的大小,然後將end offset設置為膠囊緩衝區大小,從當前段索引乘以current segment index乘以您過去檢查的尺寸,該尺寸是否大於膠囊緩衝區大小。
如果支票失敗,則end offset將是bytes to send
在此之後,將膠囊緩衝區切成start offset和end offset ,然後您可以在膠囊中進行feilds。
您將需要一個帶有膠囊的數組,該數組包含片段,然後以隊列發送。
該段ID將是sender last segment id屬性,每次都會在循環之外增加。
以下是幫助您更好地了解Raknet協議的資源列表: