Chapter 4-1:网络层数据平面如何完成逐跳转发

Chapter 4-1:网络层数据平面如何完成逐跳转发

Chapter 4-1 的主线是网络层的数据平面。它讨论的不是某一条具体路由协议如何计算最短路径,而是一个更底层、更频繁发生的问题:当一个 IP 数据报进入路由器后,路由器如何在本地快速决定输出端口,并把它送往下一跳。

从端到端视角看,传输层交下来的 segment 会被网络层封装成 datagram。这个 datagram 经过一个个路由器时,每个路由器都会检查其头部,根据转发表做出本地转发决策,再通过链路层重新封装后发往下一跳。


❗ 本节核心结论: 网络层数据平面的核心任务,是让每个路由器对经过自己的 IP 数据报做出高速、本地、逐跳的转发决策。

1. 网络层到底解决什么问题

网络层位于传输层之下、链路层之上。它解决的是主机到主机的数据报传送问题。

传输层关注的是进程到进程通信。例如浏览器进程和 Web 服务器进程之间通过 TCP 或 UDP 交换 segment。但真实网络中,segment 不会直接从一个进程“飞到”另一个进程,而是要经过主机、链路、路由器和下一跳链路。因此,网络层需要把传输层 segment 封装成 IP 数据报,并负责让它穿过网络。

一个典型过程可以写成:

1
2
3
发送主机:应用层 message → 传输层 segment → 网络层 datagram → 链路层 frame
中间路由器:链路层 frame → 网络层 datagram → 查表转发 → 新的链路层 frame
接收主机:链路层 frame → 网络层 datagram → 传输层 segment → 应用层 message

这里有一个容易被忽略的点:网络层协议不仅存在于路由器,也存在于主机。主机需要封装和解封装 IP 数据报;路由器需要检查 IP 头部并决定下一跳。

这张图强调:网络层承担的是跨主机的数据报传送,而不是直接负责应用进程之间的语义通信。


❗ 本节核心结论: 传输层解决进程到进程通信,网络层解决主机到主机的数据报传送;主机和路由器都需要网络层。

2. 路由器为什么也要处理链路层

路由器通常被称为网络核心设备,但这不意味着它只处理网络层。更准确地说,路由器的转发决策主要依据网络层信息,但每个接口都连接在某条具体链路上,所以它必须在每一跳处理物理层和链路层。

一个 IP 数据报进入路由器时,大致经历以下过程:

  1. 输入端口从链路上接收 bit 流。
  2. 物理层完成 bit 级接收。
  3. 链路层处理 frame,检查链路层头部和尾部,并解封装出 IP datagram。
  4. 网络层查看 IP 头部,根据转发表决定输出端口。
  5. 数据报通过交换结构进入目标输出端口。
  6. 输出端口重新进行链路层封装。
  7. 物理层把新的 frame 发往下一跳。

也就是说,路由器不是把一个收到的链路层 frame 原封不动转发出去。链路层 frame 只在一跳链路上有效。到了下一个路由器,上一跳的链路层封装已经完成使命,需要被剥离;当数据报要进入下一条链路时,又需要换成适用于下一条链路的新 frame。

但路由器正常转发时,通常不会继续解封装到 TCP/UDP segment,更不会读取应用层内容。它处理到网络层已经足够完成转发决策。

设备位置 会处理到哪一层 主要目的
发送主机 应用层、传输层、网络层、链路层、物理层 产生数据并封装发送
中间路由器 物理层、链路层、网络层 查 IP 头部并逐跳转发
接收主机 物理层、链路层、网络层、传输层、应用层 解封装并交付应用

❗ 本节核心结论: 路由器的核心决策发生在网络层,但每一跳收发都必须经过物理层和链路层;路由器会解封装旧 frame,并为下一跳重新封装新 frame。

3. forwarding、routing 与两个平面

网络层有两个经常被混淆的功能:forwarding 和 routing。

对比项 forwarding 转发 routing 路由选择
解决的问题 当前路由器收到分组后,从哪个端口出去 从源主机到目的主机,整体路径怎么走
作用范围 单个路由器内部 整个网络范围
时间要求 极高,需要快速完成 相对较慢,可以周期性或事件触发计算
所属平面 数据平面 控制平面
依赖内容 转发表、流表 路由算法、路由协议、控制器

forwarding 是本地动作。它回答的是:这个分组已经到达当前路由器,现在应该从哪个接口发出去?

routing 是全局逻辑。它回答的是:从源主机到目的主机,应该经过哪些路由器?

因此,不应把路由器理解成“每收到一个分组就重新计算一遍最短路径”。更准确的理解是:控制平面通过路由算法、路由协议或 SDN 控制器生成路径信息,并形成转发表;数据平面在分组到达时使用这些已经生成好的表项进行高速转发。

这张图说明:控制平面负责产生规则,数据平面负责执行规则。两者相互依赖,但不是同一个动作。


❗ 本节核心结论: routing 决定路径,forwarding 执行转发;控制平面生成表项,数据平面按表项高速处理分组。

4. best effort:Internet 网络层的服务边界

网络服务模型回答的是:网络层作为一条通信通道,向上层承诺什么服务。

理论上,网络层可以承诺很多东西,例如:

  • 单个数据报可靠到达;
  • 单个数据报具有延迟保证;
  • 一个数据报流保持顺序;
  • 数据报流获得最低带宽保证;
  • 分组之间的延迟差受到限制。

但 Internet 的网络层主要采用 best effort,即尽最大努力服务。它会尽力转发数据报,但不保证:

  1. 数据报一定成功到达。
  2. 数据报按发送顺序到达。
  3. 数据报在某个时间上限内到达。
  4. 端到端带宽一定满足某个要求。

best effort 不是“完全不管”。它仍然有明确的地址、转发、查表和路由机制。它的含义只是:IP 层本身不提供强可靠性承诺。

这并不妨碍互联网传输可靠数据,因为可靠性可以由上层补足。TCP 可以在 IP 的不可靠数据报服务之上,通过确认、重传、序号、窗口和拥塞控制等机制实现可靠传输。


❗ 本节核心结论: IP 层的 best effort 不保证可靠性、顺序、时延或带宽;但上层协议可以在此基础上构造更强的服务。

5. 路由器内部不是黑盒

从外部看,路由器像是一个“入口进来、出口出去”的黑盒。但为了理解数据平面,需要把它拆开看。

一个通用路由器通常包括:

  • 输入端口 input ports:接收分组,完成链路层处理,查转发表,必要时排队。
  • 交换结构 switching fabric:把分组从输入端口搬运到正确的输出端口。
  • 输出端口 output ports:缓存分组,执行调度,并发往下一条链路。
  • 路由处理器 routing processor:运行路由协议、维护管理功能,属于控制平面部分。

数据平面通常要求极高速度。分组到达间隔可能非常短,如果每个分组都交给通用 CPU 慢慢处理,路由器会成为瓶颈。因此现代路由器往往把高速查表和分组搬运放在专门硬件中完成。

这张图体现了路由器内部的分工:路由处理器偏控制平面,输入端口、交换结构和输出端口偏数据平面。


❗ 本节核心结论: 路由器内部由输入端口、交换结构、输出端口和路由处理器协作完成;高速转发主要属于数据平面,不应简单理解为纯软件行为。

6. 基于目标的转发为什么会遇到多个匹配项

传统 IP 转发通常采用基于目标地址的转发:路由器查看 IP 数据报的目的地址,根据转发表选择输出端口。

看起来这像是一个简单映射:

1
目标 IP 地址 → 输出端口

但真实转发表通常不会为每一个完整 IP 地址保存一条记录,而是保存地址前缀。例如:

目标地址前缀 输出接口
200.23.16.0/21 0
200.23.24.0/24 1
200.23.24.0/21 2
otherwise 3

因此,一个目标 IP 可能同时属于多个地址范围。

例如 200.23.24.170 可能同时匹配:

  • 200.23.24.0/24
  • 某个更大的 /21 地址范围
  • 默认路由 otherwise

这并不意味着路由器可以含糊地选择多个出口。在基本模型中,它必须选出一个最合适的表项。解决规则就是最长前缀匹配

需要补充边界:真实网络中可能存在 ECMP(Equal-Cost Multi-Path,等价多路径),即同一前缀有多个等价下一跳,路由器可以进行负载均衡。但在学习最长前缀匹配时,应先把核心规则掌握清楚:多个前缀同时匹配时,优先选择匹配位数最多的前缀。


❗ 本节核心结论: 基于目标的转发表存的通常是地址前缀,不是每个完整 IP;一个目标 IP 可以匹配多个前缀,因此需要最长前缀匹配来确定优先级。

7. 最长前缀匹配的真正含义

最长前缀匹配的英文是 longest prefix match。它的规则是:当目标地址同时匹配多个转发表项时,选择前缀长度最长的一项。

关键是理解“前缀”。IPv4 地址是 32 bit。例如:

1
11001000 00010111 00011000 10101010

它可以表示为十进制地址:

1
200.23.24.170

所谓前缀,就是从左边最高位开始的一段连续 bit。例如:

1
11001000 00010111 00011000

这是前 24 bit,可以写成:

1
200.23.24.0/24

其中 /24 表示前 24 bit 是网络前缀,后 8 bit 是主机部分。

7.1 不是完整相等,而是开头匹配

路由器查转发表时,不是问:

1
目标 IP 是否与某个表项完全相等?

而是问:

1
目标 IP 的开头若干 bit 是否与某个表项前缀相同?

如果有多条表项都匹配,就选择相同 bit 数最多的那条。

7.2 用二进制表项看一遍

假设转发表如下:

目标地址前缀 前缀长度 输出接口
11001000 00010111 00010 21 bit 0
11001000 00010111 00011000 24 bit 1
11001000 00010111 00011 21 bit 2
otherwise - 3

目标地址为:

1
11001000 00010111 00011000 10101010

逐项比较:

表项 是否匹配 原因
11001000 00010111 00010 不匹配 第三个字节开头为 00011...,不是 00010...
11001000 00010111 00011000 匹配 前 24 bit 完全相同
11001000 00010111 00011 匹配 前 21 bit 相同

最终同时匹配了 24 bit 表项和 21 bit 表项。最长前缀匹配选择 24 bit 表项,所以输出接口是 1。

7.3 为什么要选“最长”

前缀越长,覆盖范围越小,规则越具体。

可以用现实地址类比:

1
2
3
4
中国
中国广东
中国广东广州
中国广东广州番禺区

如果一个地址同时符合“中国”“中国广东”“中国广东广州”,实际投递时应使用更具体的规则,而不是最宽泛的规则。

IP 转发同理:

前缀 含义 具体程度
/8 固定前 8 bit 很宽泛
/16 固定前 16 bit 更具体
/24 固定前 24 bit 更具体
/32 固定全部 32 bit 单个主机地址

最长前缀匹配的本质,就是最具体规则优先

7.4 常见误解

最长前缀匹配不是:

  • 数字最大的表项优先;
  • 最早出现在表里的表项优先;
  • 任意位置最长子串匹配;
  • 与目标 IP 完整相等才算匹配。

它只比较一件事:从 IP 地址最高位开始,连续相同的 bit 数量谁更多。


❗ 本节核心结论: 最长前缀匹配比较的是从左到右连续匹配的 bit 数;前缀越长,规则越具体,因此多个表项同时匹配时选择最长前缀。

8. 交换结构、排队与调度

查表只解决“该去哪个输出端口”。分组还必须真的从输入端口移动到输出端口,这需要交换结构。

8.1 交换结构的作用

交换结构负责把分组从输入端口搬运到合适的输出端口。常见结构包括:

交换结构 工作方式 主要瓶颈
memory 内存交换 分组拷贝到内存,由处理器处理后再拷贝到输出端口 内存带宽,通常难以并行处理多个分组
bus 总线交换 输入端口通过共享总线把分组送到输出端口 总线竞争,总线带宽
interconnection network / crossbar 互联网络交换 多条内部路径并行转发多个分组 结构更复杂,但并行能力更强

如果有 N 个输入端口,理想情况下交换结构的速率最好达到单条输入线路速率的 N 倍。否则多个输入端口同时到达分组时,交换结构本身会成为瓶颈。

8.2 为什么会排队

只要到达速度超过处理或发送速度,就会排队。

输入端口排队通常来自:

  • 分组到达太快;
  • 交换结构来不及把分组搬到输出端口;
  • 输出端口竞争导致输入端口暂时无法发送。

输出端口排队通常来自:

  • 多个输入端口同时把分组送往同一个输出端口;
  • 输出链路速率有限,无法立刻发送所有到达分组。

缓存可以吸收突发流量,但缓存不是越大越好。更大的缓存可能减少丢包,却会增加排队时延。

8.3 HOL blocking

HOL blocking 是 Head-of-the-Line blocking,即队头阻塞。

它指的是:输入队列头部的分组因为目标输出端口暂时不可用而无法前进,于是挡住了后面那些本来可以转发到其他空闲输出端口的分组。

这个问题说明,分组转发的瓶颈不只在查表,还可能出现在端口竞争和队列结构上。

8.4 分组调度

当输出端口有多个分组等待发送时,调度算法决定下一次发送谁。

调度策略 基本思想 优点 代价或风险
FIFO / FCFS 谁先来谁先发 简单 不能区分业务重要性
Priority 高优先级队列先发 适合实时或重要业务 低优先级可能饥饿
Round Robin 多个队列轮流发 防止某类流量长期霸占 默认权重相同,表达能力有限
WFQ 按权重分配服务量 可提供更细的带宽分配 实现复杂度更高

❗ 本节核心结论: 数据平面不只是查表;交换结构负责内部搬运,队列处理速率不匹配,调度算法决定输出端口下一次发送哪个分组。

9. 易混点集中整理

9.1 网络层连接不是 TCP 连接

传输层连接通常是进程或端口之间的逻辑关系,例如 TCP 连接。网络层连接如果存在,则是主机之间、路径中多个路由器共同参与的关系。不要看到“连接”就自动等同于 TCP。

9.2 best effort 不是随便丢包

best effort 只是没有强服务保证。IP 层仍然按照地址、转发表、路由协议和转发机制工作。它不保证可靠性,但不是没有规则。

9.3 路由表和转发表不要完全混为一谈

学习早期可以把二者粗略联系起来,但更准确地说:

  • 路由算法或路由协议产生路由信息;
  • 数据平面实际查的是用于转发的表项;
  • 转发表可以由路由表计算、筛选、下发或硬件化而来。

9.4 最长前缀匹配不是最长子串匹配

它只从 IP 地址最高位开始比较前缀,不在地址中间寻找任意相同片段。

9.5 缓冲区越大越好是错误理解

缓冲区增加可以降低突发场景下的丢包概率,但会增加排队时延。网络系统中经常需要在丢包率和时延之间权衡。


❗ 本节核心结论: 本章最容易错的地方不是术语翻译,而是边界:路由器处理到网络层但每跳要过链路层;best effort 不等于无规则;最长前缀匹配只比较高位前缀。

10. 复习清单

学完本节后,应能回答:

  • 网络层和传输层分别提供什么层次的逻辑通信?
  • 为什么网络层协议既存在于主机,也存在于路由器?
  • 路由器为什么要处理链路层 frame,但通常不处理 TCP/UDP segment?
  • forwarding 和 routing 的区别是什么?
  • data plane 和 control plane 分别负责什么?
  • 为什么不能说路由器每收到一个分组都重新计算路径?
  • Internet 的 best effort 不保证哪些服务?
  • TCP 的可靠传输和 IP 的 best effort 是否矛盾?
  • 一个 IP 数据报经过路由器时,大致经历哪些步骤?
  • 基于目标的转发为什么可能出现多个前缀同时匹配?
  • 最长前缀匹配中的“最长”到底指什么?
  • /16/24/32 哪个更具体?为什么?
  • switching fabric 和普通意义上的链路层交换机有什么区别?
  • 输入排队和输出排队分别由什么原因造成?
  • HOL blocking 为什么会让后面的分组也无法前进?
  • FIFO、Priority、Round Robin、WFQ 各自适合什么场景?

最终总结

Chapter 4-1 的核心是网络层数据平面。它说明了一个 IP 数据报在网络中不是靠某个路由器临时计算完整路径前进,而是靠每个路由器根据已有表项进行逐跳转发。

这条机制链可以压缩为:

1
链路层解封装 → IP 头部查表 → 最长前缀匹配 → 选择输出端口 → 交换结构搬运 → 输出排队与调度 → 链路层重新封装

其中,控制平面负责生成路径和表项,数据平面负责高速执行;best effort 定义了 Internet 网络层的弱服务承诺;最长前缀匹配解决了多个地址前缀同时匹配时的优先级问题;交换结构、缓存和调度则体现了路由器高速转发背后的工程约束。