ip - subnet - routing
03. IP、子网与路由
0. 本章先解决什么问题
链路层只能解决相邻设备通信。互联网需要解决更大的问题:
一个包如何跨越多个网络,最终到达目标主机?
IP 和路由解决:
- 主机如何用 IP 地址标识。
- 子网如何划分。
- 路由器如何决定下一跳。
- TTL 为什么存在。
- 默认网关是什么。
- 为什么能 ping 通不代表应用端口通。
先看路由选择的核心规则:目的 IP 在路由表里做最长前缀匹配,命中后才知道下一跳。
这张图怎么读
先看目的 IP,不要先看源 IP。路由器拿目的地址去路由表里匹配,命中的前缀越长,说明规则越具体,优先级越高;如果没有更具体规则,才走默认路由。再看下一跳:IP 包的目的 IP 通常不变,但每一跳发出去的链路层目的 MAC 会变成下一跳设备,所以“去哪里”和“下一步交给谁”是两层不同问题。
1. IP 层的职责
IP 层提供主机到主机的尽力而为传输。
关键词:
host-to-host
best effort
它负责:
- 源 IP 和目的 IP。
- 跨网络转发。
- 路由选择。
- TTL 防止无限循环。
- 分片相关信息。
它不保证:
- 一定送达。
- 顺序。
- 不重复。
- 不丢失。
- 端到端可靠。
这些需要上层协议处理。
2. IPv4 地址
IPv4 地址是 32 bit,通常写成点分十进制:
192.168.1.10
地址由网络部分和主机部分组成。
子网掩码或前缀长度表示划分方式:
192.168.1.10/24
表示前 24 bit 是网络部分。
同一 /24 子网内:
192.168.1.1
192.168.1.10
192.168.1.200
通常可直接通过链路层通信。
3. 子网为什么存在
子网用于划分地址范围和路由范围。
作用:
- 管理地址。
- 控制广播域。
- 简化路由表。
- 隔离网络。
- 分配不同部门或服务区域。
没有子网,整个网络会难以管理。
4. 默认网关
如果目标 IP 不在本地子网,主机通常把包发给默认网关。
目标在本地子网:
ARP 目标 IP,直接发给目标 MAC
目标不在本地子网:
ARP 网关 IP,发给网关 MAC
注意:
链路层目的 MAC 是下一跳网关
IP 层目的 IP 仍然是最终目标
每一跳都会换链路层头,但 IP 目的地址保持指向最终目标。
5. 路由表
路由器和主机都有路由表。
路由表项大致表示:
去某个目标网络
应该从哪个接口发
下一跳是谁
查路由时通常按最长前缀匹配:
越具体的路由优先级越高
例子:
10.1.2.0/24 比 10.0.0.0/8 更具体
6. 路由器做什么
路由器收到 IP 包:
检查目的 IP
查路由表
选择下一跳和出口接口
TTL 减 1
重新封装链路层帧
转发
如果没有路由,包会被丢弃。
如果 TTL 变成 0,包会被丢弃,并可能返回 ICMP 消息。
7. TTL
TTL 防止包在网络中无限循环。
每经过一个路由器:
TTL = TTL - 1
到 0 就丢弃。
traceroute 类工具利用 TTL 递增,观察路径上的路由器响应。
TTL 不是时间单位,而是跳数限制。
8. 私有地址和公网地址
常见私有地址范围:
10.0.0.0/8
172.16.0.0/12
192.168.0.0/16
私有地址通常不能直接在公网路由。
家庭、公司、容器、云内部网络经常使用私有地址,再通过 NAT 或网关访问外部。
9. IPv6 的直觉
IPv6 使用 128 bit 地址,地址空间巨大。
它解决 IPv4 地址不足问题,也改变了一些网络设计。
学习初期先知道:
- IPv6 地址更长。
- 写法不同。
- 不再依赖大规模地址共享的同一方式。
- 仍然需要路由、邻居发现、传输层端口等概念。
机制深挖:主机发包前到底怎么选下一跳
主机发送 IP 包前,不是“看到目标 IP 就发出去”。它至少要做三步判断:
- 目标是否在本地子网?
- 如果不在,本机路由表应该选哪条?
- 选中下一跳后,链路层应该发给哪个 MAC?
第一步通常来自地址和掩码:
本机 IP: 192.168.1.10/24
目标 IP: 192.168.1.50
本机网络: 192.168.1.0/24
目标落入: 192.168.1.0/24
=> 本地直达,ARP 目标 IP
如果目标是 8.8.8.8:
目标不在 192.168.1.0/24
=> 查默认路由
=> 下一跳是网关 192.168.1.1
=> ARP 网关 IP,而不是 ARP 8.8.8.8
这就是很多初学者会混淆的点:
| 问题 | 真正答案 |
|---|---|
| 跨网段时以太网帧发给谁? | 下一跳网关的 MAC |
| 跨网段时 IP 包目的地址变不变? | 通常仍是最终目标 IP |
| 路由器每一跳主要改什么? | TTL、链路层头部、可能还有校验相关字段 |
| 本机怎么知道下一跳 MAC? | 对下一跳 IP 做本地邻居发现/ARP |
回程路径:只看去程会误判
网络通信要双向成立。去程能到,不代表回程能回来。
| 去程状态 | 回程状态 | 表现 |
|---|---|---|
| 去程路由正确 | 回程路由正确 | 连接正常 |
| 去程正确 | 回程缺路由 | 对端收到请求,但客户端超时 |
| 去程经过 NAT | 回程没有命中 NAT 映射 | 出口可见,回包丢失 |
| 去程允许 | 回程被防火墙拦截 | 半开、重试、超时 |
| 去程走 A 链路 | 回程走 B 链路 | 抓包只在一侧看到单向流量 |
所以排查路由问题时要问两遍:
包怎么出去?
响应怎么回来?
这也是为什么“我这里 ping 你不通”和“你那里 ping 我不通”可能不是同一个问题。IP 路由是有方向的,策略、NAT、防火墙也都可能有方向性。
10. 联系实际:为什么 IP 能通,应用仍不通
ping 通通常说明:
某种 ICMP 到达和返回路径可用
但应用连接还需要:
- 目标端口开放。
- 防火墙允许 TCP/UDP。
- 服务正在监听。
- 路由双向可达。
- NAT 状态正确。
- TLS/应用协议成功。
所以:
IP 可达 != 应用可用
排查要继续向上传输层和应用层。
手推:最长前缀匹配不是“第一条能匹配就走”
给定路由表:
| 目的前缀 | 下一跳 |
|---|---|
10.1.2.0/24 | 网关 A |
10.1.0.0/16 | 网关 B |
10.0.0.0/8 | 网关 C |
0.0.0.0/0 | 默认网关 |
目标是:
10.1.2.77
它同时匹配:
10.1.2.0/24
10.1.0.0/16
10.0.0.0/8
0.0.0.0/0
最终选 /24,因为它最具体。前缀越长,约束越强:
/24 要求前 24 bit 相同
/16 只要求前 16 bit 相同
/8 只要求前 8 bit 相同
/0 什么都不要求
这解释了一个常见事故:
默认路由没问题,
但某个更具体的路由把一部分流量导向了错误网关。
排查“只有某些目标不通”时,要查的不是只有默认网关,还要查是否有更具体的路由、策略路由、隧道或 VPN 路由抢先命中。
边界条件:能到下一跳,不等于能到最终目标
跨网段通信至少有两段:
本机 -> 下一跳
下一跳 -> 更远路径 -> 目标
本机只要能 ARP 到网关,就能把帧交给下一跳。但之后会不会成功,取决于:
| 后续条件 | 失败表现 |
|---|---|
| 路由器有没有后续路由 | 包到网关后被丢弃或返回不可达 |
| 中间链路 MTU 是否合适 | 小包正常,大包卡住或超时 |
| 回程路由是否存在 | 对端收到请求,客户端收不到响应 |
| 中间防火墙是否允许 | 某协议或端口被拦 |
| NAT 状态是否建立 | 出口包出去,回包找不到映射 |
所以“网关能 ping 通”只证明第一跳可达。它不能证明整条路径、回程路径、传输层端口和应用协议都正常。更严谨的排障顺序是:
本机路由选择
下一跳链路可达
逐跳转发路径
回程路径
传输层端口
应用协议
练习卡:手算“下一跳”而不是背路由表
给自己构造三条路由:
| 目的网段 | 下一跳 | 备注 |
|---|---|---|
10.1.0.0/16 | 本地网卡 | 更具体 |
10.0.0.0/8 | 网关 A | 较宽 |
0.0.0.0/0 | 默认网关 | 兜底 |
然后判断这几个目标会走哪条:10.1.2.3、10.2.3.4、8.8.8.8。核心规则是最长前缀匹配:谁描述得更具体,谁优先。
排障时也按这个顺序做:
- 目标 IP 是否落在本地子网?
- 如果不在,本机默认网关是谁?
- 路由表里是否有更具体的例外规则?
- 回程路径是否也能回来?
很多“能访问 A,不能访问 B”的问题,本质不是应用差异,而是目的地址命中了不同路由。
11. 学完本章你能解决什么问题
学完这一章,你应该能解决或开始分析这些问题:
- IP 层解决什么,不保证什么?
- 子网和前缀长度是什么意思?
- 默认网关什么时候被使用?
- 为什么跨网段通信链路层目标 MAC 是网关?
- 路由表和最长前缀匹配是什么?
- TTL 为什么能防止路由循环?
- 私有地址和公网地址有什么区别?
- 为什么 ping 通不代表应用端口通?
IP 的核心是跨网络寻址和转发。它负责把包送向目标,但不承诺可靠和应用可用。