说明
UDP由于自身限制,每次发送的数据包最大约64K,但是在局域网内,有时候希望传输更大的数据。所以必须有策略发送。
RRQMSocket可通过简单设置,实现该功能。
使用
只需要在创建UdpSession后,设置其适配器为UdpPackageAdapter类型即可(默认为NormalUdpDataHandlingAdapter)。同时可以根据传输数据的大小,修改相关属性,如:MTU,Timeout等。
此模式下,发送端与接收端均必须为RRQM(或实现相同算法),且为相同设置。
UdpSession udpSession = new UdpSession();
udpSession.SetDataHandlingAdapter(new UdpPackageAdapter());
udpSession.Received += (endpoint, byteBlock, requestInfo) =>
{
};
RRQMConfig config = new RRQMConfig();
config.SetBindIPHost(new IPHost($"127.0.0.1:{bindPort}"))
.SetBufferLength(1024*1024);
udpSession.Setup(config);//加载配置
udpSession.Start();//启动
原理
在发送时,会将要发送的数据分割成MTU长度的数据。然后为其编号,然后发送,最后由接收方重组。
数据格式
ID:由雪花算法生成,在并发请求时1毫秒中有400w分之一的概率发生ID重复。但基本可以忽略不计。
Bit | 说明 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|---|
协议名 | |||||||||
byte1 | PackageID为long类型,占用8字节,标识数据包唯一性。 | ||||||||
byte2 | |||||||||
byte3 | |||||||||
byte4 | |||||||||
byte5 | |||||||||
byte6 | |||||||||
byte7 | |||||||||
byte8 | SN为Ushort占2字节,标识帧序 | ||||||||
byte9 | |||||||||
byte10 | flag,占1字节,最高位标识是否为结束,其他位保留。 | 1 | |||||||
byte? | 有效载荷数据 | ||||||||
byte^2 | 当不为终结帧时,此处仍然为载荷数据。当是终结帧时,倒数两个字节为Crc16校验。 | ||||||||
byte^1 |