error handle to all: EncoderException

This commit is contained in:
free will
2021-03-18 11:22:49 +08:00
parent 5fc080ca6c
commit 8cf6ed24c9
34 changed files with 700 additions and 233 deletions
+10
View File
@@ -0,0 +1,10 @@
# Exception
当异常没有那么严重,属于程序自己可以处理的情形时,应当把这个异常抛出,然后交由上层方法去捕获并处理该异常。
如果需要根据返回值去判断是否发生异常,那么,
1. 当这个返回值正常情况下只能是正整数时,异常发生则返回-1;
2. 当这个返回值正常情况下只能是正整数或0时,异常发生则返回-1;
# Error
当异常属于不可处理的错误,应当直接抛出,提醒用户该错误发生的位置。
+172
View File
@@ -0,0 +1,172 @@
# MIR Management
MIR管理通信协议允许用户、工具和控制平面程序检索,监视和更改MIR的状态。
## 1. MIR管理协议
### 1.1 基本机制
MIR通信管理协议使用管理通信包(Interest-Data exchange)来进行通信,管理通信包的顶层TLV的TYPE值为1。
- **Status Dataset** (状态数据集)
> https://redmine.named-data.net/projects/nfd/wiki/StatusDataset
状态数据集定义了一个实体集合的状态信息如何作为管理数据包(Management Data)进行编码、分片和发布。这个机制搭配兴趣包数据包交换(Interest-Data exchange)的通信方式可以很方便的对MIR中的各种状态信息进行检索。
- **Notification Stream**(通知流)
MIR管理通信协议要求实现一个基于事件订阅的通知机制,一旦MIR的相关状态发生改变,可以通过该机制通知对应的管理模块。这个机制可以很有效的对MIR的状态进行监视。
- **Control Command**(控制命令)
控制命令定义了一系列可以更改MIR状态的命令的请求和回复格式,*以及如何对这些命令进行签名和认证*。这个机制对于更改MIR的状态很有用。
### 1.2 模块
- **LogicFace Management**(逻辑接口管理模块)
- 创建和销毁逻辑接口控制命令;
- 一个数据集(dataset)用于发布 LogicFace 状态和计数器;
- 一个通知流(Notification Stream),用于通知逻辑接口的创建和销毁事件
- **FIB Management**(转发表管理模块)
- 插入、更新和删除FIB条目的控制命令;
- 一个数据集(dataset)用于发布FIB表的条目信息;
### 1.3 管理请求包的基本格式
```
CommandInterest = 1 TLV-LENGTH
{ InterestIdentifier } => 标识区
{ Signature } => 签名区
```
- **用于本地管理**
```
/localhost/mir/<模块名称>/<命令>/<参数>/[版本号]/[分片号]
```
- 模块名称:每个管理模块会有一个唯一的模块名称,例如:`fib-mgmt`
- 命令:表示要在对应模块执行的动作,例如:`add`、`list`
- 参数:由一个 `ControlParameters` TLV 编码而成,其中包含一系列子 TLV,每个子TLV表示一个请求的参数字段(Field),例如:
```
ControlParameters = CONTROL-PARAMETERS-TYPE TLV-LENGTH
[LocalFaceUri]
[RemoteFaceUri]
```
- 版本号:数据集在每次版本更迭时,会将发布的数据状态的版本号加1,可以凭借版本号获取最新的状态信息
- 分片号:数据集通常无法用一个Data包装下,需要进行分片发布,分片号指定要拉取的数据分片
- **用于单跳接入**(用于使用TCP LogicFace等接入MIR的场景)
```
/localhop/mir/<模块名称>/<命令>/<参数>/[版本号]/[分片号]
```
### 1.4 管理回复包的基本格式
```
CommandData = 1 TLV-LENGTH
{ DataIdentifier } => 标识区
{ Signature } => 签名区
{ => 只读区
<Payload>
}
```
回复数据放在管理回复包的 `Payload` 部分,格式为json格式,如果数据较多,需要分片进行传输
## 2. LogicFace Management
> 模块名称:`minlf-mgmt`
### 2.1 控制命令
- **`list`**
> list 命令用于显示逻辑接口的详细信息
```
mirc lf list [remote <LFURI>] [local <LFURI>] [scheme <SCHEME>]
```
- **`add`**
> add 命令用于添加一个逻辑接口
```
mirc lf add remote <LFURI> [[persistency] <PERSISTENCY>] [local <LFURI>] [mtu <MTU>]
```
- **`del`**
> del 命令用于删除一个逻辑接口
```
mirc lf del <LFID|LFURI>
```
- **`show`**
> show 命令用于展示指定ID的逻辑接口的信息
```
mirc lf show <LFID>
```
### 2.2 OPTIONS
- **LFID**
LfId 表示逻辑接口在MIR中的唯一数字标识
- **LFURI**
LfUri 表示本地或者远端的逻辑接口的地址,示例如下:
- `tcp://192.168.1.2:13899`
- `udp://192.168.1.3:13899`
- `ether://[08:00:27:01:01:01]`
- `dev://eth0`
- `unix:///var/run/mir.sock`
- **SCHEME**
Scheme 表示本地或者远端的接口地址所使用的Uri方案,示例如下:
- udp
- tcp
- unix
- dev
- **PERSISTENCY**
Persistency 参数指定了逻辑接口的持久性,取值可以为 `persistent` (持久的)和 `permanent`(永久的)
- `persistent`:拥有 `persistent` 持久性的逻辑接口,在通信过程中发生套接字错误时,会自动关闭并销毁该逻辑接口;
- `permanent`:拥有 `permanent` 持久性的逻辑接口,在通信过程中如果发生套接字错误是,逻辑接口不会直接销毁,会一直保留,并尝试重新建立套接字连接。
- **MTU**
Mtu 参数指定了逻辑接口的最大传输单元的大小。
## 3. FIB Management
> 模块名称:`fib-mgmt`
### 3.1 控制命令
- **`list`**
> list 命令用于展示 FIB 表的信息
`mirc fib list `
- **`add`**
- **`del`**
+305
View File
@@ -0,0 +1,305 @@
# MIN Packet Format
## 1. TLV
- 网络分组级别
0 ~ 49
| Type | TLV number | Description |
| :-----------------: | :--------: | :-----------: |
| PacketMINCommon | 0 | 通用MIN网络包 |
| PacketMINManagement | 1 | MIN网络管理包 |
| PacketMINIP | 2 | MIN网络IP包 |
- 网络包分区
50 ~ 99
| Type | TLV number | Description |
| :------------------------: | :--------: | :----------------------: |
| IdentifierField | 50 | 目的标识区 |
| SignatureField | 51 | 数字签名区 |
| ReadOnlyField | 52 | 只读数据区 |
| VariableField | 53 | 可变数据区 |
| VariableProtectField | 54 | 可变数据区中的受保护区 |
| VariableDangerousField | 55 | 可变数据区中的非受保护区 |
- 标识分配
100 ~ 199
| Type | TLV number | Description |
| ------------------------- | ---------- | ------------ |
| IdentifierComponent | 100 | 标识名称组件 |
| Identifier | 101 | 标识值 |
| IdentifierCommon | 102 | 身份标识 |
| IdentifierContentInterest | 103 | 内容兴趣标识 |
| IdentifierContentData | 104 | 内容数据标识 |
- 其它TLV组件
200 ~ 500
| Type | TLV number | Description |
| ---------------- | ---------- | -------------------------------------- |
| SignatureValue | 200 | 签名值 |
| SignatureInfo | 201 | 签名参数 |
| SignatureType | 202 | 签名类型 |
| TlvKeyLocator | 203 | 指示证书或公钥的位置 |
| Payload | 204 | 网络包负载 |
| CanBePrefix | 205 | 是否可以被较长的数据包前缀匹配 |
| MustBeRefresh | 206 | 是否强制只拉取新鲜的数据 |
| InterestLifeTime | 207 | 兴趣包生存期 |
| Nonce | 208 | 随机数 |
| HopLimit | 209 | 跳数限制 |
| FreshnessPeriod | 210 | 数据包新鲜时间 |
| CongestionMark | 211 | 拥塞标记 |
| TTL | 212 | Time to live |
| SliceNumber | 213 | 分片数量 |
| SliceSize | 214 | 分片大小 |
| LogicFaceId | 215 | 逻辑接口Id |
| RemoteAddr | 216 | 远端地址 |
| LocalAddr | 217 | 本地地址 |
| Mtu | 218 | 最大传输单元 |
| Ret | 219 | bool类型,成功或失败 |
| Origin | 220 | |
| Cost | 221 | 链路开销 |
| Expires | 222 | LogicFace超时时间,-1为不超时(never |
## 2. Identifier
```
IdentifierComponent = 100 TLV-LENGTH
<Marker>
*OCTET
Marker = OCTET
Identifier = 101 TLV-LENGTH
*IdentifierComponent
```
- `*OCTET`:字符串
- `Marker`:单个字节,用于区分不同类型的IdentifierComponent,分配如下
| Marker value | Description |
| :----------: | :------------------------------------: |
| 0x00 | 普通的UTF-8编码的字符串 |
| 0x01 | 非负整数(可以用1、2、4、8个字节表示) |
| 0x02 | 任意字节数组 |
### 2.1 CommonIdentifier
```
CommonIdentifier = 102 TLV-LENGTH
<Identifier>
```
### 2.2 InterestIdentifier
```
InterestIdentifier = 103 TLV-LENGTH
<Identifier>
```
### 2.3 DataIdentifier
```
DataIdentifier = 104 TLV-LENGTH
<Identifier>
```
## 3. MIN Packet
### 3.1 CPacket
```
CPacket = 0 TLV-LENGTH
{ CommonIdentifier } => 标识区
{ Signature } => 签名区
{ => 只读区
<Payload>
}
{ => 可变区
{ => 受保护区
"Empty"
}
{ => 非受保护区
[TTL]
}
}
```
- `Payload`
```
Payload = PAYLOAD-TYPE TLV-LENGTH *OCTET
```
### 3.2 Interest
```
Interest = 0 TLV-LENGTH
{ InterestIdentifier } => 标识区
{ Signature } => 签名区
{ => 只读区
[CanBePrefix]
[MustBeRefresh]
[InterestLifeTime]
[Nonce]
[HopLimit]
<Payload>
}
{ => 可变区
{ => 受保护区
[CongestionMark]
}
{ => 非受保护区
"Empty"
}
}
```
- `CanBePrefix`
```
CanBePrefix = 203
TLV-LENGTH; == 0
```
- `MustBeFresh`
```
MustBeFresh = 204
TLV-LENGTH; == 0
```
- `InterestLifeTime`
```
InterestLifeTime = 205 TLV-LENGTH NoNegativeInteger
```
- `NonNegativeInteger` :非负整数
- `Nonce`
```
Nonce = 206
TLV-LENGTH; == 4
4OCTET
```
- `4OCTET`:四字节字符串
- `HopLimit`
```
HopLimit = 207
TLV-LENGTH; == 1
OCTET
```
- `OCTET`1字节无符号整数
### 3.3 Data
```
Data = 0 TLV-LENGTH
{ DataIdentifier } => 标识区
{ Signature } => 签名区
{ => 只读区
[FreshnessPeriod]
<Payload>
}
{ => 可变区
{ => 受保护区
[CongestionMark]
}
{ => 非受保护区
"Empty"
}
}
```
### 3.4 ManagementPacket
- Request
```
ManagementRequestPacket = 1 TLV-LENGTH
{ InterestIdentifier } => 标识区
{ Signature } => 签名区
```
- Response
```
ManagementResponsePacket = 1 TLV-LENGTH
{ DataIdentifier } => 标识区
{ Signature } => 签名区
{ => 只读区
<Payload>
}
{ => 可变区
{ => 受保护区
"Empty"
}
{ => 非受保护区
"Empty"
}
}
```
- `SliceNumber`
```
SliceNumber = 205 TLV-LENGTH NoNegativeInteger
```
- `SliceSize`
```
SliceSize = 205 TLV-LENGTH NoNegativeInteger
```
## 4. Signature
```
Signature = SignatureInfo SignatureValue
SignatureInfo = 201 TLV-LENGTH
<SignatureType>
[KeyLocator]
SignatureValue = 200 TLV-LENGTH *OCTET
```
在MIN的包格式里面,一个签名 `Signature` 由两个连续的TLV块,`SignatureInfo` 和 `SignatureValue` 组成。
- **SignatureInfo**
`SignatureInfo` 中包含一个必选的子 TLV 块 `SignatureType`,它包含了签名的信息,其格式如下:
```
SignatureType = SIGNATURE-TYPE-TYPE TLV-LENGTH <NonNegativeInteger>
```
目前定义的 SignatureType的值如下:
| SignatureType Value | Description |
| :-----------------: | :----------------------------------------------------------: |
| 0 | SM2_WITH_SM3,在SM3 Hash摘要的基础上用SM2签名进行完整性和不可否任性保护 |
`SignatureInfo` 中还包含一个可选的TLV块 `KeyLocator` (虽说是可选,但是这个是为了后期扩展,目前为必选项),它指示了用于签名的证书或者公钥的位置,其格式如下:
```
KeyLocator = KEYLOCATOR-TYPE TLV-TYPE <Identifier>
```
- **SignatureValue**
`SignatureValue` 中包含了签名的值,是一串字节