前言
学 IP 时最重要的问题不是“IP 地址长什么样”,而是:
有了目标 IP 以后,操作系统怎么知道下一步该把包交给谁?
这背后涉及几个概念:
- IP 地址
- 子网掩码
- CIDR
- 默认网关
- 路由表
- 下一跳
- 最长前缀匹配
这篇文章先把这些概念串成一条线。
1. IP 地址是什么
IP 地址用来标识网络中的主机或网络接口。
常见 IPv4 地址长这样:
1 | 192.168.1.10 |
可以先把它理解成:
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 | 前 24 位是网络部分 |
IPv4 总共 32 位,所以这个网段理论上有:
1 | 2^8 = 256 个地址 |
常见可用主机地址是:
1 | 192.168.1.1 ~ 192.168.1.254 |
其中:
1 | 192.168.1.0:网络地址 |
/24 对应的子网掩码是:
1 | 255.255.255.0 |
3. 子网掩码是干嘛的
子网掩码用来判断:
1 | 目标 IP 和我是不是在同一个网段? |
比如你的电脑:
1 | IP:192.168.1.10 |
等价于:
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 | 查目标 IP 的 MAC |
不同网段:
1 | 192.168.1.10 -> 93.184.216.34 |
流程是:
1 | 查默认网关的 MAC |
所以:
1 | 目标在本地局域网:ARP 查询目标 IP 的 MAC |
这也是理解 MAC 和 IP 的关键:
1 | IP 管最终目标 |
5. 默认网关是什么
默认网关就是:
1 | 当目标不在本地网段时,把包交给谁 |
家庭网络里通常是:
1 | 192.168.1.1 |
也就是你的家用路由器。
可以这样理解:
1 | 本地认识的人,我直接找。 |
如果没有默认网关,你通常只能访问本地局域网,无法访问公网。
6. 路由表是什么
路由表就是一张:
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 | 本机 IP:192.168.1.10 |
操作系统据此生成路由表。
所以当目标不在本地网段时,本机路由表已经知道:
1 | 下一跳 = 默认网关 192.168.1.1 |
然后数据链路层再通过 ARP 查询:
1 | 192.168.1.1 的 MAC 是多少? |
拿到网关 MAC 后,才封装当前这一跳的二层帧。
8. 最长前缀匹配
如果多条路由规则都能匹配目标 IP,系统会选择最具体的一条。
比如路由表:
1 | 目标网段 下一跳 |
访问:
1 | 10.1.2.34 |
这些规则都能匹配:
1 | 10.0.0.0/8 |
但系统会选:
1 | 10.1.2.0/24 -> 网关 C |
因为 /24 最具体。
这叫:
1 | 最长前缀匹配 |
可以理解成:
谁匹配得更精确,就听谁的。
9. 下一跳必须能直接到达
路由表里的下一跳不是随便写一个远方地址。
下一跳必须是当前设备某个出口接口能够直接到达的邻居。
比如你的电脑:
1 | IP:192.168.1.10/24 |
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 | 目标网段 下一跳 |
然后决定:
1 | 下一跳 = 10.0.0.2 |
接着它再通过 ARP 查:
1 | 10.0.0.2 的 MAC 是多少? |
最后重新封装新的二层帧发出去。
11. 私网 IP、公网 IP 与 NAT
常见私网 IP 段:
1 | 10.0.0.0/8 |
这些地址可以在不同内网重复使用,但不能直接在公网路由。
比如很多家庭网络都是:
1 | 192.168.1.x |
家里设备访问公网时,家用路由器通常会做 NAT:
1 | 192.168.1.10:52341 -> 公网 IP:新端口 |
公网服务器看到的通常不是你的内网 IP,而是你家路由器的公网出口 IP。
注意:
跨网段不等于一定 NAT。
跨网段一定需要路由,但 NAT 主要发生在私网访问公网,或者某些网络边界需要地址转换的场景。
12. 一句话总结
可以把 IP、子网、路由表、下一跳压成这几句话:
1 | IP 地址表示网络位置。 |
最短记法:
子网判断近不近,路由表决定下一跳,ARP 负责把下一跳 IP 变成 MAC。