跟着一个数据包经过路由器

现在,我们把前面的知识串成一条完整链路:看一个数据包如何从客户端出发,穿过路由器,最终抵达服务器。

假设客户端主机 A(192.168.12.170)要向服务器 B(192.168.20.10)发送一段数据。中间经过一台双网口路由器 R,两侧都是标准以太网局域网;为聚焦普通路由转发,本例不考虑 NAT 转换。

路由器收到左侧帧后,从右侧接口发出新的帧,IP 端点保持相同

第一跳:客户端 A 把数据交给网关

客户端 A 首先要判断:目标 IP 是否和本机处于同一子网?

  1. 客户端 A 根据自身子网掩码计算,发现目标 IP 192.168.20.10 不在本地子网。
  2. 既然目标主机不在本网段,客户端 A 就不能直接把数据帧交给目标 IP,而要交给路由器 R 的左侧接口。于是它查询路由表,找到下一跳地址:默认网关 192.168.12.129。
  3. 以太网帧不能只填 IP 地址就发送,客户端 A 还需要知道下一跳网关接口在二层链路上的 MAC 地址。它会查询本机 ARP 表,获取网关左侧接口的 MAC 地址 MAC-R-Left;如果 ARP 表中没有缓存,就会先在本地子网发送 ARP 请求。
  4. 客户端 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 数据包,再根据目标网络重新组装新的以太网帧。

  1. 路由器 R 从左侧接口收到以太网帧,发现帧头中的目的 MAC 确实是自己左侧接口的地址,于是收下这个帧,并剥掉以太网头部,露出内部的 IP 数据包。
  2. 路由器 R 检查 IP 头部中的目的 IP 192.168.20.10,并查询自己的路由表。假设它发现目标主机与自己的右侧接口直连,就会从右侧接口继续转发。
  3. 路由器 R 将 IP 头部中的 TTL(生存时间)减 1,从 64 变为 63。如果减完后 TTL 等于 0,路由器会直接丢弃该数据包,并向源主机发送 ICMP 超时通知。TTL 机制的作用,就是防止数据包在路由环路中无限打转。
  4. 接下来,路由器 R 需要为下一跳找到链路层地址。它查询右侧网络的 ARP 表,获取服务器 B 的 MAC 地址 MAC-B;如果没有缓存,也会先在右侧子网发送 ARP 请求。
  5. 路由器 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变化规则
源 IP192.168.12.170192.168.12.170端到端保持不变
目的 IP192.168.20.10192.168.20.10端到端保持不变
源 MACMAC-AMAC-R-Right每一跳重写为当前出接口 MAC
目的 MACMAC-R-LeftMAC-B每一跳重写为下一跳接口 MAC
TTL6463每经过一次路由器通常减 1

核心结论

请牢牢记住这条规则:

在没有 NAT 的普通三层网络转发中,无论数据包跨越多少台路由器,端到端的源 IP 和目的 IP 始终保持不变;而每一段链路上的源 MAC 和目的 MAC,在每一跳经过路由器时都会被彻底重写成当前直连链路两端的接口 MAC。

跟踪逐跳转发

模拟实验

逐段查看客户端、路由器和服务器之间的地址变化。判断哪些字段代表端到端信息、哪些字段会随链路改变,再完成最后的目的 MAC 判断。

点击这里启动: