# 11. RTR（RPKI to Router Protocol）

## 11.1 目标与文档范围

RTR 用于把 RP/Cache 已完成密码学验证的 RPKI 数据下发给路由器。

本文按以下规范整理：
- RFC 6810（RTR v0）
- RFC 8210（RTR v1，更新 RFC 6810）
- draft-ietf-sidrops-8210bis-25（RTR v2，草案）

## 11.2 协议演进

### 11.2.1 RFC 6810（v0）

- 只定义 Prefix Origin 相关 payload（IPv4/IPv6 Prefix PDU）。
- 主要 PDU：Serial Notify / Serial Query / Reset Query / Cache Response / Prefix / End of Data / Cache Reset / Error Report。

### 11.2.2 RFC 8210（v1）

在 v0 基础上新增/强化：
- 新增 `Router Key PDU`（PDU Type 9，v1 可用，v0 保留）。
- 强化协议版本协商与降级行为。
- `End of Data` 在 v1 中携带 `Refresh/Retry/Expire` 三个计时参数。

### 11.2.3 Version 2（草案）

在 v1 基础上新增/强化：
- 新增 `ASPA PDU`（PDU Type 11，仅 v2）。
- 新增 “Races, Ordering, and Transactions” 章节，要求缓存按规定顺序输出 payload 以降低路由器短暂误判。
- 协议版本提升到 `2`。
- 明确 PDU 最大长度上限为 64k（65535）。

## 11.3 PDU 与版本矩阵

PDU 类型（按规范注册表）：

| PDU Type | 名称 | v0 (RFC6810) | v1 (RFC8210) | v2 (8210bis-25) |
|---|---|---|---|---|
| 0 | Serial Notify | 支持 | 支持 | 支持 |
| 1 | Serial Query | 支持 | 支持 | 支持 |
| 2 | Reset Query | 支持 | 支持 | 支持 |
| 3 | Cache Response | 支持 | 支持 | 支持 |
| 4 | IPv4 Prefix | 支持 | 支持 | 支持 |
| 6 | IPv6 Prefix | 支持 | 支持 | 支持 |
| 7 | End of Data | 支持 | 支持（含计时参数） | 支持 |
| 8 | Cache Reset | 支持 | 支持 | 支持 |
| 9 | Router Key | 保留 | 支持 | 支持 |
| 10 | Error Report | 支持 | 支持 | 支持 |
| 11 | ASPA | 保留 | 保留 | 支持 |

通用字段约束：
- `Protocol Version`：8-bit。
- `PDU Type`：8-bit。
- `Session ID`：16-bit。
- `Length`：32-bit。
- 保留位（zero/reserved）发送必须为 0，接收时按规范处理。

## 11.4 关键 PDU 语义

### 11.4.1 Serial Notify（Type 0）

- 由 Cache 主动发送，提示有新序列可拉取。
- 是少数可不由 Router 请求触发的消息。

### 11.4.2 Reset Query（Type 2）与 Cache Response（Type 3）

- Router 启动或失配时发 `Reset Query` 请求全量。
- Cache 回复 `Cache Response`，随后发送全量 payload，最后 `End of Data`。

### 11.4.3 Serial Query（Type 1）

- Router 持有上次 `Session ID + Serial` 时请求增量。
- Cache 若可提供增量：返回变化集。
- Cache 若无法从该 serial 补增量：返回 `Cache Reset`，要求 Router 走全量。

### 11.4.4 Prefix / Router Key / ASPA payload

- `IPv4 Prefix`（Type 4）/ `IPv6 Prefix`（Type 6）：表示 VRP 的 announce/withdraw。
- `Router Key`（Type 9，v1+）：表示 BGPsec Router Key 的 announce/withdraw。
- `ASPA`（Type 11，v2 草案）：表示 ASPA 数据单元的 announce/withdraw。

语义要点（v1 / v2 草案）：
- 对同一 payload 键（如 Prefix 四元组、Router Key 三元组、ASPA customer 键）应维护清晰的替换/撤销关系。
- Cache 负责把历史变化“合并简化”后再发给 Router，避免无意义抖动。

### 11.4.5 End of Data（Type 7）

- 标识一次响应结束，并给出当前 serial。
- v0：不含定时器字段。
- v1/v2：携带 `Refresh Interval`、`Retry Interval`、`Expire Interval`。

## 11.5 协议时序

### 11.5.1 初始同步（Full Sync）

1. Router 建连后发 `Reset Query`（带支持的协议版本）。
2. Cache 回 `Cache Response`。
3. Cache 按规范发送 payload 集合。
4. Cache 发 `End of Data` 收尾。

### 11.5.2 增量同步（Incremental Sync）

1. Router 发 `Serial Query(session_id, serial)`。
2. Cache 若可增量，返回变化并以 `End of Data` 收尾。
3. 若不可增量，返回 `Cache Reset`；Router 退回 Full Sync。

## 11.6 版本协商与降级

- Router 每次新连接必须由 `Reset Query` 或 `Serial Query` 启动，携带其协议版本。
- 双方在协商完成后，本连接内版本固定。
- 遇到不支持版本时，可按规范降级（例如 v1 对 v0、v2 对 v1/v0）或返回 `Unsupported Protocol Version` 后断开。
- 协商期若收到 `Serial Notify`，Router 应按规范兼容处理（通常忽略，待协商完成）。

## 11.7 计时器与失效（v1/v2）

`End of Data` 下发三个参数：
- `Refresh Interval`：多久后主动刷新。
- `Retry Interval`：失败后重试间隔。
- `Expire Interval`：本地数据最长可保留时长。

规范边界（RFC 8210）：
- Refresh: 1 .. 86400（推荐 3600）
- Retry: 1 .. 7200（推荐 600）
- Expire: 600 .. 172800（推荐 7200）
- 且 `Expire` 必须大于 `Refresh` 和 `Retry`。

## 11.8 Version 2（草案）新增关注点

### 11.8.1 ASPA PDU

- 新增 ASPA 传输能力（Type 11）。
- 针对同一 customer ASN，Cache 需向 Router 提供一致且可替换的 ASPA 视图。

### 11.8.2 排序与事务

- 草案新增 race 条件说明（如前缀替换、撤销先后导致短暂误判）。
- 对 Cache 输出 payload 的顺序提出约束。
- 建议 Router 使用“事务式应用”（例如接收到完整响应后再切换生效）降低中间态影响。

## 11.9 传输与安全

规范定义可承载于多种传输：
- SSH
- TLS
- TCP MD5
- TCP-AO

安全原则：
- Router 与 Cache 之间必须建立可信关系。
- 需要完整性/机密性时优先使用具备认证与加密能力的传输。
- 若使用普通 TCP，部署上应限制在可信受控网络中。

## 11.10 参考文献

- RFC 6810: https://www.rfc-editor.org/rfc/rfc6810.html
- RFC 8210: https://www.rfc-editor.org/rfc/rfc8210.html
- draft-ietf-sidrops-8210bis-25: https://www.ietf.org/archive/id/draft-ietf-sidrops-8210bis-25.html
