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

Chapter 4-1:网络层数据平面如何完成逐跳转发
agsdChapter 4-1:网络层数据平面如何完成逐跳转发
Chapter 4-1 的主线是网络层的数据平面。它讨论的不是某一条具体路由协议如何计算最短路径,而是一个更底层、更频繁发生的问题:当一个 IP 数据报进入路由器后,路由器如何在本地快速决定输出端口,并把它送往下一跳。
从端到端视角看,传输层交下来的 segment 会被网络层封装成 datagram。这个 datagram 经过一个个路由器时,每个路由器都会检查其头部,根据转发表做出本地转发决策,再通过链路层重新封装后发往下一跳。
❗ 本节核心结论: 网络层数据平面的核心任务,是让每个路由器对经过自己的 IP 数据报做出高速、本地、逐跳的转发决策。
1. 网络层到底解决什么问题
网络层位于传输层之下、链路层之上。它解决的是主机到主机的数据报传送问题。
传输层关注的是进程到进程通信。例如浏览器进程和 Web 服务器进程之间通过 TCP 或 UDP 交换 segment。但真实网络中,segment 不会直接从一个进程“飞到”另一个进程,而是要经过主机、链路、路由器和下一跳链路。因此,网络层需要把传输层 segment 封装成 IP 数据报,并负责让它穿过网络。
一个典型过程可以写成:
1 | 发送主机:应用层 message → 传输层 segment → 网络层 datagram → 链路层 frame |
这里有一个容易被忽略的点:网络层协议不仅存在于路由器,也存在于主机。主机需要封装和解封装 IP 数据报;路由器需要检查 IP 头部并决定下一跳。
flowchart LR
A[发送进程] --> B[传输层 segment]
B --> C[网络层 datagram]
C --> D[链路层 frame]
D --> E[路由器逐跳转发]
E --> F[接收主机网络层]
F --> G[接收进程]
这张图强调:网络层承担的是跨主机的数据报传送,而不是直接负责应用进程之间的语义通信。
❗ 本节核心结论: 传输层解决进程到进程通信,网络层解决主机到主机的数据报传送;主机和路由器都需要网络层。
2. 路由器为什么也要处理链路层
路由器通常被称为网络核心设备,但这不意味着它只处理网络层。更准确地说,路由器的转发决策主要依据网络层信息,但每个接口都连接在某条具体链路上,所以它必须在每一跳处理物理层和链路层。
一个 IP 数据报进入路由器时,大致经历以下过程:
- 输入端口从链路上接收 bit 流。
- 物理层完成 bit 级接收。
- 链路层处理 frame,检查链路层头部和尾部,并解封装出 IP datagram。
- 网络层查看 IP 头部,根据转发表决定输出端口。
- 数据报通过交换结构进入目标输出端口。
- 输出端口重新进行链路层封装。
- 物理层把新的 frame 发往下一跳。
也就是说,路由器不是把一个收到的链路层 frame 原封不动转发出去。链路层 frame 只在一跳链路上有效。到了下一个路由器,上一跳的链路层封装已经完成使命,需要被剥离;当数据报要进入下一条链路时,又需要换成适用于下一条链路的新 frame。
但路由器正常转发时,通常不会继续解封装到 TCP/UDP segment,更不会读取应用层内容。它处理到网络层已经足够完成转发决策。
| 设备位置 | 会处理到哪一层 | 主要目的 |
|---|---|---|
| 发送主机 | 应用层、传输层、网络层、链路层、物理层 | 产生数据并封装发送 |
| 中间路由器 | 物理层、链路层、网络层 | 查 IP 头部并逐跳转发 |
| 接收主机 | 物理层、链路层、网络层、传输层、应用层 | 解封装并交付应用 |
❗ 本节核心结论: 路由器的核心决策发生在网络层,但每一跳收发都必须经过物理层和链路层;路由器会解封装旧 frame,并为下一跳重新封装新 frame。
3. forwarding、routing 与两个平面
网络层有两个经常被混淆的功能:forwarding 和 routing。
| 对比项 | forwarding 转发 | routing 路由选择 |
|---|---|---|
| 解决的问题 | 当前路由器收到分组后,从哪个端口出去 | 从源主机到目的主机,整体路径怎么走 |
| 作用范围 | 单个路由器内部 | 整个网络范围 |
| 时间要求 | 极高,需要快速完成 | 相对较慢,可以周期性或事件触发计算 |
| 所属平面 | 数据平面 | 控制平面 |
| 依赖内容 | 转发表、流表 | 路由算法、路由协议、控制器 |
forwarding 是本地动作。它回答的是:这个分组已经到达当前路由器,现在应该从哪个接口发出去?
routing 是全局逻辑。它回答的是:从源主机到目的主机,应该经过哪些路由器?
因此,不应把路由器理解成“每收到一个分组就重新计算一遍最短路径”。更准确的理解是:控制平面通过路由算法、路由协议或 SDN 控制器生成路径信息,并形成转发表;数据平面在分组到达时使用这些已经生成好的表项进行高速转发。
flowchart TD
A[控制平面] --> B[运行路由算法或接收控制器规则]
B --> C[生成路由信息]
C --> D[形成转发表或流表]
D --> E[数据平面]
E --> F[输入端口查表]
F --> G[选择输出端口]
G --> H[交换结构转发]
这张图说明:控制平面负责产生规则,数据平面负责执行规则。两者相互依赖,但不是同一个动作。
❗ 本节核心结论: routing 决定路径,forwarding 执行转发;控制平面生成表项,数据平面按表项高速处理分组。
4. best effort:Internet 网络层的服务边界
网络服务模型回答的是:网络层作为一条通信通道,向上层承诺什么服务。
理论上,网络层可以承诺很多东西,例如:
- 单个数据报可靠到达;
- 单个数据报具有延迟保证;
- 一个数据报流保持顺序;
- 数据报流获得最低带宽保证;
- 分组之间的延迟差受到限制。
但 Internet 的网络层主要采用 best effort,即尽最大努力服务。它会尽力转发数据报,但不保证:
- 数据报一定成功到达。
- 数据报按发送顺序到达。
- 数据报在某个时间上限内到达。
- 端到端带宽一定满足某个要求。
best effort 不是“完全不管”。它仍然有明确的地址、转发、查表和路由机制。它的含义只是:IP 层本身不提供强可靠性承诺。
这并不妨碍互联网传输可靠数据,因为可靠性可以由上层补足。TCP 可以在 IP 的不可靠数据报服务之上,通过确认、重传、序号、窗口和拥塞控制等机制实现可靠传输。
❗ 本节核心结论: IP 层的 best effort 不保证可靠性、顺序、时延或带宽;但上层协议可以在此基础上构造更强的服务。
5. 路由器内部不是黑盒
从外部看,路由器像是一个“入口进来、出口出去”的黑盒。但为了理解数据平面,需要把它拆开看。
一个通用路由器通常包括:
- 输入端口 input ports:接收分组,完成链路层处理,查转发表,必要时排队。
- 交换结构 switching fabric:把分组从输入端口搬运到正确的输出端口。
- 输出端口 output ports:缓存分组,执行调度,并发往下一条链路。
- 路由处理器 routing processor:运行路由协议、维护管理功能,属于控制平面部分。
数据平面通常要求极高速度。分组到达间隔可能非常短,如果每个分组都交给通用 CPU 慢慢处理,路由器会成为瓶颈。因此现代路由器往往把高速查表和分组搬运放在专门硬件中完成。
flowchart LR
A[输入端口] --> B[查转发表]
B --> C[交换结构]
C --> D[输出端口]
D --> E[排队与调度]
E --> F[下一跳链路]
G[路由处理器] -.生成/维护表项.-> B
这张图体现了路由器内部的分工:路由处理器偏控制平面,输入端口、交换结构和输出端口偏数据平面。
❗ 本节核心结论: 路由器内部由输入端口、交换结构、输出端口和路由处理器协作完成;高速转发主要属于数据平面,不应简单理解为纯软件行为。
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 | 中国 |
如果一个地址同时符合“中国”“中国广东”“中国广东广州”,实际投递时应使用更具体的规则,而不是最宽泛的规则。
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 网络层的弱服务承诺;最长前缀匹配解决了多个地址前缀同时匹配时的优先级问题;交换结构、缓存和调度则体现了路由器高速转发背后的工程约束。








