reudp
v1.3.0
Published
Reliable UDP implementation for Node
Downloads
5
Readme
Reliable UDP implementation for Node
协议定义
术语定义
逻辑包:从上层应用中接收到的 buffer 物理包:对逻辑包按固定大小(500Byte)进行分割 发送端: 发送数据包的端点 接收端: 接收数据包的端点
数据包定义
所有的 UDP 包都有以下头部:
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| CHECKSUM(16) | TYPE(8) | |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| ID(32) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
其中,
- CHECKSUM 为简单的校验和,主要用来过滤掉无效的 UDP 包
- TYPE 为下面表格里列出的包类型值
- ID 为逻辑包的 id
TYPE
| Type | Value | Description | |---------|-------|-----------------------------------------------------------| | UDP_PSH | 0x01 | 数据包,用于发送端发送数据(物理包) | | UDP_REQ | 0x02 | 控制包,用于接收端请求未接收到的物理包 | | UDP_FIN | 0x03 | 控制包,用于通知发送端所有物理包已接收完毕 | | UDP_ACK | 0x04 | 控制包,用于通知发送端已成功接收到控制包 | | UDP_ERR | 0x05 | 控制包,用于发生错误时 |
UDP_PSH 类型包的其他部分:
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| SEQ(16) | SEQ_SINGLE_TOTAL(16) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| SEQ_TOTAL(16) | DATA(* lte 500) ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
其中,
- SEQ 为物理包的序号 id
- SEQ_SINGLE_TOTAL 为一次并行发送的物理包的数量
- SEQ_TOTAL 为一个逻辑包里包含的物理包的数量
- DATA 为物理包的内容(这里固定为 500Byte,当小于 500B 时为实际大小)
UDP_REQ 类型包的其他部分:
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| REQ_SEQ_ARRAY(*) ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
其中,
- REQ_SEQ_ARRAY 为接收端请求其他未收到的物理包的序号(SEQ)的数组
UDP_FIN 类型包只有头部
UDP_ACK 类型包的其他部分:
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| ACK_TYPE(8) |
+---------------+
其中,
- ACK_TYPE 为 UDP_REQ | UDP_FIN | UDP_ERR 等值
UDP_ERR 类型包的其他部分:
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| ERR_TYPE(16) |
+-------------------------------+
其中,
- ERR_TYPE 为错误的类型