从互联网协议栈出发,逐层拆解路由器如何读取、决策、转发每一个 IP 数据包——这不仅是网络层的核心,更是整个互联网运转的基石。
路由器是网络层(Layer 3)设备。它不关心应用层数据是什么,也不关心传输层用的是 TCP 还是 UDP——它只读取 IP 头部,根据目的 IP 地址做出转发决策。交换机工作在 L2(MAC 寻址),集线器工作在 L1(比特转发),而路由器是连接不同网络的核心枢纽。
路由器读取 IP 数据包头部中的目的 IP 地址,查询本地路由表,决定从哪个接口转发。它同时处理 TTL 递减、分片、ICMP 消息等网络层职责。
| 设备 | 工作层 | 寻址 | 转发依据 |
|---|---|---|---|
| 集线器 Hub | L1 | 无 | 广播到所有端口 |
| 交换机 Switch | L2 | MAC | MAC 地址表 |
| 路由器 Router | L3 | IP | 路由表 + LPM |
1. 读取目的 IP — 从 IP 头部提取目标地址
2. 查询路由表 — 最长前缀匹配 (LPM)
3. TTL 递减 — 防止数据包永续循环
4. 重封装帧 — 构建新 L2 帧头发送
5. 分片处理 — MTU 不匹配时 IP 分片
路由器收到一个以太网帧后,剥离帧头帧尾,取出 IP 数据包,读取目的 IP 地址,决定"下一跳"发往哪里。这个过程是逐跳(hop-by-hop)的——每一跳只负责交给下一个路由器,直到最终到达目标网络。
⭐ 标记的字段是路由器每次转发必须处理的核心:目的 IP 用于路由决策,TTL 每跳递减,源 IP 在 NAT 时被改写。
每个 IP 包的 TTL 由源主机设置(通常 64 或 128),每经过一个路由器减 1。当 TTL=0 时,路由器丢弃该包并发送 ICMP Time Exceeded。traceroute 命令正是利用此原理——逐步增大 TTL,每一跳路由器回报自己。
路由表是路由器的大脑——存储着"目的网络 → 下一跳"的映射。当多个条目同时匹配目的 IP 时,路由器选择掩码最长(最精确)的那条,即最长前缀匹配(Longest Prefix Match, LPM)。
| 目的网络 | 掩码 | 下一跳 | 接口 | 优先级 |
|---|---|---|---|---|
| 10.0.1.0 | /24 | 直连 | eth0 | 0 |
| 10.0.2.0 | /24 | 直连 | eth1 | 0 |
| 192.168.1.0 | /24 | 10.0.2.1 | eth1 | 10 |
| 172.16.0.0 | /16 | 10.0.2.2 | eth1 | 20 |
| 10.0.0.0 | /8 | 10.0.1.1 | eth0 | 30 |
| 0.0.0.0 | /0 | 10.0.1.254 | eth0 | 100 |
最后一条 0.0.0.0/0 是默认路由——匹配所有 IP,是"最后的兜底"。
输入一个目的 IP,查看路由器如何逐条匹配路由表:
从 IP 头部取出 32bit 目的地址
将目的 IP 与每条路由的子网掩码做按位 AND
AND 结果 = 路由条目的目的网络 → 匹配
多条匹配时,选掩码最长的(最精确)
从选中条目获取下一跳和出接口
假设目的 IP 是 10.0.1.5:
→ 匹配 10.0.1.0/24 ✅(24位,精确)
→ 也匹配 10.0.0.0/8 ✅(8位,粗略)
→ 也匹配 0.0.0.0/0 ✅(0位,兜底)
路由器选择 /24 — 最精确的那条,确保流量走最优路径。
路由器决定了"下一跳 IP 是谁",但以太网帧的发送需要目标 MAC 地址。ARP(Address Resolution Protocol)就是在同一链路上,通过 IP 地址解析出 MAC 地址的协议。
路由器先查本地 ARP 表(IP→MAC 缓存),命中则直接使用
广播帧(FF:FF:FF:FF:FF:FF):"谁的 IP 是 10.0.2.1?请告诉 10.0.2.0"
目标设备单播回复:"10.0.2.1 的 MAC 是 aa:bb:cc:dd:ee:01"
写入 ARP 表,用此 MAC 封装以太网帧头发送
1. ARP 只在同一链路(同网段)内工作,路由器不转发 ARP 到其他网段
2. 路由器需要解析的是下一跳的 MAC,不是最终目的主机的 MAC
3. ARP 表有老化时间(通常 20 分钟),超时需重新解析
4. Gratuitous ARP:设备主动广播自己的 IP-MAC 映射
全球 IPv4 地址不够用,内网使用私有地址(10.x / 172.16-31.x / 192.168.x),出口路由器通过 NAT(Network Address Translation)将私有 IP 替换为公网 IP,让内网设备也能访问互联网。
最常用的是 NAPT/PAT(基于端口的转换),多个内网 IP 共享一个公网 IP,通过端口号区分不同连接:
| 协议 | 内网 IP:Port | 公网 IP:Port | 目标 |
|---|---|---|---|
| TCP | 192.168.1.10:54321 | 203.0.113.5:20001 | 93.184.216.34:443 |
| TCP | 192.168.1.22:49152 | 203.0.113.5:20002 | 142.250.80.46:80 |
| UDP | 192.168.1.10:12345 | 203.0.113.5:20003 | 8.8.8.8:53 |
1. 破坏端到端原则 — 外部无法主动连接内网
2. 增加延迟 — 查表改写 IP/端口、重算校验和
3. 影响 P2P — 双方都在 NAT 后需 STUN/TURN 穿透
4. IPv6 的意义 — 充足地址空间可消除 NAT
家用路由器上,NAT 和路由转发在同一设备完成。NAT 发生在路由决策之后、公网接口发出之前。
ICMP 是网络层的"信使"——路由器用它来报告错误、传达控制信息。它不是传输层协议,而是 IP 的辅助协议,封装在 IP 数据包中(Protocol = 1)。
| 类型 | 代码 | 触发场景 | 含义 |
|---|---|---|---|
| 3 | 0/1 | 路由表无匹配 | Destination Unreachable |
| 11 | 0 | TTL=0 | Time Exceeded(traceroute 依赖) |
| 5 | 1 | 更好的路由 | Redirect(重定向) |
| 0 | 0 | 收到 Echo Request | Echo Reply(ping 响应) |
| 3 | 4 | 包太大且 DF=1 | Fragmentation Needed(PMTU 发现) |
利用 TTL 和 ICMP Time Exceeded 揭示到目标的每一跳:
包到第 1 个路由器 TTL 归零 → 回报 Time Exceeded
穿过第 1 跳,到第 2 个路由器 TTL 归零 → 第 2 跳回报
到达目标主机 → 回 ICMP Echo Reply → 结束
ICMP 重定向攻击、Smurf 放大攻击等使得现代路由器会限制 ICMP 发送速率(rate limiting)和类型。
路由表不是手动写死的。路由器通过路由协议自动学习和交换网络可达信息。静态路由适合小网络,动态路由协议才是互联网规模的方案。
在同一自治系统 (AS) 内交换路由
在不同自治系统之间交换路由
发送 Hello 包,建立邻接关系
每台路由器发布自己的链路状态通告
所有路由器拥有相同的链路状态数据库
以自己为根,Dijkstra 算法算出最短路径树
从最短路径树提取路由条目写入路由表
TCP 179 端口,eBGP 直连 / iBGP 需全互联
发布 NLRI(网络前缀)+ Path Attributes
13 步选路:Weight → LOCAL_PREF → AS_PATH → MED ...
BGP 核心价值——策略路由,而非最短路径
最优路径写入 RIB → FIB
RIB(Routing Information Base):路由协议计算出的所有路由条目,可能有多条到达同一目的地的路径。
FIB(Forwarding Information Base):从 RIB 中选出最优路径,扁平化存储,用于数据包转发的高速查表。
类比:RIB 是"所有候选路线",FIB 是"最终导航路线"。现代路由器用硬件(TCAM)加速 FIB 查表。
从主机 A 发送 HTTP 请求到公网服务器,数据包经过路由器的每一步处理,用动画完整展现。
| 步骤 | 位置 | 协议/动作 | 关键变化 |
|---|---|---|---|
| 1 | 主机 A | DNS→TCP→HTTP | 应用层数据就绪 |
| 2 | 主机 A | IP 封装 | 源 192.168.1.10 → 目的 93.184.216.34 |
| 3 | 主机 A | ARP | 解析网关 192.168.1.1 的 MAC |
| 4 | 主机 A | Ethernet 封装 | 帧头:源 MAC → 网关 MAC |
| 5 | 路由器 | 接收 & 解封装 | 剥离帧头,取出 IP 包 |
| 6 | 路由器 | 校验 & TTL | TTL 64→63,重算 checksum |
| 7 | 路由器 | 路由表 LPM | 匹配默认路由 0.0.0.0/0 |
| 8 | 路由器 | NAT 转换 | 源 IP:Port 替换为公网地址 |
| 9 | 路由器 | ARP | 解析 ISP 下一跳 MAC |
| 10 | 路由器 | 重新封装帧 | 新帧头:路由器 MAC → ISP MAC |
| 11 | ISP 路由 | 逐跳转发 | 每跳 TTL-1,查表,换帧头 |
| 12 | 目标服务器 | 接收 & 响应 | 反向路径回到主机 A |
路由器是 L3 设备,读取 IP 头部做转发决策,不关心 L4/L7 内容
目的 IP + 路由表 + 最长前缀匹配 = 下一跳 + 出接口
每跳 -1,归零丢弃 + ICMP Time Exceeded,防环路
路由决策得出 IP 下一跳,ARP 解析出 MAC 才能封装帧
私有 IP ↔ 公网 IP + 端口映射,解决 IPv4 地址不足
路由器用 ICMP 报告错误(不可达/超时/重定向),traceroute 依赖它
IGP(OSPF/IS-IS)管内部,EGP(BGP)管外部,自动构建路由表
每个路由器独立决策,只看目的 IP → 查表 → 发下一跳,帧头每跳重写
路由器的本质就是:读 IP → 查表 → 换帧头 → 发出去。
它不关心数据内容,不维护端到端连接,只是每一个 IP 包的"中转站"。
— 逐跳决策,最长匹配,TTL 防环,ARP 桥接,NAT 穿越,ICMP 报错。