路由器的核心任务是根据目标 IP 地址,将数据包从源主机一步步(逐跳)转发到目标主机所在的网络。这一过程依赖 路由表(Routing Table)路由转发算法,以下是其详细工作机制:


1. 路由器的核心工作流程

当路由器收到一个数据包时,会按以下步骤处理:

步骤 1:解封装到网络层

  1. 数据链路层剥离帧头(如以太网头部),提取网络层的 IP 数据包

  2. 检查 IP 头部的 目标 IP 地址(Destination IP Address)。

步骤 2:查询路由表

  1. 路由器根据目标 IP 地址,在路由表中查找 最长匹配的前缀(Longest Prefix Match)

    • 路由表条目示例

      <PLAINTEXT>
      目标网络      下一跳地址      出口接口
      192.168.1.0/24  -           eth0      (直连网络)
      10.0.0.0/8      192.168.1.1 eth0      (静态路由)
      0.0.0.0/0       203.0.113.1 eth1      (默认路由)
    • 匹配规则
      选择与目标 IP 地址匹配的最长子网掩码的条目。例如:

      • 目标 IP 192.168.1.5 → 匹配 192.168.1.0/24(直连网络)。

      • 目标 IP 10.1.2.3 → 匹配 10.0.0.0/8

      • 目标 IP 8.8.8.8 → 匹配默认路由 0.0.0.0/0

步骤 3:确定下一跳和出口接口

  • 如果目标网络是 直连网络(如 192.168.1.0/24):

    • 直接通过 ARP 协议查询目标 IP 的 MAC 地址,将数据包转发到目标主机。

  • 如果目标网络是 非直连网络

    • 根据路由表找到下一跳路由器的 IP 地址(如 192.168.1.1)。

    • 通过 ARP 协议获取下一跳路由器的 MAC 地址。

步骤 4:重新封装并转发

  1. 更新数据链路层帧头:

    • 源 MAC 地址:当前路由器出口接口的 MAC 地址。

    • 目标 MAC 地址:下一跳路由器接口的 MAC 地址。

  2. 通过出口接口(如 eth0)发送数据包。

步骤 5:逐跳重复直到终点

  • 每个路由器独立执行上述步骤,直到数据包到达目标网络。


2. 关键机制详解

(1) 路由表的构成

路由表条目可能来自:

  • 直连路由:路由器自动发现其直连的网络(如 eth0 连接的 192.168.1.0/24)。

  • 静态路由:管理员手动配置的路由(如 ip route add 10.0.0.0/8 via 192.168.1.1)。

  • 动态路由协议:通过 OSPF、BGP 等协议自动学习路由(如互联网中路由器间的路由交换)。

(2) 最长前缀匹配(Longest Prefix Match)

  • 原理
    选择与目标 IP 地址匹配的最具体的子网。例如:

    • 路由表中有 172.16.0.0/16172.16.1.0/24 两条路由。

    • 目标 IP 172.16.1.5 会匹配更具体的 172.16.1.0/24

(3) TTL(Time to Live)机制

  • IP 头部中的 TTL 字段 每经过一个路由器减 1。若 TTL 归零,数据包被丢弃(防止无限循环)。


3. 实际转发示例

假设客户端(IP: 192.168.1.2)访问服务器(IP: 8.8.8.8),路径经过两个路由器(R1 和 R2):

  1. 客户端发送数据包

    • 目标 IP: 8.8.8.8,目标 MAC: R1 的接口 MAC(通过 ARP 获得)。

  2. R1 处理

    • 查路由表,匹配默认路由(0.0.0.0/0),下一跳是 R2(IP: 203.0.113.1)。

    • 更新目标 MAC 为 R2 的接口 MAC,从出口接口转发。

  3. R2 处理

    • 查路由表,发现 8.8.8.8 属于直连网络,通过 ARP 获取服务器 MAC。

    • 直接转发给服务器。


4. 为什么需要逐跳转发?

  1. 网络拓扑复杂性
    互联网由无数自治网络(AS)组成,路由器无法预知完整路径。

  2. 动态路由变化
    网络链路可能随时故障,逐跳转发允许路由器动态调整路径。

  3. 分层寻址
    IP 地址的层次性(网络号 + 主机号)使路由器只需关注网络前缀,无需知道每个主机的具体位置。


5. 数据包在转发过程中的变化

  • IP 头部

    • 目标 IP 地址始终不变(端到端原则)。

    • TTL 字段逐跳减 1。

  • 数据链路层帧头

    • 每一跳的源 MAC 和目标 MAC 都会更新(指向当前路由器和下一跳)。

<PLAINTEXT>
# 示例:客户端 → R1 → R2 → 服务器
客户端发送:
[目标 IP:8.8.8.8 | 目标 MAC:R1-MAC]

R1转发:
[目标 IP:8.8.8.8 | 目标 MAC:R2-MAC]

R2转发:
[目标 IP:8.8.8.8 | 目标 MAC:Server-MAC]

总结

路由器的逐跳转发本质是:

  1. 查表决策:根据目标 IP 和路由表,选择最佳下一跳。

  2. 链路层封装:通过 MAC 地址将数据包传递给下一设备。

  3. 协作完成端到端传输:所有路由器接力传递,最终将数据包送达目标网络。