Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/zbinlin/node-reudp


https://github.com/zbinlin/node-reudp

Last synced: 4 days ago
JSON representation

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** 为逻辑包的 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** 为错误的类型