说明

UDP由于自身限制,每次发送的数据包最大约64K,但是在局域网内,有时候希望传输更大的数据。所以必须有策略发送。

RRQMSocket可通过简单设置,实现该功能。

使用

只需要在创建UdpSession后,设置其适配器为UdpPackageAdapter类型即可(默认为NormalUdpDataHandlingAdapter)。同时可以根据传输数据的大小,修改相关属性,如:MTUTimeout等。

此模式下,发送端与接收端均必须为RRQM(或实现相同算法),且为相同设置。

  1. UdpSession udpSession = new UdpSession();
  2. udpSession.SetDataHandlingAdapter(new UdpPackageAdapter());
  3. udpSession.Received += (endpoint, byteBlock, requestInfo) =>
  4. {
  5. };
  6. RRQMConfig config = new RRQMConfig();
  7. config.SetBindIPHost(new IPHost($"127.0.0.1:{bindPort}"))
  8. .SetBufferLength(1024*1024);
  9. udpSession.Setup(config);//加载配置
  10. 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