🌐 第六章 路由
📄 一句话概括

路由表不是路由器的专利——你自己的电脑里就有一张,而且每次发数据时都在用它。本章开头那句"不在同网段就交给默认网关"(6.1),落到实处就是 PC 路由表里的那条 0.0.0.0 0.0.0.0 → 默认网关:你在控制面板里填的"默认网关",和路由表里的"默认路由",是同一件事的两个入口。PC 与路由器的表结构完全一样(目标网段 / 掩码 / 下一跳 / 接口 / 跃点数),差别只在行数(PC 通常就直连 + 默认几条)与是否替别人转发(PC 只发自己的包)。多条默认路由共存时,靠跃点数分胜负——这也解释了"插着网线又开着 Wi-Fi,到底走哪条"。

📝 本节和前面几节的关系

第六章兜了一整圈,最后回到最初那台设备——你自己的 PC。6.1 说"交给默认网关"、6.3 说"逐行 AND 比掩码、最长前缀匹配"、6.11 说"默认路由永远命中"、6.9 说"人也手写 route add",这些话在前面都是站在路由器的视角讲的;本节把它们原封不动地搬到 PC 上,你会发现一个字都不用改。换句话说:"路由"不是某种设备的专属功能,而是每一台装了 TCP/IP 的设备都要做的事——只是 PC 通常只替自己算账,路由器才替所有人中转。

一、PC 也是一台"路由器",只是不替别人转发

先破一个直觉:很多人以为路由表躺在路由器机箱里,和普通电脑无关。事实恰恰相反——

普通 PC 路由器
替谁转发 只发自己产生的包 替任何人中转(转发别人的包)
表的规模 几条(直连 + 默认) 成百上千条(还有静态、动态、聚合)
表的来源 主要是 DHCP 自动下发 直连 + 人写 + 协议自动学(6.7)
表的结构 目标网段 / 掩码 / 下一跳 / 接口 / 度量 一模一样

📌 一句话记住:PC 与路由器的路由表,是同一张表、同一套判定规则;差别只在"管不管别人"。所以"路由器因为路由表而得名"这话只说对了一半——表,谁都有。

二、route print 一屏认亲(第一张配图)

打开命令提示符,敲一条命令:

route print

(同样效果的还有 netstat -rn;PowerShell 里是 Get-NetRoute。)

输出的 IPv4 路由表通常长这样——每台机器略有不同,但七行里总有这几类:

网络目标 掩码 网关 接口 跃点数 这一行是什么
0.0.0.0 0.0.0.0 192.168.1.1 192.168.1.100 25 默认路由——兜底的那条,网关列就是默认网关
127.0.0.0 255.0.0.0 在链路上 127.0.0.1 331 回环:自己 ping 自己(6.8 提过的直连特例)
192.168.1.0 255.255.255.0 在链路上 192.168.1.100 281 本网段直连:这一段里谁都能直接找到(6.8)
192.168.1.100 255.255.255.255 在链路上 192.168.1.100 281 本机地址:指向自己
192.168.1.255 255.255.255.255 在链路上 192.168.1.100 281 网段广播:发给本段所有人
224.0.0.0 240.0.0.0 在链路上 192.168.1.100 281 组播地址段
255.255.255.255 255.255.255.255 在链路上 192.168.1.100 281 受限广播:发给本段所有人

五列的含义与路由器完全一致(6.3 的四件套 + 度量):

两张表的最长前缀匹配同样在起作用:你要访问 192.168.1.50,虽然 0.0.0.0(默认路由)也"命中",但 192.168.1.0/24 这条前缀更长、更具体——先命中它(6.3 的规则在 PC 上原样生效)。所以你 ping 同楼层同事,包根本不会去打扰网关。

📌 注意最后一列的数字大小有迷惑性:直连行的跃点数常比默认路由更大(如 281 对 25),但这完全不影响它——跃点数只在"两条路由争同一个目的地"时才有意义,而直连与默认路由根本不竞争(前缀长度不同,最长前缀匹配先分出胜负)。

三、默认网关的两副面孔(第二张配图)

现在把本章最大的一个"名实之辨"说清:

视角 你看到的 它的样子
配置视角(人在哪填) 控制面板 / ipconfig 里的「默认网关」;家里则由路由器经 DHCP 自动下发(3.23) 一个 IP 地址,如 192.168.1.1
表视角(它落在哪) route print 里的 0.0.0.0 0.0.0.0 → 192.168.1.1 那一行 一条默认路由(6.11)

两边的 IP 是同一个数。所以:

"填默认网关" 就是 "写一条默认路由"——同一个动作的两种说法。

这就解释了三件之前只能"记结论"的事:

  1. 为什么网关填错就上不了外网(6.1)?——因为那条 0.0.0.0 行的下一跳指错了,所有"本网段管不了"的包都被送去了错误的方向;
  2. 为什么公网上不可能有"0.0.0.0 这台机器"?——因为 0.0.0.0 从来不是一个真实地址,它在这里只是"剩下的全部"这个意思(6.11);
  3. 为什么拔了网线换 Wi-Fi 能自动恢复?——见下节。

四、多条默认路由共存时,谁说了算:跃点数

插着网线、又开着 Wi-Fi 的笔记本,路由表里会出现两条 0.0.0.0:

0.0.0.0  0.0.0.0  192.168.1.1   192.168.1.100   25     ← 有线
0.0.0.0  0.0.0.0  192.168.1.1   192.168.1.101   50     ← Wi-Fi

两条前缀长度相同(都是 0 位),最长前缀匹配这时分不出胜负——于是轮到最后一列:

跃点数(Metric)小的赢。

📌 记住分工:不同目的地的路由之间不比跃点数(谁更具体谁赢,这是最长前缀匹配的活);跃点数只在两条路由争同一个目的地时才说话。

五、PC 的表 vs 路由器的表:同源不同量

PC 的路由表 路由器的路由表
结构 目标 / 掩码 / 下一跳 / 接口 / 度量 完全相同
典型内容 回环 + 直连 + 本机 + 广播 + 默认(约七八条) 直连 + 静态 + 动态 + 聚合 + 默认(可能几十万条)
主要来源 DHCP 下发为主(家用 PC 几乎是全自动) 直连自动 + 人写 + 协议自动学(6.7)
有没有"默认路由" 有,就是默认网关那行 有(6.11)
转发能力 只发自己的包 替所有人中转
边界 一出本机,视角就交给下一台设备 一跳一跳接力(6.1)

顺带把一个小疑问收掉:PC 要不要"路由协议"? 一般不需要——它只有一张网卡、一个出口,一条默认路由就够了。只有当一台主机真的接在多个网络里(服务器多网卡、装了虚拟机网卡),才需要多写几条明细路由。

六、给 PC 手动加一条路由(Demo88 的进阶版)

既然 PC 也有表,那就能像路由器一样手写静态路由(6.9 的动作搬回自己电脑):

route add 10.0.0.0 mask 255.0.0.0 192.168.1.254      临时(重启失效)
route add 10.0.0.0 mask 255.0.0.0 192.168.1.254 -p   永久(写入注册表)
route delete 10.0.0.0                                 删掉

它最典型的用途是"双网卡双网络":

这套"明细走专线、其余走默认"的分流手法,和路由器上做策略路由是同一个思路——只是这次的操作对象是你自己的电脑。

七、动手 Demo(Demo88)

目标:在自己电脑上找到那张表,逐行认亲,并看清"默认网关"与"默认路由"的重合。

A. 找到并读懂你的路由表

route print                          # Windows:一屏看全(含接口列表 + IPv4 路由表)
netstat -rn                          # 同样内容,另一种写法

对账要点:

  1. 找到 0.0.0.0 0.0.0.0 那一行,读出它的"网关"列;
  2. 立刻对照 ipconfig /all 里的「默认网关」——两个数字应当完全相同(这就是本节的核心证据);
  3. 找到 192.168.x.0 255.255.255.0 在链路上 那一行,它的"接口"列应是你自己的 IP。

B. 看清跃点数(多条默认路由时)

Get-NetRoute -AddressFamily IPv4 | Sort-Object RouteMetric |
  Format-Table DestinationPrefix, NextHop, RouteMetric, InterfaceAlias

(Windows PowerShell;Linux 用 ip route show,输出里 default via ... dev eth0 proto dhcp metric 100 一行就是默认路由。)

看到什么算成功:默认路由(0.0.0.0/0)的 RouteMetric 比 Wi-Fi 那条小,且 InterfaceAlias 写着你的有线网卡名。

C. 30 秒实验一:拔掉网线,看默认路由消失

route print | findstr "0.0.0.0"

拔掉网线(或禁用有线网卡)后再看一次:有线那条 0.0.0.0 行消失了,只剩 Wi-Fi 的一条。插回去又回来——路由随链路生灭(Demo77 / Demo78 的现象,这里在 PC 上重演)。

D. 30 秒实验二:亲手加一条、再删掉

(需要管理员权限)

route add 10.0.0.0 mask 255.0.0.0 192.168.1.254
route print | findstr "10.0.0.0"        # 表里多了一行
route delete 10.0.0.0                    # 撕掉

注意:加了这条路由不代表就通了——如果 192.168.1.254 后面并没有通往 10.0.0.0/8 的路,ping 依然不通。表有 ≠ 能通(6.9 Demo79 的同一句结论)。

E. 一个反直觉小测

ping 127.0.0.1        # 通

这只证明你的协议栈活着(回环那条路由管用),完全不能证明网卡、网线、网关有任何一个是好的——因为回环流量根本不出网卡。这也是"ping 127.0.0.1 通但上不了网"常见的原因解释。

八、常见误区

九、动手自测

点开自测(先自己答,再展开) 1. "PC 也是一台路由器"这句话,对在哪、错在哪? 2. `route print` 里那五列分别是什么?与路由器的表相比少了什么列吗? 3. 你 ping 同一网段的同事时,路由表命中哪一条?会用到默认路由吗?为什么? 4. "默认网关"和"默认路由"是同一个东西吗?请各用一句话从两个视角描述它。 5. 为什么 `0.0.0.0` 能"命中一切"?它是一个真实存在的地址吗? 6. 笔记本同时插网线和开 Wi-Fi,表里有两条 `0.0.0.0`,系统怎么决定走哪条? 7. 拔掉网线之后,路由表发生了什么?这和 6.8 讲的直连路由生灭有什么关系? 8. 为什么直连行的跃点数常常比默认路由**大**,却仍然是"优先"的? 9. 给 PC 手写一条路由,最典型的实用场景是什么?为什么它不会把上互联网的流量也抢走? 10. `ping 127.0.0.1` 通,能证明哪些部分正常?不能证明哪些部分正常?

答案:① 对在"它和路由器一样有路由表、一样要做 AND 掩码 + 最长前缀匹配的判定";错在"它不替别人转发",只处理自己产生的包。② 网络目标、网络掩码、网关(下一跳)、接口、跃点数——与路由器表的列一样,不缺;只是 PC 表里通常没有那些动态学来的、聚合出来的行。③ 命中 192.168.x.0/24 那条直连路由(网关列显示"在链路上");不会用到默认路由,因为它前缀更短、被最长前缀匹配淘汰,包直接交给对方(同网段直接交付)。④ 是同一个东西的两个视角:配置视角叫"默认网关"(你填的、DHCP 下发的那个 IP);表视角叫"默认路由"(表里 0.0.0.0/0 那一行的下一跳)。⑤ 因为它的掩码是 0 位——任何地址 AND 0.0.0.0 都得 0.0.0.0,与它的网络目标恒等,所以永远命中;它不是真实地址,只表示"其余的全都"。⑥ 比跃点数:两条前缀长度相同、最长前缀匹配分不出胜负,度量小的优先(Windows 通常让以太网小于 Wi-Fi,所以优先有线)。⑦ 那条默认路由直接从表里消失,只剩 Wi-Fi 那条,于是流量自动改道;这与直连路由"随链路生灭"是同一个机制(无链路则无路)。⑧ 跃点数只在两条路由争同一个目的地(同前缀长度)时才比较;直连与默认路由前缀长度不同,由最长前缀匹配先分胜负,所以直连行的度量数值大也不影响它优先。⑨ 最典型是双网卡双网络:一边公司内网专线、一边 Wi-Fi 上互联网,给内网网段加一条明细路由。因为明细前缀更长,访问内网时它赢;访问互联网时它不命中,就落到默认路由上走 Wi-Fi。⑩ 能证明 TCP/IP 协议栈与回环路由正常;不能证明网卡驱动、网线、交换机、网关、DNS 或外网任何一环正常——回环流量根本不出网卡。

十、下一步学什么

相关笔记