Skip to Content

IP

一个数据包(IP Packet)是如何通过路由器进行传输的。这个过程就像是一场精心策划的“跨城接力赛”。

我们将以一个典型的场景为例:你家里的电脑(主机A)要访问一个网站服务器(主机B)。

场景设定:

  • 主机A (你的电脑):
    • IP地址: 192.168.1.100 (私有IP)
    • MAC地址: AA:AA:AA:AA:AA:AA
  • 你的家用路由器 (我们称之为 路由器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
  • 中间的某个互联网骨干路由器 (我们称之为 路由器R2)
  • 网站服务器 (我们称之为 主机B):
    • IP地址: 157.148.88.20 (公网IP)
    • MAC地址: DD:DD:DD:DD:DD:DD

整个旅程可以分为几个关键阶段:离开起点、跨越网络、到达终点


第一阶段:离开起点(在你的局域网内)

步骤1:主机A准备数据包

主机A(你的电脑)的应用程序(如浏览器)创建了一个HTTP请求。这个数据会自上而下地通过协议栈进行封装:

  1. 应用层:生成HTTP请求数据。
  2. 传输层:给数据加上TCP头部,形成TCP段(Segment)。
    • 源端口:一个随机端口,如51000
    • 目的端口:80 (HTTP)
  3. 网络层:给TCP段加上IP头部,形成IP数据包(Packet)。
    • 源IP地址192.168.1.100
    • 目的IP地址157.148.88.20
  4. 数据链路层:这是关键的一步!主机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)
  • 帧的数据部分:就是前面准备好的那个IP包。

主机A通过网线或Wi-Fi将这个帧发送出去。

本阶段小结:在局域网内,IP地址用于最终目的地的寻址,而MAC地址用于下一跳的寻址。


第二阶段:跨越网络(路由器的核心工作)

步骤4:路由器R1接收并处理数据包

  1. 路由器R1的LAN口接收到这个以太网帧。它检查帧头的目的MAC地址,发现是自己的 (BB:BB:BB:BB:BB:BB),于是接收这个帧。
  2. 解封装:路由器R1“拆开”以太网帧,取出里面的IP数据包。
  3. 检查IP包:路由器R1查看IP包的头部。它关注的核心是目的IP地址 157.148.88.20

步骤5:路由器的核心决策——查找路由表

这是路由(Routing)的核心环节。路由器R1会查询自己的路由表(Routing Table)。路由表就像一张地图,记录着“要去某个网络,应该从哪个出口走,下一站是谁”。

一个简化的路由表可能长这样:

目的网络子网掩码下一跳地址出口接口
192.168.1.0255.255.255.0(直连)LAN
0.0.0.00.0.0.0isp.gateway.ipWAN
  • 路由器用目的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 修改为 路由器的公网IP 202.96.134.133
    • 它在自己的NAT转换表中记录下这个映射关系,以便回来的包能找到正确的路。

然后,路由器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)

  1. 接收帧,检查MAC地址。
  2. 解封装,取出IP包。
  3. 查看目的IP 157.148.88.20
  4. 查找自己的、更庞大、更复杂的路由表,找到通往 157.148.0.0/16 这个网络的最佳路径。
  5. 修改TTL,重新计算校验和。
  6. 重新封装成新的帧(使用新的源/目的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服务器应用程序。

至此,一个数据包的单程旅行就结束了。服务器的回应包会沿着类似(但不一定完全相同)的路径反向进行这一过程。

总结:路由传输的核心思想

  1. 分层协作:IP层负责端到端的全局路径规划,数据链路层(MAC地址)负责点到点的局部传输。
  2. 逐跳决策:每个路由器都只根据当前的目的IP地址和自己的路由表,做出独立的、本地的“下一跳”决策,它不关心整个路径。
  3. 地址不变与可变:在传输过程中,IP地址(逻辑地址)是“指南针”,始终指向最终目的地;而MAC地址(物理地址)是“快递单上的下一个中转站地址”,每过一站都会被撕掉重写。
  4. 封装与解封装:数据包在每一跳都会被路由器“拆开”(解封装到IP层)和“重新包装”(封装成新的帧),以便在不同的物理链路上进行传输。
Last updated on