能匹配的多条路由里,前缀最长的赢——度量值在这一步完全不参与。 默认路由 0.0.0.0/0 一点都不特殊,它只是「最短的那条」。
上一节看清了路由表的列,这一节看「怎么从里面挑一行」。 这条规则是三层转发里最硬的一条,也是最容易出隐蔽故障的一条。
一、几条路由是层层包含的
0.0.0.0/0 包含一切,10.0.0.0/8 包含 10 开头的一切,10.1.0.0/16 又包含 10.1 开头的一切。 越具体,前缀越长。
路由 含义 层级
0.0.0.0/0 默认路由,兜底 1(最短) 10.0.0.0/8 整个 10 网 2 10.1.0.0/16 10.1 这一段 3 10.1.2.0/24 10.1.2 这一段 4 10.1.2.128/25 10.1.2 的上半段 5(最长)
注意「包含」是严格的:/25 只覆盖 .128 到 .255,所以 10.1.2.50 根本不匹配它, 得往下落到 /24 上。
二、同一个目的地址,可能同时命中五条
一个地址只会有一行胜出,但「能匹配」的可能有好几行。查找的过程就是把所有能匹配的找出来, 取前缀最长的那条。
这就是为什么「加一条更具体的路由,流量就改道了」——不是那条路由度量更好,是它前缀更长。
也因此,「改度量值」与「加更细的路由」是两种完全不同手段:前者在同一前缀的多条路径之间选, 后者直接换一条不同的前缀来抢。
三、主机其实只做两分支判断
主机上没有一整套路由表,它只问一个问题:「目的地址与我在同一个网段吗?」
是 → 直接 ARP 找对方 MAC,自己发出去。不是 → 整个包丢给默认网关,由网关去做最长匹配。
所以「默认网关」在主机的路由表里就是一条 0.0.0.0/0,下一跳写的是网关地址。 它不是特权,只是一条兜底路由。
四、动手 Demo:一个目的地址匹配四条路由,谁赢
这段列出五条层层包含的路由,再拿五个目的地址去查,逐个给出能匹配的路由、胜出的那条、以及为什么。
for dst in addrs:
hit = [r for r in routes if match(dst, r)]
win = max(hit, key=lambda r: r.plen)
T([dst, len(hit), win, why], [0, 0, 0, 0])
实跑输出:
--------------------------------------------------------------------
一个目的地址匹配四条路由,谁赢
--------------------------------------------------------------------
**最长匹配是三层转发最重要的一条规则**:能匹配的多条路由里,
**前缀最长(最具体)的那条胜出,与度量值无关。**
**先看清这几条的关系**:它们是层层包含的。
路由 含义 层级
----------------------------------------------
0.0.0.0/0 默认路由 1
10.0.0.0/8 整个 10 网 2
10.1.0.0/16 10.1 这一段 3
10.1.2.0/24 10.1.2 这一段 4
10.1.2.128/25 10.1.2 的上半段 5
**现在拿四个目的地址去查**:
目的地址 能匹配的路由 胜出 为什么
------------------------------------------------------------------------
10.1.2.200 全部 5 条 10.1.2.128/25 前缀最长(25 位)
10.1.2.50 前 4 条 10.1.2.0/24 第 5 条不匹配
10.1.9.9 前 3 条 10.1.0.0/16 更长的都不匹配
10.9.9.9 前 2 条 10.0.0.0/8 只有 /8 与前缀匹配
8.8.8.8 只有默认路由 0.0.0.0/0 唯一匹配
**第 2 行最值得看**:10.1.2.50 不匹配 /25,因为 /25 只覆盖 128 到 255。**所以它落到 /24 上。**
**「最长匹配」这个规则解释了一件常见的事**:为什么「加了一条更具体的路由,
流量就改道了」——**不是那条路由度量更好,是它前缀更长。**
**反过来也解释了一个坑**:想用「更具体的路由」做引流(比如把某个 IP 引到旁路设备),
**这个办法是有效的**,而且比改度量值更确定。
**但它也是「最难查的故障」之一**——路由表里多了一条 /32,谁也看不见。
第二行最值得看:10.1.2.50 能匹配四条、不匹配 /25, 所以它落到 /24 上,而不是「落到默认路由」。这一步是很多人推错的地方。
最后一行 8.8.8.8 只匹配默认路由,说明默认路由的作用是「谁都不要的给我」。 没有默认路由的网段,访问未知地址会直接回「网络不可达」。
「加一条 /32 引流」这个用法要警惕:它确实生效,而且比改度量值确定, 但它也是「最难查的故障」之一——路由表里多了一条 /32,看的人不逐行读根本发现不了。
30 秒实验
- 在你的电脑上打印路由表,找出那条 0.0.0.0/0。
- 看它是不是指向默认网关,掩码是不是 0.0.0.0。
- 想一想:为什么主机不需要一张完整的路由表?
常见误区
- 以为默认网关是「特殊设备」。它就是一条 0.0.0.0/0 的路由。
- 以为能匹配就一定按度量选。前缀最长优先,度量不参与。
- 以为主机也做最长匹配。主机只判断「同不同网段」,两分支。
自测三问(点开对答案)
1. 多条路由都能匹配时,谁胜出? —— 前缀最长(最具体)的那条,与度量值无关。 2. 10.1.2.50 为什么不匹配 10.1.2.128/25? —— /25 只覆盖 .128 到 .255,.50 不在这个范围内。 3. 主机的默认网关在路由表里是什么样子? —— 一条 0.0.0.0/0 的路由,下一跳是网关地址。下一节:路由怎么进表——先看最笨也最可控的办法,静态路由。
- ☐ (本节完,下一节 03.05.05 静态路由选择)