Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/zbinlin/node-reudp
https://github.com/zbinlin/node-reudp
Last synced: 4 days ago
JSON representation
- Host: GitHub
- URL: https://github.com/zbinlin/node-reudp
- Owner: zbinlin
- Created: 2016-08-09T12:53:22.000Z (over 8 years ago)
- Default Branch: master
- Last Pushed: 2016-08-25T07:14:36.000Z (about 8 years ago)
- Last Synced: 2024-04-23T15:02:03.517Z (7 months ago)
- Language: JavaScript
- Size: 47.9 KB
- Stars: 2
- Watchers: 3
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
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** 为逻辑包的 idTYPE
| 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** 为错误的类型