在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大小 ,拆分包进行发送