ip - subnet - routing

03. IP、子网与路由

0. 本章先解决什么问题

链路层只能解决相邻设备通信。互联网需要解决更大的问题:

一个包如何跨越多个网络,最终到达目标主机?

IP 和路由解决:

  • 主机如何用 IP 地址标识。
  • 子网如何划分。
  • 路由器如何决定下一跳。
  • TTL 为什么存在。
  • 默认网关是什么。
  • 为什么能 ping 通不代表应用端口通。

先看路由选择的核心规则:目的 IP 在路由表里做最长前缀匹配,命中后才知道下一跳。

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 就发出去”。它至少要做三步判断:

  1. 目标是否在本地子网?
  2. 如果不在,本机路由表应该选哪条?
  3. 选中下一跳后,链路层应该发给哪个 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.310.2.3.48.8.8.8。核心规则是最长前缀匹配:谁描述得更具体,谁优先。

排障时也按这个顺序做:

  1. 目标 IP 是否落在本地子网?
  2. 如果不在,本机默认网关是谁?
  3. 路由表里是否有更具体的例外规则?
  4. 回程路径是否也能回来?

很多“能访问 A,不能访问 B”的问题,本质不是应用差异,而是目的地址命中了不同路由。

11. 学完本章你能解决什么问题

学完这一章,你应该能解决或开始分析这些问题:

  1. IP 层解决什么,不保证什么?
  2. 子网和前缀长度是什么意思?
  3. 默认网关什么时候被使用?
  4. 为什么跨网段通信链路层目标 MAC 是网关?
  5. 路由表和最长前缀匹配是什么?
  6. TTL 为什么能防止路由循环?
  7. 私有地址和公网地址有什么区别?
  8. 为什么 ping 通不代表应用端口通?

IP 的核心是跨网络寻址和转发。它负责把包送向目标,但不承诺可靠和应用可用。

延伸阅读