Keyboard shortcuts

Press or to navigate between chapters

Press ? to show this help

Press Esc to hide this help

路由表与最长前缀匹配

复习

  • 路由器与逐跳转发:路由器只负责决定下一跳
  • 子网与 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 的兜底项

参考资料

  1. Wikipedia(zh):路由表:记录目的网络与下一跳对应关系的表
  2. Wikipedia(zh):最长前缀匹配:多条路由匹配时选最具体的一条

思考题答案(仅供参考)

思考题 1

  因为前缀越长,表示的范围越小、越具体,越可能真正对应目标所在的位置。选用最具体的表项,转发方向就更精确;若用笼统的表项,包可能被引向错误的方向。

思考题 2

  它的前缀长度为 0,任何地址都能与它匹配,代表“其余所有目的地都走这里”。正因为它最笼统,只有在没有任何更具体表项匹配时才会被选中,因此相当于最后的兜底。

协议

  本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。

封面图

设计师 | 南国微雪