一个网络数据包是怎么从发送方路由到接受方的,整个过程中数据包里的 MAC 地址和 IP 地址是怎么变化的

Q1 在互联网上一个网络数据包是怎么从发送方路由到接受方的,详细说明在整个过程中数据包里的MAC地址和IP地址是怎么变化的?

A1:

完整数据包路由全过程 + IP/MAC地址变化详解

先抛出最核心两条规律

  1. MAC地址(二层/链路层):只用于相邻一跳设备之间交付,每经过一台路由器就被重新改写;MAC地址不能跨路由器传递。交换机转发时MAC不会变。
  2. IP地址(三层/网络层):端‑到‑端寻址标记。无NAT场景下,源IP、目的IP全程不会改变**;内网访问互联网经过NAT网关时,源IP会被网关替换为公网IP。**

路由器标准转发流程:剥掉旧二层帧头(丢弃旧MAC)→查看IP包头目的IP,查询路由表 →(可选NAT修改IP)→封装全新二层帧头(新MAC)→转发出去

先区分三种典型场景

  • 场景A:两台主机同一个局域网(子网内通信),无路由器
  • 场景B:跨网段、经过互联网多台路由器转发(公网‑公网,无NAT)
  • 场景C:最贴近日常上网:内网私网主机访问公网服务器(带NAT转换)

场景A:同一局域网(不需要路由器)

主机A:192.168.1.10 MAC‑A

主机B:192.168.1.20 MAC‑B

  1. A用子网掩码判断目标IP和自己属于同一个网段;
  2. A发送 ARP广播 :询问 192.168.1.20 的MAC地址;
  3. B单播ARP应答,把自己MAC返回A;
  4. A封装数据包发出:
字段
源MAC MAC‑A
目的MAC MAC‑B
源IP 192.168.1.10
目的IP 192.168.1.20

数据包经过交换机直接转发给到B;全程IP、MAC地址都不会发生任何变化


场景B:跨网段公网主机通信(无NAT转换)

角色定义:

  • 发送主机A:公网IP 202.1.1.10,MAC‑A
  • 网关路由器R1:内网口 202.1.1.1 MAC‑R1‑in;外网出口 MAC‑R1‑out
  • 中间运营商路由器 R2:入接口 MAC‑R2‑in;出接口 MAC‑R2‑out
  • 接收主机B:公网IP 202.3.3.20,MAC‑B
第1步:主机A → 默认网关R1

A判断目标IP不在本地子网,数据包必须发给网关;ARP获取网关内网MAC。

发出数据包:

字段 数值
源MAC MAC‑A
目的MAC MAC‑R1‑in
源IP 202.1.1.10
目的IP 202.3.3.20
第2步:网关R1收到数据包,转发到下一跳R2

路由器剥离二层帧头(旧MAC直接丢弃) ,读取三层IP包,查询路由表,找到下一跳R2;ARP获取R2入接口MAC;IP数据包完全原样保留,不做修改,重新封装二层头

发出数据包去往R2:

字段 数值
源MAC MAC‑R1‑out(R1外网网卡MAC)
目的MAC MAC‑R2‑in(下一跳路由器MAC)
源IP 202.1.1.10(不变)
目的IP 202.3.3.20(不变)
第3步:中间路由器R2 → 最终主机B

R2再次剥掉二层头部,查路由表,发现下一跳就是目标主机B所在局域网;ARP拿到B的MAC地址,重新封装二层帧:

字段 数值
源MAC MAC‑R2‑out
目的MAC MAC‑B
源IP 202.1.1.10(不变)
目的IP 202.3.3.20(不变)

主机B收到报文。

✅无NAT总结:源IP、目的IP从头到尾一丝不变,MAC地址每经过一跳路由器全部换新


场景C:日常真实上网场景:内网电脑访问公网服务器(带NAT转换)

绝大多数家庭、公司内网上网都会走NAT,这里源IP会被网关修改

角色:

  • 内网主机A:私网IP 192.168.1.10 MAC‑A
  • 家庭路由器(NAT网关R1):内网口192.168.1.1 MAC‑R1‑in;外网公网IP:110.1.2.3 MAC‑R1‑out
  • 公网服务器B:202.3.3.20 MAC‑B
第1步:内网A → NAT网关R1
字段
源MAC MAC‑A
目的MAC MAC‑R1‑in
源IP 192.168.1.10(私网)
目的IP 202.3.3.20(服务器公网IP)
第2步:网关R1收到报文,执行NAT转换(关键变化)

路由器剥掉二层头;修改IP包头里面的源IP

私网IP 192.168.1.10 →替换为路由器外网公网IP 110.1.2.3

路由器同时在NAT映射表记录这条连接,用于后续回程报文转发;

然后封装新二层帧,发往运营商下一跳:

字段
源MAC MAC‑R1‑out
目的MAC 运营商下一跳路由器MAC
源IP 110.1.2.3(网关公网IP,已改变)
目的IP 202.3.3.20(不变)
第3步:互联网路由直到服务器B

之后所有运营商路由器转发途中:

源IP=110.1.2.3,目的IP=202.3.3.20 一直固定不变 ;MAC地址每一跳不断更换。

服务器收到报文,看到的源IP是你路由器的公网IP,看不到你电脑原始的192.168.x.x私网地址

回程数据包原路返回,网关NAT查表再把目标IP换回内网主机地址。


汇总对照表

无NAT(公网‑公网)

传输链路 源IP 目的IP 源MAC 目的MAC
A→网关R1 A公网IP B公网IP A‑MAC R1入‑MAC
R1→R2 A公网IP B公网IP R1出‑MAC R2入‑MAC
R2→B A公网IP B公网IP R2出‑MAC B‑MAC

NAT内网访问公网

传输链路 源IP 目的IP 源MAC 目的MAC
内网A→网关R1 A私网IP B公网IP A‑MAC R1内网MAC
R1→运营商路由 网关公网IP B公网IP R1外网MAC 下一跳MAC
运营商→服务器B 网关公网IP B公网IP 逐跳更新 逐跳更新

高频误区澄清

  1. ❌误区:远端服务器收到数据包,源MAC就是发送主机MAC

正确:服务器收到帧里的源MAC,是最后一跳路由器的MAC地址,发送主机MAC早已被路由器丢弃。MAC不能跨互联网传递。

  1. ❌误区:IP永远全程不变

正确:只有无NAT场景IP不变。家用路由器、防火墙、负载均衡、代理服务器都会修改IP地址。

  1. ❌误区:主机可以ARP查询互联网远端服务器MAC

正确:ARP广播报文会被路由器阻断隔离;ARP只能获取同一网段直连设备MAC,你永远拿不到外网服务器的MAC。

如果你需要,我可以补充**回程数据包(B回传给A)**完整流转过程。

Q2: 补充回程数据包(B 回传给 A)完整流转过程

A2:

场景回顾(带NAT,家用/公司内网上网,最常见真实环境)

  • 内网主机A:私网 192.168.1.10,MAC‑A
  • NAT网关路由器R1:内网口192.168.1.1 MAC‑R1‑in;外网公网IP 110.1.2.3,MAC‑R1‑out
  • 公网服务器B:202.3.3.20,MAC‑B

上行(A→B)结束后,R1的NAT会话表 已经保存映射关系:

(192.168.1.10:源端口) ↔ (110.1.2.3:转换后的端口)

回程包就是依靠这条记录把公网IP还原回内网私网IP。

回程完整链路:B → 互联网路由 → NAT网关R1 → 内网主机A

第1段:服务器B → 互联网第一跳路由器

服务器收到A的请求,响应报文,目标IP是网关公网IP 110.1.2.3

字段
源MAC MAC‑B
目的MAC B网段直连下一跳路由器MAC
源IP 202.3.3.20(服务器IP)
目的IP 110.1.2.3(网关公网IP)

互联网中间每一台路由器转发规则:

  1. 撕掉旧二层帧头,丢弃旧MAC
  2. 查询路由表找到下一跳
  3. IP包头全程不变(还没到达NAT网关)
  4. 封装全新二层头部,源/目的MAC换成当前链路两端设备MAC

👉 IP不变,MAC每一跳刷新

第2段:报文到达 NAT网关 R1 的外网口(最关键NAT反向转换)

数据包抵达R1外网网卡:

  1. 剥离二层帧头;
  2. 查看IP包头:目的IP = 110.1.2.3
  3. 查询本机NAT会话映射表,匹配到刚才A发起的那条连接;
  4. 修改IP包头:目标IP 110.1.2.3 → 192.168.1.10(反向NAT);
  5. 然后在内网ARP缓存查找 192.168.1.10 的MAC地址 MAC‑A;
  6. 封装内网侧全新二层帧头发往主机A。

此时R1发向内网的数据包:

字段
源MAC MAC‑R1‑in(路由器内网口MAC)
目的MAC MAC‑A(主机A的MAC)
源IP 202.3.3.20(服务器IP,从头到尾没变)
目的IP 192.168.1.10(已经换回内网私网IP)

第3段:R1 → 内网主机A

在内网局域网中交换机二层转发,MAC、IP不再变化,主机A收到响应报文,一次请求‑应答流程结束。


回程全程地址变化一览表(NAT环境)

链路 源IP 目的IP 源MAC 目的MAC
B→运营商第一跳 202.3.3.20 110.1.2.3 MAC‑B 下一跳路由MAC
运营商中间路由转发 202.3.3.20 110.1.2.3 逐跳更新 逐跳更新
R1外网收到,做NAT转换之后发内网 202.3.3.20 192.168.1.10 MAC‑R1‑in MAC‑A

补充:无NAT、两端都是公网IP场景的回程

A公网:202.1.1.10;B公网:202.3.3.20

回程IP从头到尾完全不变,MAC逐跳改写。

链路 源IP 目的IP 源MAC 目的MAC
B→下一跳路由 202.3.3.20 202.1.1.10 MAC‑B 下一跳MAC
中间路由器转发 202.3.3.20 202.1.1.10 逐跳更新 逐跳更新
最后一跳→A主机 202.3.3.20 202.1.1.10 最后一跳路由出口MAC MAC‑A

核心结论回顾

  1. MAC地址永远只代表直邻居,跨路由器就丢弃重写;MAC地址不会穿越互联网。
  2. 无NAT:源IP、目的IP往返全程不变
  3. 有NAT:上行时源私网IP→公网IP;回程到达网关时目的公网IP→私网IP。
  4. 回程报文服务器只知道对方公网IP,永远看不到内网主机原始私网IP

如果你愿意,我可以画一张简易文字版拓扑流程图,把往返双向合并成一张总图。

Q3:详细解释下场景B 跨网段公网主机通信 中路由器是怎么查找路由表的;找到下一跳后是怎么更新网络包的源MAC地址的?难道路由器有多个MAC地址?

A3:

先回答你最核心的两个疑问

1. 路由器有多个MAC地址:是的!

路由器每一块物理接口(网卡)都拥有独立的MAC地址

举例R1:

  • 内网网卡Eth0(接主机A):IP=202.1.1.1,MAC‑R1‑in
  • 外网网卡Eth1(接路由器R2):IP=202.1.2.1,MAC‑R1‑out
    两个网卡属于两条独立链路,两个完全不同的MAC。家用路由器WAN口、LAN口也是两张网卡,双MAC。

2. 转发数据包时源MAC到底从哪里来?

新帧的源MAC = 路由器【出接口】的MAC地址,不是入接口MAC,也不是发送主机A的MAC。


一、路由器收到报文之后完整分步流程

数据包从主机A到达R1的入接口Eth0:

收到的二层帧:

源MAC:MAC‑A,目的MAC:MAC‑R1‑in

IP包:源IP=202.1.1.10,目的IP=202.3.3.20

步骤1:二层接收校验,剥离帧头

  1. R1的Eth0网卡检查帧的目的MAC是否等于自己Eth0网卡MAC;匹配成功,收下帧。
  2. 剥掉二层帧头,直接丢弃原始源MAC、目的MAC信息

✅三层IP报文被完整保留,源IP/目的IP完全不动。二层信息只对当前一段链路有效,过了路由器就作废。
关键点:二层(MAC)和三层(IP)完全解耦。路由器转发决策只看IP包头,不关心刚才是谁发来的MAC。

步骤2:查询路由表(最长前缀匹配 LPM)

①路由表里存的是什么?

路由表是三层控制平面 的数据,路由表里面根本不保存MAC地址!

每一条路由条目核心字段:

目标网段/子网掩码 + 下一跳IP地址 + 出接口

R1简化后的路由表示例:

目标网段 子网掩码 下一跳IP 出接口网卡
202.1.1.0 /24 直连 Eth0
202.1.2.0 /24 直连 Eth1
202.3.3.0 /24 202.1.2.2(R2的IP) Eth1
0.0.0.0 /0 默认网关 Eth1
②查表算法:最长前缀匹配(Longest‑Prefix‑Match)

拿数据包里面的目的IP:202.3.3.20

依次和路由表每一条网段做匹配:用目标IP & 子网掩码,看落在哪个网段。

如果多条路由都命中,掩码越长(网段范围越小)优先级最高

本例命中路由 202.3.3.0/24,查表得到两个至关重要结果:

  1. 下一跳IP地址 = 202.1.2.2(R2入接口IP)
  2. 出接口网卡 = Eth1(外网网卡)

⚠️ 到这里为止,路由器仍然不知道下一跳R2的MAC地址。路由表只负责三层寻址,MAC属于二层,需要ARP获取。

步骤3:ARP缓存查找下一跳MAC地址

路由器会去查询**【出接口Eth1】隔离的ARP缓存表**。

ARP缓存存储的映射关系:IP地址 ↔ MAC地址,并且是每个网卡各自独立一张ARP表

  • 如果缓存命中:直接拿到R2入接口MAC:MAC‑R2‑in
  • 如果缓存未命中:路由器在Eth1所在广播域发出 ARP广播请求
    谁的IP是202.1.2.2,请把你的MAC回复给我
    R2收到ARP请求,单播回复自己的MAC;路由器存入ARP缓存。

ARP只在同一条直连链路生效,ARP广播不会跨路由器转发。

步骤4:封装全新二层帧(MAC更新的关键一步)

现在已经拿到全部二层信息,生成新的数据帧:

字段 取值 来源说明
源MAC MAC‑R1‑out =本机出接口Eth1网卡的MAC地址
目的MAC MAC‑R2‑in =ARP查到的下一跳设备入接口MAC
源IP 202.1.1.10 IP载荷原样,完全不变
目的IP 202.3.3.20 IP载荷原样,完全不变

然后路由器把这个崭新的二层帧,从Eth1网卡发送出去。

二、一条非常重要的规律

路由器发出数据包时,二层源MAC永远等于「往外发送报文的那块网卡(出接口)」的MAC地址。


三、直连网段的特殊场景(下一跳就是最终主机)

举个例子,R2查表发现目标主机B就在自己出接口直连局域网:

  1. 查询路由表得到:目标网段直连,无中间下一跳;出接口EthX
  2. ARP直接查询最终目的IP 202.3.3.20,拿到主机B的MAC‑B
  3. 封装帧:源MAC=R2出口网卡MAC,目的MAC=MAC‑B

四、容易混淆的两张表对比

表名 层级 存储内容 作用
路由表 三层(网络层) 网段、下一跳IP、出接口 决定数据包往哪个方向、哪个网卡发
ARP缓存表 二层(链路层) IP→MAC映射 获取直邻居的MAC地址

两者完全独立,路由查表 ≠ 获取MAC。

五、澄清几个高频误区

误区1:路由器只有一个MAC地址

❌错误。路由器每个物理接口一张网卡,一张网卡一个MAC。流量从Eth0进来,Eth1出去,进出网卡MAC不一样。

误区2:转发后源MAC保留发送主机A的MAC

❌错误。MAC只代表当前一跳链路的发送方。A和R2之间隔了一条链路,A的MAC对R2毫无意义,路由器直接丢弃旧二层头。

误区3:路由表里面保存了下一跳MAC

❌错误。路由表只保存IP信息,MAC靠ARP运行时动态查询。

误区4:入接口MAC当做新帧源MAC

❌错误。源MAC必须是发出这条报文的网卡。报文从Eth1网卡送出,源MAC一定是Eth1的MAC。


六、整条链路双向过程的极简总结(R1→R2)

  1. 收到帧 → 拆掉二层头
  2. IP包 → 查路由表,得到下一跳IP+出接口
  3. 在出接口查ARP,得到下一跳MAC
  4. 新建二层帧:源MAC=出接口MAC;目的MAC=下一跳MAC
  5. 从出接口发出,三层IP全程不动

如果你需要,我可以再画一份文字拓扑,完整展示R1→R2→B整条链路每一跳的出接口、MAC变化明细。

Q4:从中国到美国,一个网络包平均需要经过多少跳,大概是什么量级的?

A4:

一、跳数量级结论(traceroute 可见的IP‑路由器跳数)

中国大陆 → 美国西海岸(洛杉矶 / 圣何塞)

  • 普通家用宽带线路:15‑22 跳,均值约 18 跳
  • 精品专线(电信CN2‑GIA、移动CMI直连):12‑16跳,路径更短
  • 美国东海岸(纽约、弗吉尼亚),在美国本土还要多走4‑8跳:20‑28跳
  • 极少数绕路(欧洲、日本中转):可以达到 30+跳

traceroute 默认上限 30 hops,所以跨国路由几乎都落在 12‑28 这个区间。

分阶段拆解一条典型路径(北京 → 洛杉矶)

  1. 本地局域网 + 运营商城域网(1‑5跳)
    家里光猫 → 小区汇聚路由器 → 市核心路由器
  2. 国内国家骨干网(5‑10跳)
    北京骨干路由器 → 上海/广州国际出入口节点

这里经过国内电信/联通/移动骨干路由器(AS4134、AS4808等)

  1. 国际关口,跨太平洋海底光缆(第 10‑13跳)
    上海登陆站路由器 → 海底光缆 → 美国西海岸光缆着陆站路由器

💡海底光缆本身,不算一跳!

光纤信号长距离传输,中间水下光放大器不是IP路由器 ,不会修改IP包、TTL不会减一。

数据包穿过上万公里太平洋,只在两岸登陆点两台路由器算作2跳,大海中间零跳。

  1. 美国本土骨干网(13‑18跳)
    美西着陆点 → 美国运营商骨干路由器 → 目标机房接入路由器 → 目标服务器

二、一个关键误区:物理距离 ≠ 跳数

太平洋一万公里光纤,并不会产生十几跳

跳数 = 经过多少台三层IP路由器 ,和光纤公里数几乎无关。

海底光缆是二层光链路,只是传输介质,没有路由器在海里转发IP包

三、traceroute看不到的设备(不计入跳数)

防火墙、负载均衡、DDoS清洗设备、二层交换机。

  • 二层交换机:不改IP,TTL不变,不计一跳
  • 部分透明防火墙:透传IP包,TTL不变,不算一跳
    只有**三层路由器(执行IP转发、TTL‑1)**才算1 hop。

四、为什么同样北京→洛杉矶跳数每次不一样?

跨国路由依靠 BGP动态路由协议

高峰期拥塞、光缆故障,运营商可以瞬间切换一条绕道路径:

  • 直跨太平洋:18跳
  • 绕行日本‑跨洋:+3‑5跳
  • 绕行欧洲‑大西洋:跳数大幅上涨,延迟暴涨

五、延迟和跳数的关系

中美西海岸正常RTT:130‑180ms

  • 光单程物理时延(上海‑洛杉矶)≈60ms
  • 剩下大部分延迟来自:各个路由器排队、缓存处理。
    跳数多一点不一定延迟高,跳数少也不一定快(骨干链路拥塞)。

六、参考对比标尺(方便你建立量级认知)

路径 典型跳数
家里‑同楼层WiFi 1‑2
同城访问服务器 5‑10
跨省(北京‑广州) 10‑15
中国→日本/新加坡 12‑18
中国→美西洛杉矶 15‑22
中国→美东纽约 20‑28

如果你需要,我可以给你一份完整、带跳号的文字版 traceroute 样例,模拟一条北京到洛杉矶真实数据包完整路径。

相关推荐
OpenCloudOS8 小时前
从快速响应到问题发现:一次backport挖出全新漏洞CVE-2026-76641
服务器·网络·安全
张文君8 小时前
ubuntu26.04从ext4改成mdadm的raid1+lvm启动
linux·运维·网络
德迅云安全-上官8 小时前
游戏攻防反套路:德迅云安全游戏盾如何破解黑产的“低成本精准打击”
网络·安全·游戏
2401_868534788 小时前
服务器实战
网络·beautifulsoup
ouynagda8 小时前
Linux 进程管理详解:从概念到实践
linux·运维·网络
dog25010 小时前
再论 TCP 的流式传输
网络·网络协议·tcp/ip
xia54204644610 小时前
业务安全之信用卡撞库分析
网络·安全
德迅云安全杨德俊11 小时前
游戏攻防反套路:游戏盾如何破解黑产的“低成本精准打击”
网络·安全·游戏
zbyyd12 小时前
Linux 多线程:互斥锁 & 信号量
linux·c语言·开发语言·网络