
Hat
译者
⚠️ 注意
如果您发现了错误,欢迎 参与贡献。
💡 摘要 (Powered by OpenAI)
本文深入介绍了 BIRD 路由表的内部设计,包括 net/rte/rta 核心数据结构、最佳路由链表机制,以及递归下一跳解析、Flowspec 验证和 RPKI 重验证三种跨表自动更新机制。
路由表是 BIRD 中最重要的数据结构。它们保存着所有已知网络、关联路由及其属性的信息。
BIRD 拥有多张路由表:
每张表本质是一个 FIB,包含描述各个目的网络的条目。
网络条目 (net):每个目的地网络由一个 net 结构表示,其下挂载一条单向链表的路由条目 (rte):
net → rte(best) → rte → rte → ...💡 译者注
BIRD 的路由表设计遵循"一网络多路径"的模型。对于同一个目的网络,可以同时存在多条路由(如通过不同邻居学到的 BGP 路由),但只有最佳的那条会被实际使用。其他路由作为备份,当最佳路由失效时自动切换。这也是 ECMP (等价多路径) 实现的基础:多条度量值相等的最佳路由可同时用于转发。
路由条目 (rte) 包含:
| 字段 | 说明 |
|---|---|
net + src | 路由表中标识路由的唯一键 (key) |
rta 指针 | 指向路由属性结构,保存路由的主要数据 |
route id | 路由标识符 |
REF_* 标志 | 引用计数和 COW (Copy-on-Write) 标志 |
pflags | 协议特定标志,仅由协议钩子使用,非路由表核心数据 |
路由属性 (rta):保存路由的实际属性信息,包括下一跳、度量值、BGP 路径等。多个 rte 可共享同一个 rta(通过引用计数),这是 BIRD 节省内存的重要机制。
BIRD 实现了三种允许一张路由表(dst)中的路由随另一张表(src)变更而自动更新的机制:
问题:dst 表的路由具有间接下一跳地址(如 BGP 的 NEXT_HOP 属性),需通过 src 表中的 IGP 路由解析出直接下一跳。
实现:
src 表
└── hostcache ─── hostentry[]
│ └── trie (前缀树)
│
└── hostentry ← 多个递归路由可共享
└── 解析结果 (直接下一跳)rt_notify_hostcache() — 当 src 表最佳路由变更时,立即通过 trie 检查是否影响被跟踪的下一跳rt_update_hostcache() — 异步遍历所有 hostentry,重新解析rt_next_hop_update() — 若 hostentry 解析有变,异步遍历 dst 表所有路由更新下一跳💡 译者注
这种"双重遍历"(先遍历 hostcache,再遍历 dst 表)看似低效,但实际上是无反向索引情况下的最优解。由于路由和下一跳之间没有直接的"路由→受影响下一跳"或"下一跳→其路由"的映射表,只能通过全表扫描来发现变更。不过,trie 的存在确保了只有真正相关的变更才会触发全表扫描。
问题:Flowspec 路由的有效性取决于其网络前缀在 IP 路由表中的解析结果。
与递归下一跳类似但更简单——无需中间 hostcache/hostentry(因为不同 flow 共享相同网络前缀的概率远低于路由共享相同下一跳)。
数据流:
rt_flowspec_notify() — 立即检查所有关联 dst 表rt_next_hop_update() — 异步重验证 flowspec 路由并重建 trie最简单的机制。src 表维护订阅者列表,变更发生后等待稳定时间 (settle time) 再通知。与上面不同,dst 不是表而是通道 (channel),通过过滤器重新馈送路由。
| 函数 | 说明 |
|---|---|
net_roa_check(tab, n, asn) | 在 ROA 表中按 RFC 6483 验证路由来源,返回 ROA_VALID/ROA_INVALID/ROA_UNKNOWN |
aspa_check(tab, path, force_upstream) | 在 ASPA 表中按 AS路径验证,实现 draft-ietf-sidrops-aspa-verification |
rte_find(net, src) | 在指定网络下查找特定来源的路由条目 |

译者
原文作者: <Ondrej Filip>, <Martin Mares>, <Maria Matejka>, <Ondrej Zajicek>
原文链接: https://bird.network.cz/?get_doc&v=20&f=prog-2.html#ss2.2
原文标题: 2.2 Routing tables
遵循协议: CC BY-NC-SA 4.0
译者: hat
翻译时间: 2026-05-01
更新时间: 2026-05-01
本文链接: https://bird.xmsl.dev/docs/developer-guide/2-2-routing-tables.html