路由表与最长前缀匹配
复习
- 路由器与逐跳转发:路由器只负责决定下一跳
- 子网与 CIDR:地址用“前缀长度”表示一个范围
- IP 地址:由网络部分与主机部分构成
TL;DR
- 路由表保存“目的网络到下一跳”的对应关系
- 一个目的地址可能匹配多条表项,此时选前缀最长的那条
- 最长前缀匹配体现了“越具体越优先”
- 默认路由是前缀长度为 0 的兜底表项
正文
上一章说,路由器查表决定下一跳。那这张表长什么样、又该怎么查?
一条条“去某个网络,走某个方向”
路由表里存的,大致是“目的网络 → 下一跳”。比如:
| 目的网络 | 下一跳 |
|---|---|
10.0.0.0/8 | 路由器 A |
10.1.0.0/16 | 路由器 B |
10.1.2.0/24 | 路由器 C |
当目的地址是 10.1.2.5 时,仔细一看,它同时满足这三条:前 8 位对得上 /8,前 16 位对得上 /16,前 24 位也对得上 /24。
一个地址匹配了多条表项,该听谁的?
越具体,越优先
规则是:选前缀最长的那一条。
道理很自然。前缀越长,描述的范围越小、越具体,也就越贴近“这个地址真正所在的位置”。上面的例子里,/24 最长,所以选路由器 C。
这就像寄信:如果同时有“朝阳区,北京”和“朝阳区某街道某号,北京”两条规则,显然该用更具体的那条。最长前缀匹配,本质上是让更精确的信息压过更笼统的信息。
兜底的那一条
还有一种特殊表项,叫默认路由,写作 0.0.0.0/0。它的前缀长度为 0,意味着“任何地址都能匹配”,相当于一句“其他情况都往这边走”。
它的作用是兜底:对于那些路由表里没有明确记录的目的地,就统统交给默认网关。这就像“地址不详的邮件,一律送总部分拣”,避免因为查不到而完全无从下手。
思考题 1
当一个目的地址匹配了多条路由表项时,为什么选择前缀最长的那条?
思考题 2
默认路由
0.0.0.0/0是一种怎样的特殊表项?它为什么总是“最后才用”?
小结
知识点
- 路由表以“目的网络到下一跳”为核心
- 多条匹配时选最长前缀
- 最长前缀体现“越具体越优先”
- 默认路由是前缀为 0 的兜底项
参考资料
- Wikipedia(zh):路由表:记录目的网络与下一跳对应关系的表
- Wikipedia(zh):最长前缀匹配:多条路由匹配时选最具体的一条
思考题答案(仅供参考)
思考题 1
因为前缀越长,表示的范围越小、越具体,越可能真正对应目标所在的位置。选用最具体的表项,转发方向就更精确;若用笼统的表项,包可能被引向错误的方向。
思考题 2
它的前缀长度为 0,任何地址都能与它匹配,代表“其余所有目的地都走这里”。正因为它最笼统,只有在没有任何更具体表项匹配时才会被选中,因此相当于最后的兜底。
协议
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。
封面图
设计师 | 南国微雪