现在,我们把前面的知识串成一条完整链路:看一个数据包如何从客户端出发,穿过路由器,最终抵达服务器。
假设客户端主机 A(192.168.12.170)要向服务器 B(192.168.20.10)发送一段数据。中间经过一台双网口路由器 R,两侧都是标准以太网局域网;为聚焦普通路由转发,本例不考虑 NAT 转换。
第一跳:客户端 A 把数据交给网关
客户端 A 首先要判断:目标 IP 是否和本机处于同一子网?
- 客户端 A 根据自身子网掩码计算,发现目标 IP
192.168.20.10不在本地子网。 - 既然目标主机不在本网段,客户端 A 就不能直接把数据帧交给目标 IP,而要交给路由器 R 的左侧接口。于是它查询路由表,找到下一跳地址:默认网关
192.168.12.129。 - 以太网帧不能只填 IP 地址就发送,客户端 A 还需要知道下一跳网关接口在二层链路上的 MAC 地址。它会查询本机 ARP 表,获取网关左侧接口的 MAC 地址
MAC-R-Left;如果 ARP 表中没有缓存,就会先在本地子网发送 ARP 请求。 - 客户端 A 组装出第一个以太网帧,发给网关接口,准备进入路由器。
客户端 A 发出的帧中关键字段
- 源 MAC:
MAC-A - 目的 MAC:
MAC-R-Left(网关左侧接口 MAC) - 源 IP:
192.168.12.170 - 目的 IP:
192.168.20.10(最终服务器 IP) - TTL:
64
第二跳:路由器 R 解封、查表并重新封装
路由器 R 收到帧后,不会把原来的以太网帧“原样”从右侧接口转发出去。它需要拆开外层封装,取出 IP 数据包,再根据目标网络重新组装新的以太网帧。
- 路由器 R 从左侧接口收到以太网帧,发现帧头中的目的 MAC 确实是自己左侧接口的地址,于是收下这个帧,并剥掉以太网头部,露出内部的 IP 数据包。
- 路由器 R 检查 IP 头部中的目的 IP
192.168.20.10,并查询自己的路由表。假设它发现目标主机与自己的右侧接口直连,就会从右侧接口继续转发。 - 路由器 R 将 IP 头部中的 TTL(生存时间)减 1,从
64变为63。如果减完后 TTL 等于0,路由器会直接丢弃该数据包,并向源主机发送 ICMP 超时通知。TTL 机制的作用,就是防止数据包在路由环路中无限打转。 - 接下来,路由器 R 需要为下一跳找到链路层地址。它查询右侧网络的 ARP 表,获取服务器 B 的 MAC 地址
MAC-B;如果没有缓存,也会先在右侧子网发送 ARP 请求。 - 路由器 R 使用自己的右侧接口重新打包一个新的以太网帧,并发送到右侧局域网。
路由器 R 转发出去的帧中关键字段
- 源 MAC:
MAC-R-Right(网关右侧出接口 MAC) - 目的 MAC:
MAC-B(服务器网卡 MAC) - 源 IP:
192.168.12.170(保持不变!) - 目的 IP:
192.168.20.10(保持不变!) - TTL:
63
一张表看懂哪些字段会变
| 字段 | 客户端 A → 路由器 R | 路由器 R → 服务器 B | 变化规则 |
|---|---|---|---|
| 源 IP | 192.168.12.170 | 192.168.12.170 | 端到端保持不变 |
| 目的 IP | 192.168.20.10 | 192.168.20.10 | 端到端保持不变 |
| 源 MAC | MAC-A | MAC-R-Right | 每一跳重写为当前出接口 MAC |
| 目的 MAC | MAC-R-Left | MAC-B | 每一跳重写为下一跳接口 MAC |
| TTL | 64 | 63 | 每经过一次路由器通常减 1 |
核心结论
请牢牢记住这条规则:
在没有 NAT 的普通三层网络转发中,无论数据包跨越多少台路由器,端到端的源 IP 和目的 IP 始终保持不变;而每一段链路上的源 MAC 和目的 MAC,在每一跳经过路由器时都会被彻底重写成当前直连链路两端的接口 MAC。

