路由表为什么按最长前缀匹配?默认路由和精确路由怎么选?
简化版
路由器转发 IP 包时,会在路由表中查找能匹配目的 IP 的路由项,并选择前缀最长的一条,这叫最长前缀匹配。前缀越长,表示匹配范围越小、规则越具体。例如目的 IP 同时匹配 10.0.0.0/8、10.1.0.0/16、10.1.2.0/24,会选择 /24。默认路由 0.0.0.0/0 匹配所有 IPv4 地址,但前缀最短,只有没有更具体路由时才使用。
详细版
最长前缀匹配让路由既能聚合,又能例外覆盖。
| 路由项 | 匹配范围 | 优先级 |
|---|---|---|
| 10.1.2.0/24 | 10.1.2.x | 更具体 |
| 10.1.0.0/16 | 10.1.x.x | 中等 |
| 10.0.0.0/8 | 10.x.x.x | 更泛化 |
| 0.0.0.0/0 | 所有 IPv4 | 默认兜底 |
目的地址 10.1.2.3 会选 /24,目的地址 10.1.9.8 会选 /16,目的地址 8.8.8.8 如果没有其他匹配,会走默认路由。若最长前缀一样,还会比较路由优先级、metric、管理距离等策略。
完整版教学
一、路由表不是从上往下随便匹配
路由器收到 IP 包后,核心动作是:
读取目的 IP -> 查路由表 -> 找下一跳/出接口 -> 重新封装二层帧转发
如果路由表里有多条规则都能匹配同一个目的 IP,必须有明确选择规则。最长前缀匹配就是最基础的选择规则:选择最具体的网段。
二、为什么前缀越长越具体
CIDR 中 /n 表示前 n 位固定。n 越大,固定的网络位越多,可匹配的地址越少。
10.0.0.0/8 -> 10.*.*.* 范围很大
10.1.0.0/16 -> 10.1.*.* 更具体
10.1.2.0/24 -> 10.1.2.* 更具体
10.1.2.3/32 -> 单个主机 最具体
所以最长前缀不是字符串最长,而是网络前缀位数最长。
三、一个具体例子
路由表如下:
| 目的网段 | 下一跳 |
|---|---|
| 10.0.0.0/8 | A |
| 10.1.0.0/16 | B |
| 10.1.2.0/24 | C |
| 0.0.0.0/0 | D |
目的 IP 是 10.1.2.3:
匹配 10.0.0.0/8
匹配 10.1.0.0/16
匹配 10.1.2.0/24
匹配 0.0.0.0/0
选择最长前缀 /24 -> 下一跳 C
目的 IP 是 10.1.9.8:
匹配 /8 和 /16,不匹配 /24
选择 /16 -> 下一跳 B
四、默认路由为什么是兜底
默认路由写作:
0.0.0.0/0
/0 表示没有任何固定网络位,所以它能匹配所有 IPv4 地址。但它也是最不具体的规则,因此只有没有更具体路由时才被选中。
默认路由不是优先级最高的路由,而是匹配范围最大、前缀最短的兜底路由。
五、最长前缀相同时还要看什么
如果多条路由前缀长度一样,设备还会继续比较其他属性:
- 路由来源优先级或管理距离;
- metric 或 cost;
- ECMP 等价多路径;
- 策略路由规则;
- 出接口状态。
例如两条 10.1.2.0/24 路由都存在,可能选择 metric 更小的,也可能做等价负载分担。
六、工程中为什么需要泛化和例外
最长前缀匹配让网络规划很灵活:
- 用大网段聚合路由,减少路由表规模;
- 用小网段做例外流量转发;
- 默认路由兜底访问互联网;
- 专线或 VPN 网段用更具体路由覆盖默认出口。
例如公司默认所有公网流量走互联网出口,但 10.20.0.0/16 走专线。只要专线路由前缀比默认路由更长,就会优先命中专线。
七、常见误区与追问
- 误区:路由器选择最先配置的匹配路由。 通常先按最长前缀匹配选择最具体路由。
- 误区:默认路由优先级最高。 默认路由
/0前缀最短,是没有更具体匹配时的兜底。 - 误区:/8 比 /24 更精确。
/24固定更多网络位,匹配范围更小,更精确。 - 误区:最长前缀相同就随机选。 还会看 metric、管理距离、策略路由或 ECMP。
- 追问:目的 IP 同时匹配 /16 和 /24 选哪个? 选 /24,因为前缀更长、更具体。
- 追问:0.0.0.0/0 为什么能匹配所有地址? 因为前缀长度为 0,没有任何固定网络位。
八、加强记忆
最长前缀匹配就是“越具体越优先”。/24 比 /16 具体,/32 是单主机最具体,0.0.0.0/0 是兜底默认路由。路由选择先看是否匹配,再选最长前缀;前缀相同再比较 metric、管理距离或策略。面试中用 10.1.2.3 同时匹配 /8、/16、/24 的例子,基本就能讲清楚。