IP 地址、子网与路由表:下一跳到底是怎么决定的

前言

学 IP 时最重要的问题不是“IP 地址长什么样”,而是:

有了目标 IP 以后,操作系统怎么知道下一步该把包交给谁?

这背后涉及几个概念:

  • IP 地址
  • 子网掩码
  • CIDR
  • 默认网关
  • 路由表
  • 下一跳
  • 最长前缀匹配

这篇文章先把这些概念串成一条线。


1. IP 地址是什么

IP 地址用来标识网络中的主机或网络接口。

常见 IPv4 地址长这样:

1
2
192.168.1.10
93.184.216.34

可以先把它理解成:

1
IP = 网络里的地址

但更准确一点:

IP 地址不仅表示“是谁”,还隐含“它在哪个网络里”。

要判断一个 IP 属于哪个网络,就需要子网掩码或 CIDR。


2. IPv4 和 CIDR

IPv4 本质上是 32 位二进制数,只是通常写成四段十进制。

比如:

1
192.168.1.10

对应二进制大概是:

1
11000000.10101000.00000001.00001010

每一段 8 位,所以每段范围是 0 ~ 255。

CIDR 写法常见是:

1
192.168.1.0/24

/24 的意思是:

1
2
前 24 位是网络部分
后 8 位是主机部分

IPv4 总共 32 位,所以这个网段理论上有:

1
2^8 = 256 个地址

常见可用主机地址是:

1
192.168.1.1 ~ 192.168.1.254

其中:

1
2
192.168.1.0:网络地址
192.168.1.255:广播地址

/24 对应的子网掩码是:

1
255.255.255.0

3. 子网掩码是干嘛的

子网掩码用来判断:

1
目标 IP 和我是不是在同一个网段?

比如你的电脑:

1
2
IP:192.168.1.10
子网掩码:255.255.255.0

等价于:

1
192.168.1.10/24

访问:

1
192.168.1.20

系统判断它也属于:

1
192.168.1.0/24

所以这是同网段通信,可以直接 ARP 查询目标主机的 MAC。

访问:

1
93.184.216.34

系统判断它不属于本地网段,于是要交给默认网关。


4. 同网段和不同网段

同网段:

1
192.168.1.10 -> 192.168.1.20

流程是:

1
2
查目标 IP 的 MAC
直接发给目标设备

不同网段:

1
192.168.1.10 -> 93.184.216.34

流程是:

1
2
3
查默认网关的 MAC
先发给路由器
让路由器继续转发

所以:

1
2
目标在本地局域网:ARP 查询目标 IP 的 MAC
目标不在本地局域网:ARP 查询下一跳 / 默认网关的 MAC

这也是理解 MAC 和 IP 的关键:

1
2
IP 管最终目标
MAC 管当前这一跳

5. 默认网关是什么

默认网关就是:

1
当目标不在本地网段时,把包交给谁

家庭网络里通常是:

1
192.168.1.1

也就是你的家用路由器。

可以这样理解:

1
2
本地认识的人,我直接找。
外面的人,我交给门口的路由器。

如果没有默认网关,你通常只能访问本地局域网,无法访问公网。


6. 路由表是什么

路由表就是一张:

1
目标网段 -> 下一跳 / 出口

的表。

简化后类似:

1
2
3
目标网段              下一跳 / 出口
192.168.1.0/24 直接发送
0.0.0.0/0 默认网关 192.168.1.1

当你的电脑要访问一个目标 IP,会拿目标 IP 去匹配这张表。

比如访问:

1
192.168.1.20

命中:

1
192.168.1.0/24 -> 直接发送

访问:

1
93.184.216.34

命中:

1
0.0.0.0/0 -> 默认网关 192.168.1.1

0.0.0.0/0 表示:

1
所有没有更具体规则匹配到的目标

也就是兜底路由。


7. 下一跳是怎么决定的

客户端并不是先问路由器:

1
这个目标 IP 的下一跳是谁?

而是自己查本机路由表。

电脑联网时,通常通过 DHCP 拿到这些信息:

1
2
3
4
本机 IP:192.168.1.10
子网掩码:255.255.255.0
默认网关:192.168.1.1
DNS 服务器:192.168.1.1

操作系统据此生成路由表。

所以当目标不在本地网段时,本机路由表已经知道:

1
下一跳 = 默认网关 192.168.1.1

然后数据链路层再通过 ARP 查询:

1
192.168.1.1 的 MAC 是多少?

拿到网关 MAC 后,才封装当前这一跳的二层帧。


8. 最长前缀匹配

如果多条路由规则都能匹配目标 IP,系统会选择最具体的一条。

比如路由表:

1
2
3
4
5
目标网段              下一跳
10.0.0.0/8 网关 A
10.1.0.0/16 网关 B
10.1.2.0/24 网关 C
0.0.0.0/0 默认网关

访问:

1
10.1.2.34

这些规则都能匹配:

1
2
3
4
10.0.0.0/8
10.1.0.0/16
10.1.2.0/24
0.0.0.0/0

但系统会选:

1
10.1.2.0/24 -> 网关 C

因为 /24 最具体。

这叫:

1
最长前缀匹配

可以理解成:

谁匹配得更精确,就听谁的。


9. 下一跳必须能直接到达

路由表里的下一跳不是随便写一个远方地址。

下一跳必须是当前设备某个出口接口能够直接到达的邻居。

比如你的电脑:

1
2
IP:192.168.1.10/24
默认网关:192.168.1.1

192.168.1.1 和你在同一个局域网,所以你可以 ARP 到它的 MAC。

如果默认网关写成:

1
8.8.8.8

通常是不行的,因为你的电脑没法在本地局域网里 ARP 到公网的 8.8.8.8。

所以:

下一跳 IP 必须是当前链路上可直接交付的邻居。


10. 路由器也有路由表

客户端有路由表,路由器也有路由表。

客户端查路由表决定:

1
第一跳交给谁

路由器查路由表决定:

1
下一跳再交给谁

比如路由器收到一个包:

1
目标 IP:93.184.216.34

它查自己的路由表:

1
2
3
目标网段              下一跳
93.184.216.0/24 10.0.0.2
0.0.0.0/0 运营商网关

然后决定:

1
2
下一跳 = 10.0.0.2
出口 = WAN 口

接着它再通过 ARP 查:

1
10.0.0.2 的 MAC 是多少?

最后重新封装新的二层帧发出去。


11. 私网 IP、公网 IP 与 NAT

常见私网 IP 段:

1
2
3
10.0.0.0/8
172.16.0.0/12
192.168.0.0/16

这些地址可以在不同内网重复使用,但不能直接在公网路由。

比如很多家庭网络都是:

1
192.168.1.x

家里设备访问公网时,家用路由器通常会做 NAT:

1
192.168.1.10:52341 -> 公网 IP:新端口

公网服务器看到的通常不是你的内网 IP,而是你家路由器的公网出口 IP。

注意:

跨网段不等于一定 NAT。

跨网段一定需要路由,但 NAT 主要发生在私网访问公网,或者某些网络边界需要地址转换的场景。


12. 一句话总结

可以把 IP、子网、路由表、下一跳压成这几句话:

1
2
3
4
5
6
7
8
IP 地址表示网络位置。
子网掩码判断目标是不是本地网段。
同网段直接 ARP 目标 IP。
不同网段交给默认网关。
路由表决定下一跳。
多条路由匹配时,选最长前缀。
下一跳必须是当前链路上能直接到达的邻居。
路由器也靠路由表一跳一跳转发。

最短记法:

子网判断近不近,路由表决定下一跳,ARP 负责把下一跳 IP 变成 MAC。