传输大于64K的数据
一、说明
UDP由于自身限制,每次发送的数据包最大约64K,但是在局域网内,有时候希望传输更大的数据。所以必须有策略发送。
TouchSocket可通过简单设置,实现该功能。
二、使用
只需要在配置中,设置其适配器为UdpPackageAdapter类型即可(默认为NormalUdpDataHandlingAdapter)。同时可以根据传输数据的大小,修改相关属性,如:MTU,Timeout等。
UdpSession udpSession = new UdpSession();
udpSession.Received += (endpoint, byteBlock, requestInfo) =>
{
};
udpSession.Setup(new TouchSocketConfig()
.SetBindIPHost(new IPHost($"127.0.0.1:7789"))
.SetUdpDataHandlingAdapter(()=> new UdpPackageAdapter()));//加载配置
udpSession.Start();//启动
注意
此模式下,发送端与接收端均必须为TouchSocket(或实现相同算法),且为相同设置。
三、原理
在发送时,会将要发送的数据分割成MTU长度的数据。然后为其编号,然后发送,最后由接收方重组。
3.1 数据格式
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 |