Appearance
Packet Path
Network Layer
The data plane forwards each packet locally; the control plane decides the global routing state.
datagramrouterSDN
01Ingresspacket in
02Lookuptable hit
03Switchfabric
04Egresslink out
第四章:网络层:数据平面
网络层负责在发送主机和接收主机之间传送传输层的段。发送端把段封装成 IP 数据报,路由器按数据报头部字段逐跳转发,接收端再从 IP 数据报中取出段并交给传输层。本章聚焦 数据平面:路由器收到分组后,如何查表、交换、排队、调度、改写并转发。
目录
- 4.1 本章主线:数据平面在做什么
- 4.2 网络层概述与服务模型
- 4.3 路由器结构:输入端口、交换结构、输出端口
- 4.4 转发表查找与最长前缀匹配
- 4.5 排队、缓存管理与分组调度
- 4.6 IP 协议与 IPv4 数据报
- 4.7 IP 编址、子网与 CIDR
- 4.8 DHCP:动态获取主机配置
- 4.9 IP 分片与重组
- 4.10 NAT:网络地址转换
- 4.11 IPv6 与过渡机制
- 4.12 通用转发、SDN 与 OpenFlow
- 4.13 中间盒与互联网体系结构
- 4.14 本章小结
4.1 本章主线:数据平面在做什么
网络层有两个互相配合的核心任务:
| 功能 | 发生范围 | 主要问题 | 对应平面 |
|---|---|---|---|
| 转发 (forwarding) | 单个路由器内部 | 到达某输入端口的分组应该送到哪个输出端口? | 数据平面 |
| 路由 (routing) | 全网范围 | 从源主机到目的主机应该走哪条端到端路径? | 控制平面 |
数据平面处理的是每一个到达路由器的分组,通常由硬件以纳秒级速度完成;控制平面负责计算转发表或流表,通常运行在软件中,时间尺度更慢。控制平面有两类典型实现:
- 传统每路由器控制平面:每台路由器运行路由算法,路由器之间通过路由协议交换信息,独立生成本地转发表。
- SDN 控制平面:远程控制器集中计算转发表或流表,再下发到各个交换设备。
可以把二者类比为旅行:路由是在地图上规划从起点到终点的路线,转发是在每一个路口根据路牌选择下一条路。
4.2 网络层概述与服务模型
网络层协议存在于每一个互联网设备中,包括主机和路由器。主机既运行网络层的发送和接收逻辑,也运行传输层和应用层;路由器只检查经过它的 IP 数据报头部,不关心应用层语义。
网络服务模型描述网络层对单个数据报或数据报流提供什么承诺。例如:
- 对单个数据报:是否保证交付,是否保证在某个时限内交付。
- 对数据报流:是否按序交付,是否提供最小带宽,是否限制抖动。
互联网 IP 层采用 best effort 服务模型:不保证交付、不保证时延、不保证顺序、不保证带宽。这个选择使 IP 机制简单、可扩展,并能包容不同链路层和物理层技术。
| 体系结构 | 服务模型 | 带宽保证 | 丢失保证 | 顺序保证 | 延迟保证 |
|---|---|---|---|---|---|
| Internet | Best effort | 无 | 无 | 无 | 无 |
| ATM | CBR | 恒定速率 | 有 | 有 | 有 |
| ATM | ABR | 最小可用带宽 | 无 | 有 | 无 |
| Internet | IntServ | 有 | 有 | 有 | 有 |
| Internet | DiffServ | 可能有 | 可能有 | 可能有 | 无 |
尽力而为模型能成功,主要依赖几个事实:带宽足够时实时应用在大多数时间内表现足够好;应用层可以用 CDN、数据中心副本等机制让服务靠近用户;端系统通过拥塞控制在网络拥塞时降低注入速率。
4.3 路由器结构:输入端口、交换结构、输出端口
通用路由器可以分为四个部分:
| 组成 | 作用 |
|---|---|
| 输入端口 | 完成物理层接收、链路层处理、转发表查找和输入排队 |
| 交换结构 (switching fabric) | 把分组从输入端口移动到正确的输出端口 |
| 输出端口 | 完成输出缓存、分组调度、链路层封装和物理层发送 |
| 路由处理器 | 执行路由协议、管理功能和控制平面逻辑 |
现代路由器强调 分布式交换:输入端口在本地内存中查找转发表,尽量在线速下完成处理,然后把分组交给交换结构。这里的目标是:输入端口处理速度不能慢于链路到达速率。
交换结构的三种实现
| 交换方式 | 工作方式 | 主要限制 |
|---|---|---|
| 通过内存交换 | 输入端口把分组拷贝到系统内存,CPU 查表后再拷贝到输出端口 | 受内存带宽限制,数据报通常要经过总线两次 |
| 通过总线交换 | 输入端口通过共享总线把分组送到输出端口 | 多个输入端口竞争总线,受总线带宽限制 |
| 通过互联网络交换 | 使用 crossbar、Clos 或多级交换结构并行转发 | 结构复杂,但吞吐可扩展 |
如果有
4.4 转发表查找与最长前缀匹配
传统转发只依据数据报的 目的 IP 地址 决定输出端口。路由器读取目的地址后,在转发表中寻找匹配表项:
如果没有任何表项匹配,就使用默认表项;如果有多条表项匹配,则使用 最长前缀匹配 (longest prefix match)。前缀越长,说明路由越具体,应优先生效。
例如有如下转发表:
| 目的地址范围 | 输出接口 |
|---|---|
11001000 00010111 00010*** ******** | 0 |
11001000 00010111 00011000 ******** | 1 |
11001000 00010111 00011*** ******** | 2 |
| otherwise | 3 |
两个目的地址的转发结果如下:
| 目的地址 | 匹配情况 | 输出接口 |
|---|---|---|
11001000 00010111 00010110 10100001 | 只匹配第一项 | 0 |
11001000 00010111 00011000 10101010 | 同时匹配第二项和第三项,第二项前缀更长 | 1 |
硬件上常用 TCAM (ternary content addressable memory) 支持高速查找。TCAM 可以在一个时钟周期内对表项做匹配,三态中的第三态表示通配符 *。
4.5 排队、缓存管理与分组调度
只要到达速率超过服务速率,就会发生排队。路由器中的排队主要出现在输入端口和输出端口。
输入端口排队
如果交换结构把分组从输入端口搬到输出端口的速度慢于输入端口的组合到达速率,输入端口就会排队。输入端口排队可能造成 HOL 阻塞 (Head-of-the-Line blocking):队头分组因为目标输出端口忙而无法前进,后面的分组即使目标端口空闲,也被挡在队头分组后面。
输出端口排队
输出端口排队更常见,因为多个输入端口可能同时把分组送往同一个输出端口,而输出链路一次只能发送一个分组。输出队列会带来排队时延,极端情况下输出缓存耗尽导致丢包。
缓存大小与 bufferbloat
缓存可以吸收突发流量、减少丢包,但缓存过大也会增加时延。课件给出的经验规则是:
其中
过大的缓存容易造成 bufferbloat:队列长期很深,交互应用时延变大,TCP 的拥塞响应也变慢。
缓存管理与调度
缓存管理要回答:缓存满时丢哪个分组?是否按优先级丢弃?是否用 ECN 或 RED 标记拥塞?
分组调度要回答:队列中下一个发送哪个分组?
| 调度策略 | 核心思想 | 特点 |
|---|---|---|
| FCFS / FIFO | 按到达顺序发送 | 简单,但不能区分业务类型 |
| 优先权调度 | 总是先服务最高优先级的非空队列 | 可保障高优先级流量,但低优先级可能饥饿 |
| Round Robin | 在多个类别队列间轮流服务 | 比优先级调度更公平 |
| WFQ | 按权重给不同类别分配服务量 | 可提供最低带宽保障 |
网络中立性的技术基础之一,就是 ISP 如何调度、丢弃、限速或区分不同类别的流量。
4.6 IP 协议与 IPv4 数据报
互联网网络层的核心是 IP 协议。IP 规定了数据报格式、地址格式和分组处理规则;ICMP 用于错误报告和路由器信令;路由协议或 SDN 控制器负责产生转发表。
IPv4 头部最少 20 字节。如果承载 TCP,常见最小开销是 20 字节 IP 头部加 20 字节 TCP 头部,还不包括应用层头部。
| 字段 | 作用 |
|---|---|
| version | IP 协议版本号 |
| header length | 头部长度 |
| type of service | DiffServ、ECN 等服务标记 |
| total length | 整个 IP 数据报长度,最大约 64KB |
| identifier / flags / fragment offset | 分片与重组相关字段 |
| TTL | 剩余最大跳数,每经过一个路由器减一,防止无限循环 |
| upper layer | 指明上层协议,如 TCP、UDP |
| header checksum | IPv4 头部校验和 |
| source / destination address | 源 IP 地址和目的 IP 地址 |
| options | 可选字段,如时间戳、记录路由,实际较少使用 |
| payload | 通常是 TCP 或 UDP 段 |
路由器转发时通常只看 IP 头部的相关字段,不解释传输层载荷或应用层内容。
4.7 IP 编址、子网与 CIDR
IP 地址标识的是 接口,不是整台主机。路由器通常有多个接口;主机也可能有一个有线以太网接口和一个无线接口。IPv4 地址长 32 bit,通常写作点分十进制,例如:
text
223.1.1.1 = 11011111 00000001 00000001 00000001子网
子网是不需要经过路由器即可相互到达的一组接口。一个子网内的接口共享相同的高位前缀,低位部分作为主机号。
识别子网的一种直观方法是:把所有主机和路由器接口从设备上“拆开”,看哪些接口在不经过路由器的情况下属于同一个网络孤岛。每个孤岛就是一个子网。
IPv4 分类、特殊地址与私有地址
早期 IPv4 曾采用分类地址:
| 类别 | 规模 |
|---|---|
| Class A | 约 126 个网络,每个网络约 1600 万主机 |
| Class B | 约 16382 个网络,每个网络约 6.4 万主机 |
| Class C | 约 200 万个网络,每个网络 254 主机 |
| Class D | 多播 |
| Class E | 预留 |
一些常见约定:
- 主机部分全 0:通常表示该子网本身。
- 主机部分全 1:表示该子网的广播地址。
- 子网部分全 0 等特殊形式在具体上下文中有特定含义。
私有 IPv4 地址只在局部网络内部有意义,不会作为公网地址分配:
| 范围 | 前缀 |
|---|---|
10.0.0.0 - 10.255.255.255 | 10.0.0.0/8 |
172.16.0.0 - 172.31.255.255 | 172.16.0.0/12 |
192.168.0.0 - 192.168.255.255 | 192.168.0.0/16 |
CIDR 与子网掩码
CIDR (Classless InterDomain Routing) 取消固定 A/B/C 类边界,允许任意长度的网络前缀。地址写成:
text
a.b.c.d/x其中 x 表示前 x bit 是网络部分。例如 200.23.16.0/23 表示前 23 bit 是子网前缀。子网掩码中,1 表示网络部分,0 表示主机部分。
层次编址与路由聚集
层次编址让路由信息可以聚集。假设某 ISP 拥有 200.23.16.0/20,它可以把地址块切成 8 个 /23 分配给不同组织:
| 组织 | 地址块 |
|---|---|
| Organization 0 | 200.23.16.0/23 |
| Organization 1 | 200.23.18.0/23 |
| Organization 2 | 200.23.20.0/23 |
| ... | ... |
| Organization 7 | 200.23.30.0/23 |
对外部互联网来说,该 ISP 可以只通告一条聚合路由 200.23.16.0/20。如果其中某个组织迁移到另一个 ISP,新 ISP 可以通告更具体的 /23 路由。由于最长前缀匹配,更具体的路由会优先生效。
4.8 DHCP:动态获取主机配置
主机获得 IP 地址有两种方式:静态配置,或通过 DHCP (Dynamic Host Configuration Protocol) 动态获取。DHCP 的目标是让主机加入网络时能“即插即用”地获得地址和相关配置。
DHCP 基本过程常记为 DORA:
| 步骤 | 报文 | 作用 |
|---|---|---|
| 1 | DHCP Discover | 客户端广播寻找 DHCP 服务器 |
| 2 | DHCP Offer | 服务器提供一个可用地址 |
| 3 | DHCP Request | 客户端请求使用该地址 |
| 4 | DHCP ACK | 服务器确认租约 |
新主机还没有 IP 地址时,Discover 报文常使用:
- 源 IP:
0.0.0.0 - 目的 IP:
255.255.255.255 - 客户端 UDP 端口:
68 - 服务器 UDP 端口:
67 - 以太网目的 MAC:
FF:FF:FF:FF:FF:FF
DHCP 不只分配主机 IP,还可以返回默认网关、DNS 服务器、子网掩码和租期。报文封装关系为:
text
DHCP message -> UDP segment -> IP datagram -> link-layer frame如果客户端记住之前被分配的地址并希望继续使用,Discover 和 Offer 两步在某些情况下可以被跳过,直接请求续租。
4.9 IP 分片与重组
链路层有 MTU (maximum transmission unit),表示一个链路层帧能够携带的最大载荷。不同链路的 MTU 可能不同。若 IPv4 数据报大于下一跳链路的 MTU,路由器可以把它切分成多个分片;每个分片都是独立的 IP 数据报,最终在目的主机重组。
分片依赖 IPv4 头部中的三个字段:
| 字段 | 作用 |
|---|---|
| identifier | 标识哪些分片来自同一个原始数据报 |
| flags | 例如 more fragments 标志,表示后面是否还有分片 |
| fragment offset | 标识该分片载荷在原始数据报中的偏移,单位是 8 字节 |
例子:一个总长度为 4000 字节的 IPv4 数据报经过 MTU 为 1500 字节的链路,假设 IP 头部为 20 字节。
| 分片 | total length | ID | MF flag | offset |
|---|---|---|---|---|
| 原始数据报 | 4000 | x | 0 | 0 |
| 分片 1 | 1500 | x | 1 | 0 |
| 分片 2 | 1500 | x | 1 | 185 |
| 分片 3 | 1040 | x | 0 | 370 |
原因是每个满载分片最多携带 1500 - 20 = 1480 字节数据,偏移量以 8 字节为单位,所以第二个分片的 offset 是 1480 / 8 = 185,第三个分片的 offset 是 2960 / 8 = 370。
4.10 NAT:网络地址转换
NAT (Network Address Translation) 让一个本地网络从外部看起来共享同一个公网 IPv4 地址。例如家庭网络内部使用 10.0.0.0/24,对外只暴露路由器的公网地址。
NAT 路由器透明地维护一张转换表:
| 方向 | NAT 做什么 |
|---|---|
| 外出数据报 | 把 (内网 IP, 内网端口) 改写为 (公网 IP, 新端口),并记录映射 |
| 进入数据报 | 根据转换表把 (公网 IP, 新端口) 改回 (内网 IP, 内网端口) |
例子:
text
内网主机发送:S = 10.0.0.1:3345, D = 128.119.40.186:80
NAT 改写后: S = 138.76.29.7:5001, D = 128.119.40.186:80
响应返回: S = 128.119.40.186:80, D = 138.76.29.7:5001
NAT 还原后: S = 128.119.40.186:80, D = 10.0.0.1:3345NAT 的好处:
- 一个本地网络只需要向 ISP 申请一个公网 IPv4 地址。
- 内部地址变化不需要通知外部网络。
- 更换 ISP 时,内部地址可以保持不变。
- 内部设备默认不能被外部直接寻址,带来一定隐藏性。
NAT 的争议:
- 路由器本应主要处理三层信息,但 NAT 需要读取和改写传输层端口。
- 地址短缺问题从根本上应由 IPv6 解决。
- NAT 破坏端到端原则,使内网服务器被外部主动连接变得困难,带来 NAT 穿越问题。
4.11 IPv6 与过渡机制
IPv6 的初始动机是解决 32 bit IPv4 地址空间不足问题。IPv6 地址长度为 128 bit,同时重新设计了头部格式,以便路由器更快处理。
IPv6 基本头部字段包括:
| 字段 | 作用 |
|---|---|
| version | 协议版本 |
| priority / traffic class | 标识流量优先级 |
| flow label | 标识属于同一“流”的数据报 |
| payload length | 载荷长度 |
| next header | 指明下一个头部或上层协议 |
| hop limit | 类似 IPv4 TTL |
| source address | 128 bit 源地址 |
| destination address | 128 bit 目的地址 |
相较 IPv4,IPv6 做了几项删减:
- 没有头部校验和:避免路由器逐跳重新计算。
- 没有路由器分片与重组:分片职责移到端系统。
- 没有 IPv4 那样的选项字段:扩展功能通过扩展头部处理。
IPv4 到 IPv6 不能一次性完成全网切换。常见过渡机制是 隧道:把 IPv6 数据报封装为 IPv4 数据报的载荷,在 IPv4 网络中传输;到达隧道出口后再取出原始 IPv6 数据报。
text
IPv6 datagram -> encapsulated inside IPv4 datagram -> IPv4 network -> IPv6 datagram部署 IPv6 是一个长期渐进过程,因为互联网中的路由器、主机、运营商网络、企业网络和应用基础设施无法在同一天同时升级。
4.12 通用转发、SDN 与 OpenFlow
传统基于目的地址的转发可以看作特殊的 匹配 + 行动:
text
匹配目的 IP 前缀 -> 从某个端口转发通用转发把这个思想推广到多个协议层的多个字段:
text
匹配分组头部字段模式 -> 执行动作可匹配字段可以来自链路层、网络层和传输层:
| 层次 | 字段例子 |
|---|---|
| 链路层 | 入端口、源 MAC、目的 MAC、EtherType、VLAN ID、VLAN priority |
| 网络层 | 源 IP、目的 IP、IP protocol、ToS |
| 传输层 | TCP/UDP 源端口、TCP/UDP 目的端口 |
动作可以包括:
- 转发到一个或多个端口。
- 丢弃分组。
- 修改头部字段。
- 封装后发送给控制器。
OpenFlow 流表
OpenFlow 流表项通常包含四类信息:
| 部分 | 作用 |
|---|---|
| Match | 匹配分组头部字段模式 |
| Action | 对匹配分组执行的动作 |
| Priority | 多条规则同时匹配时,选择优先级最高者 |
| Stats | 记录匹配的包数和字节数 |
这个抽象可以统一表达多种设备行为:
| 设备 | 匹配 | 行动 |
|---|---|---|
| 路由器 | 目的 IP 最长前缀 | 转发到对应端口 |
| 防火墙 | IP 地址、TCP/UDP 端口 | 允许或拒绝 |
| 交换机 | 目的 MAC 地址 | 转发或泛洪 |
| NAT | IP 地址和端口 | 改写地址和端口 |
例如:
- 目的 IP 为
51.6.0.8的数据报转发到端口 6。 - 目的 TCP 端口为
22的分组丢弃,用于阻止 SSH。 - 源 IP 为
128.119.1.1的分组丢弃。 - 目的 MAC 为
22:A7:23:11:E1:02的帧转发到端口 3。
SDN 的意义在于:控制器可以从网络范围视角编排这些流表项,使多个交换设备表现出统一的全局策略。更进一步的可编程数据平面还包括 P4 等技术。
4.13 中间盒与互联网体系结构
中间盒 (middlebox) 指路径上执行标准 IP 路由之外功能的设备。常见中间盒包括:
| 类型 | 常见位置 |
|---|---|
| NAT | 家庭网络、机构网络、蜂窝网络 |
| 防火墙、IDS | 企业、机构、服务提供商网络 |
| 负载均衡器 | 数据中心、服务提供商、移动网络 |
| 缓存 | ISP、移动网络、CDN |
| 应用专用设备 | 服务提供商、企业、CDN |
中间盒的实现经历了演化:早期多为专有封闭硬件,后来逐渐转向白盒硬件、开放 API、SDN 集中控制和 NFV (network functions virtualization)。
IP 沙漏模型
互联网常被描述为沙漏结构:
text
应用层:HTTP, SMTP, RTP, QUIC, DASH, ...
传输层:TCP, UDP
网络层:IP
链路/物理层:Ethernet, PPP, WiFi, Bluetooth, copper, radio, fiber, ...中间最窄处是 IP。上层可以有很多应用协议,下层可以有很多链路和物理技术,但中间用一个统一、简单的 IP 层连接异构网络。
端到端原则
端到端原则认为,可靠传输、拥塞控制等功能只有结合通信端点和应用知识,才能完整、正确地实现。网络内部可以提供辅助优化,但不应替代端系统掌握完整语义。
中间盒让网络内部承担更多智能,这与端到端原则形成张力。互联网的发展可以粗略理解为:
| 阶段 | 智能主要在哪里 |
|---|---|
| 20 世纪电话网络 | 网络交换机 |
| 早期互联网 | 网络边缘主机 |
| 现代互联网 | 边缘基础设施很多,同时网络内部也有可编程设备和中间盒 |
4.14 本章小结
本章的核心问题是:一个分组进入路由器后,数据平面如何处理它?
需要掌握的主线:
- 网络层提供主机到主机的通信,互联网 IP 层采用尽力而为服务。
- 数据平面负责本地转发,控制平面负责全局路径和表项计算。
- 路由器由输入端口、交换结构、输出端口和路由处理器组成。
- 基于目的地址的转发使用最长前缀匹配。
- 排队、缓存、丢弃和调度共同决定转发时延、丢包和服务区分。
- IPv4 机制包括数据报格式、编址、CIDR、DHCP、分片和 NAT。
- IPv6 扩大地址空间,并简化路由器处理路径。
- 通用转发用“匹配 + 行动”统一描述路由器、防火墙、交换机和 NAT。
- 中间盒增强了网络内部能力,也让互联网体系结构与端到端原则之间出现张力。
下一章的问题是:这些转发表和流表到底如何由控制平面计算出来?