IP
一个数据包(IP Packet)是如何通过路由器进行传输的。这个过程就像是一场精心策划的“跨城接力赛”。
我们将以一个典型的场景为例:你家里的电脑(主机A)要访问一个网站服务器(主机B)。
场景设定:
- 主机A (你的电脑):
- IP地址:
192.168.1.100
(私有IP) - MAC地址:
AA:AA:AA:AA:AA:AA
- IP地址:
- 你的家用路由器 (我们称之为 路由器R1):
- LAN口IP:
192.168.1.1
(主机A的默认网关) - LAN口MAC:
BB:BB:BB:BB:BB:BB
- WAN口IP:
202.96.134.133
(公网IP) - WAN口MAC:
CC:CC:CC:CC:CC:CC
- LAN口IP:
- 中间的某个互联网骨干路由器 (我们称之为 路由器R2)
- 网站服务器 (我们称之为 主机B):
- IP地址:
157.148.88.20
(公网IP) - MAC地址:
DD:DD:DD:DD:DD:DD
- IP地址:
整个旅程可以分为几个关键阶段:离开起点、跨越网络、到达终点。
第一阶段:离开起点(在你的局域网内)
步骤1:主机A准备数据包
主机A(你的电脑)的应用程序(如浏览器)创建了一个HTTP请求。这个数据会自上而下地通过协议栈进行封装:
- 应用层:生成HTTP请求数据。
- 传输层:给数据加上TCP头部,形成TCP段(Segment)。
- 源端口:一个随机端口,如
51000
- 目的端口:
80
(HTTP)
- 源端口:一个随机端口,如
- 网络层:给TCP段加上IP头部,形成IP数据包(Packet)。
- 源IP地址:
192.168.1.100
- 目的IP地址:
157.148.88.20
- 源IP地址:
- 数据链路层:这是关键的一步!主机A需要将IP包封装成以太网帧(Frame)才能在局域网内发送。帧头里需要填写目标MAC地址。
步骤2:确定下一跳的MAC地址 (ARP)
- 主机A查看目的IP地址
157.148.88.20
。 - 它用自己的子网掩码(如
255.255.255.0
)一对比,发现目标IP和自己不在同一个局域网。 - 决策:数据包不能直接发给主机B,必须发给默认网关(Default Gateway),也就是你的家用路由器R1 (
192.168.1.1
)。 - 现在,主机A需要知道路由器R1的MAC地址。它会先查自己的ARP缓存。
- 如果缓存里有
192.168.1.1
对应的MAC地址BB:BB:BB:BB:BB:BB
,直接使用。 - 如果没有,主机A会发送一个ARP请求(广播):“谁是
192.168.1.1
?请告诉我你的MAC地址。” - 路由器R1会回复ARP响应(单播):“我是,我的MAC是
BB:BB:BB:BB:BB:BB
。” - 主机A将此信息存入ARP缓存。
- 如果缓存里有
步骤3:封装并发送第一帧
现在所有信息都齐了。主机A封装第一个以太网帧:
- 帧头:
- 源MAC地址:
AA:AA:AA:AA:AA:AA
(主机A的MAC) - 目的MAC地址:
BB:BB:BB:BB:BB:BB
(路由器R1的MAC)
- 源MAC地址:
- 帧的数据部分:就是前面准备好的那个IP包。
主机A通过网线或Wi-Fi将这个帧发送出去。
本阶段小结:在局域网内,IP地址用于最终目的地的寻址,而MAC地址用于下一跳的寻址。
第二阶段:跨越网络(路由器的核心工作)
步骤4:路由器R1接收并处理数据包
- 路由器R1的LAN口接收到这个以太网帧。它检查帧头的目的MAC地址,发现是自己的 (
BB:BB:BB:BB:BB:BB
),于是接收这个帧。 - 解封装:路由器R1“拆开”以太网帧,取出里面的IP数据包。
- 检查IP包:路由器R1查看IP包的头部。它关注的核心是目的IP地址
157.148.88.20
。
步骤5:路由器的核心决策——查找路由表
这是路由(Routing)的核心环节。路由器R1会查询自己的路由表(Routing Table)。路由表就像一张地图,记录着“要去某个网络,应该从哪个出口走,下一站是谁”。
一个简化的路由表可能长这样:
目的网络 | 子网掩码 | 下一跳地址 | 出口接口 |
---|---|---|---|
192.168.1.0 | 255.255.255.0 | (直连) | LAN |
0.0.0.0 | 0.0.0.0 | isp.gateway.ip | WAN |
- 路由器用目的IP
157.148.88.20
在路由表中进行最长前缀匹配。 - 它发现
157.148.88.20
不匹配第一条(局域网规则)。 - 它匹配了第二条,即
0.0.0.0/0
,这是默认路由(Default Route),意思是“所有我不知道具体怎么走的地址,都从WAN口发出去”。 - 决策:路由器决定将数据包从WAN口转发出去。
步骤6:路由器R1执行NAT并重新封装
在转发之前,家用路由器R1通常还会做一件事:
- NAT(网络地址转换):
- 它将IP包的源IP地址从私有的
192.168.1.100
修改为 路由器的公网IP202.96.134.133
。 - 它在自己的NAT转换表中记录下这个映射关系,以便回来的包能找到正确的路。
- 它将IP包的源IP地址从私有的
然后,路由器R1准备将这个修改后的IP包发送给互联网上的下一跳路由器(比如ISP的某个路由器,我们称之为R2)。
- 重新封装:路由器R1需要将IP包封装成一个新的帧。
- 它需要知道下一跳路由器的MAC地址。这个过程和步骤2一样,它会通过ARP(或者其他链路层协议)找到下一跳的MAC地址。
- 源MAC地址:
CC:CC:CC:CC:CC:CC
(路由器R1的WAN口MAC) - 目的MAC地址: 下一跳路由器的MAC地址
- 修改TTL:IP头部的**生存时间(TTL)**字段减1。
- 重新计算校验和:因为修改了IP头部(源IP和TTL),必须重新计算IP头部的校验和。
路由器R1将这个全新的帧发送出去。
重要观察:
- IP地址(源和目的)在整个旅程中通常保持不变(除了经过NAT时源IP会变)。它们是全局的、端到端的地址。
- MAC地址(源和目的)在每一跳都会改变。它们是局部的、逐跳的地址,只在两个相邻节点之间有效。
步骤7:在互联网骨干网中接力
数据包到达了互联网上的路由器R2。R2会重复路由器R1的步骤4、5、6(除了NAT):
- 接收帧,检查MAC地址。
- 解封装,取出IP包。
- 查看目的IP
157.148.88.20
。 - 查找自己的、更庞大、更复杂的路由表,找到通往
157.148.0.0/16
这个网络的最佳路径。 - 修改TTL,重新计算校验和。
- 重新封装成新的帧(使用新的源/目的MAC地址),发往下一跳。
这个过程会在互联网上重复多次,数据包像接力棒一样,从一个路由器传递到下一个路由器,每一步都离最终目的地更近一些。traceroute
命令就是用来显示这个接力路径的。
第三阶段:到达终点
步骤8:最后一跳路由器交付数据包
数据包最终到达了与网站服务器主机B在同一个局域网的路由器(我们称之为R-Final)。
- R-Final查找路由表,发现目的IP
157.148.88.20
就在自己直连的网络中。 - 它需要将数据包直接交付给主机B。
- 它会通过ARP广播:“谁是
157.148.88.20
?”,主机B会用自己的MAC地址DD:DD:DD:DD:DD:DD
回应。
步骤9:主机B接收数据包
- R-Final封装最后一帧:
- 源MAC:R-Final的MAC
- 目的MAC:
DD:DD:DD:DD:DD:DD
(主机B的MAC)
- 主机B的网卡接收到这个帧,检查目的MAC是自己,于是接收。
- 主机B解封装,取出IP包,再取出TCP段,最后将数据交给Web服务器应用程序。
至此,一个数据包的单程旅行就结束了。服务器的回应包会沿着类似(但不一定完全相同)的路径反向进行这一过程。
总结:路由传输的核心思想
- 分层协作:IP层负责端到端的全局路径规划,数据链路层(MAC地址)负责点到点的局部传输。
- 逐跳决策:每个路由器都只根据当前的目的IP地址和自己的路由表,做出独立的、本地的“下一跳”决策,它不关心整个路径。
- 地址不变与可变:在传输过程中,IP地址(逻辑地址)是“指南针”,始终指向最终目的地;而MAC地址(物理地址)是“快递单上的下一个中转站地址”,每过一站都会被撕掉重写。
- 封装与解封装:数据包在每一跳都会被路由器“拆开”(解封装到IP层)和“重新包装”(封装成新的帧),以便在不同的物理链路上进行传输。
Last updated on