在raknet中使用兩種資料發送機制,最新的使用UDT做為傳輸控制層
以下即為新的傳輸控制項機制
在raknet中可以用#define _USE_RAKNET_FLOW_CONTROL 來確定是是用舊的傳輸協議還是使用新的協議
控制包:
1 byte 標誌位
4 bytes 時間戳記, 用來去計算RTT,進行擁塞控制
3 bytes 序號 ACK用它來查看資料包
資料包:
2 bytes 訊息長度
3 bytes 當前訊息序號, 避免重複傳送
1 byte 標誌位
if (UNRELIABLE_SEQUENCED,RELIABLE_SEQUENCED,RELIABLE_ORDERED)
3 bytes 重傳序號
1 byte 序列通道
if (訊息超過 MTU)
4 bytes 分塊數量, 不壓縮以提高工作效率
2 bytes 分塊標識
4 bytes 塊中索引, 不壓縮以提高工作效率
從遊戲中發送一段訊息,你發送到raknet的所有資料資訊都將會把一個控制資訊放在一起。因此你僅發送一個訊息,那麼它應該一個控制資訊和一個 資料資訊。如果你發送5個資訊,那麼它是一個控制資訊加5 個資料資訊。但是如果它比MTV大了10倍,那麼它發送10個報文,每個報文包含1個資料 (資料將被拆分)
以下即為舊的傳輸控制項機制:
控制包:
1 byte 標誌位
8 bytes 時間戳記, 用來去計算RTT,進行擁塞控制
資料包:
4 bytes 訊息長度
4 bytes 當前訊息序號, 避免重複傳送
4 bits 標誌位
if (UNRELIABLE_SEQUENCED,RELIABLE_SEQUENCED,RELIABLE_ORDERED)
4 bytes 重傳序號
5 bits 序列通道
if (訊息超過 MTU)
4 bytes 分塊數量, 壓縮,平均是1-2個bytes
4 bytes 分塊標識
4 bytes 塊中索引, 壓縮,平均是1-2個bytes
RakNet資料包的可靠性
UNRELIABLE
Unreliable的資料包是直接被UDP寄出,它們可能按照順序到達,也可能不會。用這種方法寄出的資料最好是不重要的,或者發送很多次,這樣做的 好處就是,遺失的資料包可以得到補償。
優點 — 這種類型的資料包不需要被網路告知是否到達目的地。
缺點 — 資料包沒有順序,也可能不會到達目的地,如果發送記憶體是滿的,首先拋棄的就是這種資料。
UNRELIABLE_SEQUENCED
不可靠的連續資料包和不可靠的資料包大體相同。就只有一點不同,那就是老的資料包被忽視,只有最新的資料包可以被接受。
優點 — 和不可靠的資料包差不多,因此你不用擔心老的資料包會改變你的資料。
缺點 — 大量的資料包在他們可能從未到達目的地的情況下丟失,也可能在到達目的地以後丟失。 當發送緩衝區滿了的時候,這些資料包首先被丟失。或是最近的資料包寄出後卻從未到達。
RELIABLE
可靠的資料包是UDP通過一個可靠的層打包後發送到目的地的。
優點 — 資料包將完整無缺的到達目的地。
缺點 — 沒有包順序。
RELIABLE_ORDERED
可靠性順序包是UDP通過一個可靠層打包後,按照順序發送到目的地的。
優點 — 這種資料包將按照一定順序被寄出。這樣做的好處就是很容易編程,因為你不用擔心如何組織它們或者遺失的資料包。
缺點 — 可能會佔用額外的網路寬頻。如果網路很繁忙的時候,資料包可能到達的非常慢。如果一個資料包晚到,那麼將延遲許多資料包的到達。不 管怎樣,這個缺點可以使用順序流來緩解。
RELIABLE_SEQUENCED
可靠性連續資料包是UDP使用可靠層打包的,它的目的就是確保這些資料包可以按照連續的順序到達目的地。
優點 — 你可以得到UDP資料包的可靠性,順序資料包的順序,不用擔心老的資料包。
缺點 — 還是佔用了大量的網路寬頻。 如果收到的包中ACK確認,從包隊列中刪除該包如果沒有收到ACK確認,重新發送 如果要發送的包大於預設MTU大小 ,拆分包進行發送