4 网络层:数据平面
1 导论
1.1 网络层服务
- 在发送主机和接收主机对之间传送段(segment)
- 在发送端将段封装到数据报中
- 在接收端,将段上交给传输层实体
- 网络层协议存在于每一个主机和路由器
- 路由器检查每一个经过它的 IP 数据报的头部
1.2 网络层功能
- 转发: 数据平面
- 将分组从路由器的输入端口转发到合适的输出端口
- (局部的)
- Error handling, queuing and scheduling
- Host to Switch
- Switch to Host
- Switch to Switch
- 路由: 控制平面
- 使用路由算法来决定分组从发送主机到目标接收主机的路径
- 路由选择算法
- 路由选择协议
- (全局的)
1.3 数据平面、控制平面
数据平面
- 本地,每个路由器功能
- 决定从路由器输入端口到达的分组如何转发到输出端口
- 转发功能:
- 传统方式:基于目标地址 + 转发表
- SDN方式:基于多个字段 + 流表
控制平面
- 网络范围内的逻辑
- 决定数据报如何在路由器之间路由,决定数据报从源到目标主机之间的端到端路径
- 2 个控制平面方法:
- 传统的路由算法: 在路由器中被实现
- SDN: 在远程的服务器中实现
传统方式
- 分布式的
- 控制平面与数据平面紧耦合
- 每个路由器中各自的路由算法组件在控制平面中相互作用

SDN方式
- 一个不同的(通常是远程的)控制器与本地控制代理(CAs)交互
- 远程控制器计算并下发转发表到路由器

- 分组交换机根据流表对分组做匹配,再做相应的动作,即将不同的逻辑行为编程到网络设备中
主要包括两种具体的设备:
- 路由器:工作在网络层(第三层),根据 IP 地址转发分组
- 链路层交换机:工作在数据链路层(第二层),根据 MAC 地址转发分组(通常被称为帧)
分组交换机的两大核心机制:
- 存储转发机制
- 分组交换机不会在收到数据包的开头就立刻转发
- 它必须完整地接收整个分组,将其存储在内部缓存中,进行错误校验后,再转发到下一条链路上
- 这里涉及到传输延迟,如果一个分组的长度为 \(L\) 比特,链路的传输速率(带宽)为 \(R\) 比特/秒(bps),那么交换机将这个分组推送到链路上所需的时间就是:\[d_{trans} = \frac{L}{R}\]
- 注意: 这只是把数据“推”到网线上的时间,还没算上信号在光缆里传播的时间
- 统计多路复用
- 网络中的资源(带宽)不是预先分配好的,而是按需共享的
- 多个用户的数据包会在交换机的输出端口排队。就像多条车道的车汇聚到一个高速收费站,谁先到,谁就先占用链路资源
- 这种按需分配的机制极大地提高了链路的利用率
1.4 网络服务模型
对于单个数据报的服务:
- 可靠传输
- 延迟保证
对于数据报流的服务:
- 有序交付:保序数据报传送
- 带宽保障:保证流的最小带宽
- 抖动控制:限制数据包间隔时间的变化
对这些指标(如带宽、丢失、保序、延迟、拥塞反馈)取特定值的时候,就称为提供了某种特定的服务模型
IP 的服务模型为 “尽力而为”(best effort)
- 不保证送达(丢包)
- 不保证顺序(乱序)
- 不保证唯一(重复)
- 不保证延迟和带宽
尽力而为服务模型凭借其机制的简洁性、带宽的充足供给、应用层分布式架构的辅助以及弹性服务的拥塞控制,取得了无可争议的巨大成功。
-
机制简洁,易于普及 其底层机制的简单性,是互联网得以在全球范围内被广泛部署和采用的关键基础。
-
带宽充足,体验达标 通过提供充足的带宽供给,使得实时应用(如交互式语音、视频)在“大多数时间”内都能获得“足够好”的性能体验,无需复杂的网络层QoS保障。
-
架构辅助,就近服务 应用层的分布式服务(如数据中心、内容分发网络 CDN)通过多节点复制并尽可能靠近客户端网络,从应用层面弥补了网络层尽力而为的不足,提升了服务可达性与速度。
-
弹性控制,维持稳定 “弹性”服务(如TCP)自带的拥塞控制机制,能够在网络拥堵时主动退让,帮助维持整体网络的可用性与公平性。
2 路由器组成
- 路由器容量 = \(N \times R\)
- \(N\) = 路由器外部"端口"的数量
- \(R\) = 端口的速度(“线速”)
高层面(非常简化的)通用路由器体系架构
- 路由:运行路由选择算法 / 协议 (RIP, OSPF, BGP)
- 生成路由表
- 转发:从输入到输出链路交换数据报
- 根据路由表进行分组

- 实际上不区分输入端口和输出端口,端口是双向的
2.1 输入端口

为什么输入端口需要缓存(队列)?
- 当交换结构的速率小于输入端口的汇聚速率时,在输入端口可能要排队
- 排队延迟以及由于输入缓存溢出造成丢失
- Head-of-the-Line (HOL) blocking: 排在队头的数据报阻止了队列中其他数据报向前移动

- 输出端口竞争
- 只能有一个红色分组被传递,交换到一个输出端口,下面红色的分组被阻塞
- 一个分组时间
- 绿色分组经历了头端阻塞
1. 输入端口的主要挑战:处理速度 ⚡
- 极端的时间限制:假设链路速率为 40 Gbps,数据包平均大小为 100字节(B)。
- 计算结果:每 20纳秒(ns) 就会到达一个新的数据包。
- 含义:这意味着输入端口必须在 20ns 内完成对一个数据包的处理(包括读取头部、查找路由、转发到交换结构),否则就会造成数据包丢失或延迟。
- 解决方案:由于通用CPU无法达到这种纳秒级的处理速度,输入端口通常采用专门的硬件芯片来实现,即 ASIC(专用集成电路) 或 网络处理器。
2. 核心任务:查找输出端口 🔍
输入端口的主要工作流程包含两部分:
- 更新数据包头部:这一步相对简单,主要是修改 TTL(生存时间)和校验和。
- 查找输出端口:这是最困难的一步。根据数据包的目的 IP 地址,查询转发表,决定这个包应该从路由器的哪个物理端口发出去。
3. 最长前缀匹配:核心算法 🔑
为了理解为什么要用“树结构”,我们需要先理解“最长前缀匹配”规则。
- 问题背景:如果使用最简单的 “一一对应” 查找(即每个 IP 地址对应一个端口),IPv4 有 40 亿(\(2^{32}\))个地址,查找表会大得无法处理。
- 解决方案:使用地址聚合。路由器将连续的 IP 地址范围映射到同一个端口。
- 最长前缀匹配(LPM)规则:
- 当查找一个目的地址时,可能会匹配到多个前缀(例如既匹配“192.168”也匹配“192.168.1”)。
- 原则:选择最长(最具体)的那个前缀作为转发依据。
4. 树形结构:高效的实现方式 🌳
为了在海量数据中快速实现 LPM,文档介绍了使用树形数据结构来存储转发表。
- 传统方法的缺陷:如果逐条比对转发表中的每一项,时间复杂度是 \(O(n)\),即平均需要检查一半的表项。在互联网骨干路由器上,这可能意味着数百万次检查,速度太慢。
- 树形结构的优势:
- 将 IP 地址视为二进制字符串(0 和 1)。
- 构建方式:从左到右(最高位到最低位)构建树。向左分支代表 0,向右分支代表 1。
- 查找过程:从树根开始,根据 IP 地址的每一位是 0 还是 1,逐层向下遍历。
- 记录匹配:在遍历过程中,每经过一个标记了端口的节点,就记录下来。由于我们要找“最长前缀”,所以最后记录的那个端口就是最精确的匹配结果。
树形查找示例:
- 查找路径:
1 -> 1 -> 0 -> 0 -> 1 -> ... - 在遍历过程中,如果在第3层有一个匹配(如
11*),记录端口;如果在第5层还有一个更长的匹配(如11001*),则覆盖之前的记录。 - 最终到达叶子节点或无法继续时,使用的端口就是最后记录的那个。

总结
这部分内容描述了路由器输入端口的“大脑”工作原理:
- 压力:必须在 20ns 级别的极短时间内完成处理。
- 决策:通过 最长前缀匹配(LPM) 算法决定数据包的去向。
- 优化:为了达到速度要求,不使用普通的列表查找,而是将路由表构建成树形结构,利用硬件(ASIC)进行高速的二进制位遍历查找。
2.2 交换结构
- 将分组从输入缓冲区传输到合适的输出端口
- 交换速率:分组可以按照该速率从输入传输到输出
- 运行速度经常是输入/输出链路速率的若干倍
- N 个输入端口:交换机构的交换速度是输入线路速度的 N 倍比较理想,才不会成为瓶颈
- 3 种典型的交换机构

通过内存交换
第一代路由器(软件的方式):
- 分组被拷贝到系统内存,CPU 从分组的头部提取出目标地址,查找转发表,找到对应的输出端口,拷贝到输出端口
- 转发速率被内存的带宽限制 (数据报通过系统总线两遍,两次拷贝)
- 一次只能转发一个分组
通过总线交换
- 数据报通过共享总线,从输入端口转发到输出端口
- 总线竞争: 交换速度受限于总线带宽
- 一次处理一个分组
通过互联网络(crossbar等)
- 同时并发转发多个分组,克服总线带宽限制
- Banyan(榕树)网络,crossbar(纵横)和其它的互联网络被开发,将多个处理器连接成多处理器
- 当分组从端口 A 到达,转给端口 Y;控制器短接相应的两个总线
- 高级设计:将数据报分片为固定长度的信元,通过交换网络交换
2.3 输出端口

- 分组分类:将分组映射到流
- 缓存管理:决定何时丢弃哪个分组
- 调度器:决定何时发送哪个分组
- 在排队的分组中选择要发送的分组
- 当缓存饱和时选择要丢弃的分组
分组分类
- 基于分组头部中的多个字段对 IP 分组进行分类,例如:
- 源/目的 IP 地址 (32 bits)
- 源/目的 TCP 端口号 (16 bits)
- 服务类型 TOS 字节 (8 bits)
- 协议类型 (8 bits)
- 通常字段以范围的形式指定
- 分类需要多维范围查找!

2.3.1 缓存管理
- 当数据报从交换结构的到达速度比传输速率快就需要输出端口缓存
- 数据报(分组)可能会被丢弃,由于拥塞,缓冲区没有空间
- 由调度规则选择排队的数据报进行传输

- 假设交换速率 \(R_{switch}\) 是 \(R_{line}\) 的 N 倍(N:输入端口的数量)
- 当多个输入端口同时向输出端口发送时,缓冲该分组(当通过交换网络到达的速率超过输出速率则缓存)
- Head-of-the-Line (HOL) blocking: 排在队头的数据报阻止了队列中其他数据报向前移动
- 排队带来延迟,由于输出端口缓存溢出则丢弃数据报
How much buffering?
-
传统经验法则 (RFC 3439):
- “典型的往返时间 (\(\text{RTT}\)) \(\times\) 链路容量 (\(C\))”
-
现代推荐准则 (针对多数据流):
- \(N\) 个数据流,\(\frac{\text{RTT} \cdot C}{\sqrt{N}}\)
-
缓存过大的危害 (Bufferbloat / 缓存膨胀):
- 如果路由器的缓存极大(常见于很多家用路由器),当网络拥塞时,数据包不会被丢弃,而是全部排在长长的队列里。
- 这会导致极高的排队延迟(长的 RTT),让实时应用(如在线游戏、视频通话)体验极差。
- 同时,由于 TCP 是基于丢包来感知拥塞并减速的。如果路由器死扛着不丢包,TCP 发送端就会误以为网络还很畅通,继续猛发数据,导致网络响应变得极其迟钝。理想的拥塞控制是让链路“刚好够忙,但不要太满”。
Buffer Management
1. Drop (丢包策略):当缓存满了,新来的数据包怎么办?
- Tail drop (尾部丢弃): 最简单、最常见的策略。缓存满了,新到的数据包直接扔掉。这种方式实现简单,但可能会导致多个 TCP 连接同时发生丢包,引发全局同步(所有连接同时减速,导致链路利用率骤降)。
- Priority (优先级丢弃): 根据数据包的重要程度来决定去留。例如,在缓存快满时,优先丢弃后台下载的流量,而保留对延迟敏感的 VoIP 语音或视频会议数据包。
2. Marking (标记策略:主动拥塞管理):
- 与其等缓存全满被迫丢包,不如在缓存快要满但还没满的时候,就提前采取行动。
- 路由器可以对途经的数据包进行标记 (Marking),比如修改 IP 头的特定字段(如 ECN, Explicit Congestion Notification 显式拥塞通知),以此来温和地告诉接收端和发送端:“网络开始拥挤了,请主动减速”。
- 除了标记,还有 RED (Random Early Detection, 随机早期检测) 等机制,即在队列达到一定长度后,按照概率随机丢弃一些包,提前触发个别 TCP 连接的拥塞控制,防止队列被彻底打满。
2.3.2 调度机制
调度: 选择下一个要通过链路传输的分组
- FIFO (first in first out) scheduling: 按照分组到来的次序发送
- 丢弃策略: 如果分组到达一个满的队列,哪个分组将会被抛弃?
- tail drop: 丢弃刚到达的分组
- priority: 根据优先权丢失/移除分组
- random: 随机地丢弃/移除
优先权调度:发送最高优先权的分组
- 多类,不同类别有不同的优先权
- 类别可能依赖于标记或者其他的头部字段,e.g. IP source/dest, port numbers, ds,etc.
- 先传高优先级的队列中的分组,除非没有
- 高(低)优先权中的分组传输次序:FIFO

Round Robin (RR) scheduling:
- 多类
- 循环扫描不同类型的队列,发送完一类的一个分组,再发送下一个类的一个分组,循环所有类

Weighted Fair Queuing (WFQ):
- 一般化的 Round Robin
- 在一段时间内,每个队列得到的服务时间是:\(W_i / (\sum(W_i)) \times t\),和权重成正比
- 每个类在每一个循环中获得不同权重的服务量

3 IP: Internet Protocol
3.1 IP 数据报格式

- type of service: 指定数据报的优先级和服务质量要求,实则已弃用

- 版本号 (4 bits)
- 当前为 4
- IPv6 —— 见后续章节
- 互联网头部长度 IHL (4 bits)
- 以 32 位字(4 字节)为单位
- 最小固定头部 (20 字节) + 选项
- 服务类型 (8 bits)
- 优先级:3 bits,定义了 8 个级别
- 可靠性:1 bit,正常或高
- 延迟:1 bit,正常或低
- 吞吐量:1 bit,正常或高
- 总长度 (16 bits)
- 数据报的总长度,以字节为单位
- 标识 (16 bits)
- 序列号
- 与地址和用户协议一起用于唯一标识数据报
- 标志 (3 bits)
- 更多分片标志 MF、禁止分片标志 DF
- 分片偏移量 (13 bits)
- 生存时间 TTL (8 bits)
- 协议 (8 bits)
- 指示目的端接收数据字段的上一层协议
- 头部校验和 (16 bits)
- 对头部所有 16 位字求反码和
- 若校验不正确,路由器丢弃该分组
- 每经过一个路由器都要重新验证和重新计算,计算时校验和字段置为 0 (原因:TTL 和分片相关字段在每个路由器处都可能变化,因此校验和必须在每个路由器处重新计算。)
- 源地址 (32 bits)
- 目的地址 (32 bits)
- 选项 (可变长度,最多 40 字节)
- 数据字段
- 承载来自上一层的用户数据
- 长度为 8 位的整数倍(即字节的整数倍)
- 数据报(头部 + 数据)最大长度为 65,535 字节
3.2 IP 分片和重组
- 网络链路有 MTU (最大传输单元):链路层帧所携带的最大数据长度
- 不同的链路类型
- 不同的 MTU
- 大的 IP 数据报在网络上被分片
- 一个数据报被分割成若干个小的数据报
- 相同的 ID
- 不同的偏移量
- 最后一个分片标记为 0
- “重组” 只在最终的目标主机进行
- IP 头部的信息被用于标识,排序相关分片
- 一个数据报被分割成若干个小的数据报

例子
- 4000 字节数据报
- 20 字节头部
- 3980 字节数据
- MTU = 1500 bytes
- 第一片:20 字节头部 + 1480 字节数据
- 偏移量:0
- 第二片:20 字节头部 + 1480 字节数据(应用数据)
- 偏移量:1480/8 = 185
- 第三片:20 字节头部 + 1020 字节数据(应用数据)
- 偏移量:2960/8 = 370
+--+-------------+------+------------+------------+-- --+
| | length=4000 | ID=x | fragflag=0 | offset=0 | |
+--+-------------+------+------------+------------+-- --+
⬇️
+--+-------------+------+------------+------------+-- --+
| | length=1500 | ID=x | fragflag=1 | offset=0 | |
+--+-------------+------+------------+------------+-- --+
+--+-------------+------+------------+------------+-- --+
| | length=1500 | ID=x | fragflag=1 | offset=185 | |
+--+-------------+------+------------+------------+-- --+
+--+-------------+------+------------+------------+-- --+
| | length=1040 | ID=x | fragflag=0 | offset=370 | |
+--+-------------+------+------------+------------+-- --+
3.3 IPv4 地址
IP 编址
- IP 地址: 32 位标示,对主机或者路由器的接口编址
- 接口: 主机/路由器和物理链路的连接处
- 路由器通常拥有多个接口
- 主机也有可能有多个接口
- IP 地址和每一个接口关联
- 一个 IP 地址和一个接口相关联
223.1.1.1 = 11011111 00000001 00000001 00000001
IP 地址是用于网络路由的唯一标识,采用点分十进制表示,并由国际区域机构统一分配网络 ID,组织内部自行分配主机 ID。
- 核心功能与分配原则:主机或路由器的每一个物理网络接口都必须拥有一个独立的IP地址,这是为了实现高效的路由转发。
- 表示格式:统一使用点分十进制表示法
- 网络 ID 管理:具有全局唯一性,由三大区域互联网注册机构负责分配和管理
- 主机 ID 分配:在获得指定的网络 ID 后,由所属组织在内部自行分配和管理。
子网(Subnets)
- IP 地址:
- 子网部分 (高位bits)
- 主机部分 (低位bits)
- 什么是子网?
- 一个子网内的节点(主机或者路由器)它们的 IP 地址的高位部分相同,这些节点构成的网络的一部分叫做子网
- 无需路由器介入,子网内各主机可以在物理上相互直接到达

IP 地址分类

- A 类地址:
- 首位为 0
- 支持 \(2^7-2=126\) 个网段(全 0 设备启动时的无地址状态 和 127 本地回环)
- 每个网段支持主机数为 \(2^{24}-2 = 16777214\)(全 0 和全 1 的地址要扣除,全 0 是网络号,全 1 是广播号)
- B、C 类的网段数不需要 \(-2\),主机数数仍需要 \(-2\)
- 一些约定:
- 子网部分: 全为 0 —— 本网络
- 主机部分: 全为 0 —— 本主机
- 主机部分: 全为 1 —— 广播地址,这个网络的所有主机
- 特殊 IP 地址

- 回路地址:TCP/UDP 发下来的分组到 IP 会反转回去
内网(专用)IP 地址:
- 专用地址:地址空间的一部份供专用地址使用
- 永远不会被当做公用地址来分配,不会与公用地址重复
- 只在局部网络中有意义,区分不同的设备
- 路由器不对目标地址是专用地址的分组进行转发
- 专用地址范围
- Class A 10.0.0.0-10.255.255.255 MASK 255.0.0.0
- Class B 172.16.0.0-172.31.255.255 MASK 255.255.0.0
- Class C 192.168.0.0-192.168.255.255 MASK 255.255.255.0
子网与子网掩码通过重新划分IP地址结构,在解决网络地址不足的同时,对外隐藏内部细节以简化互联网路由。
- 核心目的:主要为了应对网络地址资源不足的问题
- 地址重构:将原本属于“主机部分”的地址位进一步划分,拆分为子网号和主机号
- 掩码作用:子网掩码用于明确界定地址中哪些位代表子网号,哪些位代表主机号
- 灵活分配:每个局域网(LAN)可被分配独立的子网号,从而获得更高的管理灵活性
- 内部路由:本地路由器负责在已划分子网的网络内部进行数据转发。
- 外部透明:对于互联网的其他部分而言,整个子网化的网络在逻辑上仍表现为单一网络。
- 全局减负:有效隔离了内部网络的增长,避免了互联网整体网络号激增及路由复杂度的上升
CIDR
CIDR: Classless InterDomain Routing(无类域间路由)
- 子网部分可以在任意的位置
- 地址格式: a.b.c.d/x,其中 x 是 子网号的长度

- 子网掩码:11111111 11111111 11111110 00000000
子网掩码(subnet mask)
- 32bits,0 or 1 in each bit
- 1: bit 位置表示子网部分
- 0: bit 位置表示主机部分
- 原始的 A、B、C 类网络的子网掩码分别是
- A:255.0.0.0:11111111 00000000 0000000 00000000
- B:255.255.0.0:11111111 11111111 0000000 00000000
- C:255.255.255.0:11111111 11111111 11111111 00000000
- CIDR 下的子网掩码例子:
- 11111111 11111111 11111100 00000000
- 另外的一种表示子网掩码的表达方式
- /#
- 例:/22:表示前面22个bit为子网部分
转发表和转发算法
| Destination Subnet Num | Mask | Next hop | Interface |
|---|---|---|---|
| 202.38.73.0 | 255.255.255.192 | IPx | Lan1 |
| 202.38.64.0 | 255.255.255.192 | IPy | Lan2 |
| … | … | … | … |
| Default | - | IPz | Lan0 |
- 获得 IP 数据报的目标地址
- 对于转发表中的每一个表项
- 若 (IP Des addr) & (mask) == destination,则按照表项对应的接口转发该数据报
- 如果都没有找到,则使用默认表项转发数据报
如何获得一个 IP 地址
两种方法:
- 系统管理员将地址配置在一个文件中
- DHCP:动态主机配置协议,从服务器中动态获得一个 IP 地址
- 即插即用
DHCP
目标: 允许主机在加入网络的时候,动态地从服务器那里获得 IP 地址:
- 可以更新对主机在用 IP 地址的租用期 —— 租期快到了
- 重新启动时,允许重新使用以前用过的 IP 地址
- 支持移动用户加入到该网络(短期在网)
DHCP 工作概况:
- 主机广播
DHCP discover报文 [可选] - DHCP 服务器用
DHCP offer提供报文响应 [可选] - 主机请求 IP 地址:发送
DHCP request报文 - DHCP 服务器发送地址:
DHCP ack报文


DHCP 返回:
- IP 地址
- 第一跳路由器的 IP 地址(默认网关)
- DNS 服务器的域名和 IP 地址
- 子网掩码 (指示地址部分的网络号和主机号)
DHCP 实例:
- 联网笔记本需要获取自己的 IP 地址,第一跳路由器地址和 DNS 服务器:采用 DHCP 协议
- DHCP 请求被封装在 UDP 段中,封装在 IP 数据报中,封装在以太网的帧中
- 以太网帧在局域网范围内广播 (dest: FFFFFFFFFFFF) ,被运行 DHCP 服务的路由器收到
- 以太网帧解封装成 IP,IP 解封装成 UDP,解封装成 DHCP
- DHCP 服务器生成 DHCP ACK,包含客户端的 IP 地址,第一跳路由器的 IP 地址和 DNS 域名服务器的 IP 地址
- DHCP 服务器封装的报文所在的帧转发到客户端,在客户端解封装成 DHCP 报文
- 客户端知道它自己的 IP 地址,DNS 服务器的名字和 IP 地址,第一跳路由器的 IP 地址
层次编址
A: 从 ISP 获得地址块中分配一个小地址块:
| ISP’s block | 11001000 00010111 00010000 00000000 | 200.23.16.0/20 |
|---|---|---|
| Organization 0 | 11001000 00010111 00010000 00000000 | 200.23.16.0/23 |
| Organization 1 | 11001000 00010111 00010010 00000000 | 200.23.18.0/23 |
| Organization 2 | 11001000 00010111 00010100 00000000 | 200.23.20.0/23 |
| … | … | … |
| Organization 7 | 11001000 00010111 00011110 00000000 | 200.23.30.0/23 |
- 路由聚集
- 对内(子网化): ISP 把大网段切成 /23 的小网段分发下去。
- 对外(通告): 尽管内部有 8 个机构,但 ISP 只需要向互联网告诉其他路由器:“去往这 8 个地方的包,都先扔给我的 200.23.16.0/20 就可以了”。这极大地减少了全球路由表的条目数量。

3.4 NAT:网络地址转换

动机: 本地网络只有一个有效 IP 地址
- 不需要从 ISP 分配一块地址,可用一个 IP 地址用于所有的(局域网)设备
- 可以在局域网改变设备的地址情况下而无须通知外界(解耦)
- 电脑昨天的局域网 IP 是
192.168.1.10,今天重新连 WiFi,路由器用 DHCP 分配了192.168.1.50 - 对互联网上的服务器来说,它毫无察觉。它昨天和今天看到的,都是路由器的公网 IP(比如
202.10.20.30)
- 电脑昨天的局域网 IP 是
- 可以改变 ISP(地址变化)而不需要改变内部的设备地址(解耦)
- 假设公司原本用的是电信宽带(公网 IP 是
114.x.x.x),现在换成了联通宽带(公网 IP 是221.x.x.x) - 因为有 NAT 的存在,公司内部的电脑、打印机、本地服务器的 IP 依然可以保持
192.168.1.x不变 - 唯一需要做的,就是把路由器的外网接口插上联通的光猫,路由器会自动获取新的公网 IP 并更新它的 NAT 转换规则
- 假设公司原本用的是电信宽带(公网 IP 是
- 局域网内部的设备没有明确的地址,对外是不可见的 —— 安全
NAT主要分为静态NAT、动态NAT和单地址NAT(NAPT)三种类型,分别适用于服务器映射、客户端按需分配及多用户共享单IP上网等不同场景。
以下是这三种NAT类型的详细总结:
-
静态 NAT
- 机制:建立私有IP地址与特定保留公有IP地址之间的一对一固定映射。
- 应用场景:通常用于内网中的服务器主机,确保外部网络能通过固定的公网IP稳定访问内部服务。
-
动态 NAT
- 机制:NAT路由器维护一个公有IP地址池,根据需求动态地将池中的IP分配给私有IP地址(一对一,但不固定)。
- 应用场景:通常用于内网中的客户端PC,适合内部主机数量少于或等于可用公网IP数量的情况。
-
单地址 NAT / 重载 / 伪装 / 网络地址端口转换 (Single-Address NAT / Overloading / Masquerading / NAPT)
- 机制:通过端口转换技术,允许多个私有IP地址共享同一个公有IP地址进行通信。
- 应用场景:这是目前最常见的NAT形式(如家庭路由器),解决了IPv4地址短缺问题,让内网大量设备仅需一个公网IP即可访问互联网。
实现: NAT 路由器必须
- 外出数据包:替换源地址和端口号为 NAT IP 地址和新的端口号,目标 IP 和端口不变
- 远端的 C/S 将会用 NAT IP 地址,新端口号作为目标地址
- 记住每个转换替换对(在 NAT 转换表中)
- 源 IP,端口 vs NAT IP,新端口
- 进入数据包:替换目标 IP 地址和端口号,采用存储在 NAT 表中的 mapping 表项,用(源 IP,端口)

对 NAT 是有争议的:
- 路由器只应该对第 3 层做信息处理,而这里对端口号(4 层)作了处理
- 违反了端到端原则:复杂性放到网络边缘
- 无需借助中转和变换,就可以直接传送到目标主机
- NAT 可能要被一些应用设计者考虑(地址不断改变),eg, P2P applications
- 外网的机器无法主动连接到内网的机器上
- 地址短缺问题可以被 IPv6 解决
- NAT 穿越:如果客户端需要连接在 NAT 后面的服务器,如何操作
中继 (Skype)
- NAT 后面的服务器建立和中继的连接
- 外部的客户端链接到中继
- 中继在 2 个连接之间桥接

3.5 IPv6
- 初始动机: 32-bit 地址空间将会被很快用完
- 另外的动机:
- 提升处理与转发速度:采用新的头部格式,旨在加快数据包的处理和转发流程
- 支持服务质量(QoS):对头部进行更改,以便更好地实现和促进QoS机制
- 消除路由器分片:新设计确保数据包在路由器处无需进行分片操作
- 新增寻址模式:引入新的地址模式,支持将流量路由至多个复制服务器中的“最佳”节点
IPv6 数据报格式:
- 固定的 40 字节头部
- 数据报传输过程中,不允许分片
IPv6 头部 (Cont):
+--------+----------------+----------------------------------------+
| ver | Traffic Class | flow label |
+--------+----------------+----------------------------------------+
| payload len | next hdr | hop limit |
+--------------------------------+----------------+----------------+
| source address |
| (128 bits) |
+------------------------------------------------------------------+
| destination address |
| (128 bits) |
+------------------------------------------------------------------+
| |
| data |
| |
+------------------------------------------------------------------+
<----------------------------- 32 bits ---------------------------->
- 版本号 Version (4 bits): 6
- 流量类别 Traffic Class (8 bits)
- 分组的类别或优先级,用于标识 QoS
- 流标签 Flow Label (20 bits)
- 标识属于同一"流"的数据报
- 有效载荷长度 Payload length (16 bits)
- 包括所有扩展头及用户数据
- 下一个头部 Next Header (8 bits)
- 标识下一个头部的类型
- 扩展头或上一层协议
- 源地址 / 目的地址 (128 bits)
Traffic Class
- 字段定义与用途:IPv6 头部包含一个 8 位的 “流量类别”(Traffic Class)字段,源节点和转发路由器均可利用该字段来识别和区分不同类别或优先级的IPv6数据包,例如作为DiffServ(区分服务)中的代码点使用。
- 服务接口要求:服务接口必须提供机制,允许上层协议向IPv6层提供流量类别的具体数值。
- 值的可变性:流量类别字段的值并非固定不变,源端、转发器(路由器)以及接收端均有权对其进行修改。
- 上层协议注意事项:上层协议在设计时不应假设数据包中的流量类别值在传输路径中保持原样,必须考虑到该值可能被中间节点更改的情况。
IPv6 Flow
是指从特定源到特定目的地的数据包序列,在主机端体现为具有相同传输需求的应用数据流,在路由器端则表现为共享路由、资源分配及安全等处理属性的流量集合。
- 主机视角
- 来源与需求:由单一应用生成,且拥有相同的传输服务要求。
- 连接构成:可能包含单个 TCP 连接,也可能由多个 TCP 连接组成。
- 流的数量:一个应用程序既可能只生成一个流,也可能同时生成多个流。
- 路由器视角
- 处理依据:数据包共享影响路由器处理方式的属性。
- 关键属性:涉及路由选择、资源分配、丢弃要求、流量统计以及安全策略等。
Flow Label
通过源地址、目的地址和20位标签唯一标识数据流,使路由器仅需查表即可快速处理,无需解析完整报头。
- 流的唯一标识:一个数据流(Flow)由源地址、目的地址以及一个非零的20位 Flow Label 三者组合来唯一确定。
- 建立机制:在数据流正式开始传输之前,必须先定义该流的具体需求,随后系统会为其分配一个唯一的 Flow Label。
- 路由处理优势:路由器在处理数据包时,只需查找 Flow Label 对应的表项即可决定路由和处理方式,无需检查报头中的其他字段,从而显著提升了处理效率。
IPv6 相比 IPv4 的核心优势
-
寻址能力显著增强
- 地址空间扩展:采用 128 位地址长度,彻底解决了 IPv4 地址枯竭问题。
- 多播与任播:增强了多播地址的可扩展性,并引入 Anycast(任播) 机制,支持将数据包发送至一组节点中的“任意一个”,优化了服务定位。
- 自动配置:支持地址自动配置,降低了网络管理的复杂度和人工干预成本。
-
选项机制与处理效率优化
- 扩展头设计:将可选字段(Options)从基础头部中剥离,作为独立的扩展头置于 IPv6 头部与传输层头部之间,使协议更易于扩展。
- 路由处理减负:大多数扩展头无需中间路由器检查,减少了逐跳处理的开销。
- 去除校验和:移除了 IPv4 中的头部校验和字段,进一步降低了路由器的处理时间,提升了转发速度。
-
支持资源分配与 QoS
- 流量类别标识:利用 Traffic Class(流量类别) 字段对数据包进行分组,将其归入特定的流量流。
- 超越尽力而为:不再局限于传统的“尽力而为”服务,能够支持 QoS(服务质量) 处理,确保实时视频等对延迟敏感的应用获得优先保障。
-
更高效的移动性机制
- 原生移动支持:提供了比 IPv4 更高效且稳健的移动性机制,优化了设备在不同网络间切换时的连接保持与路由优化。
-
内置安全性
- IP 层原生防护:安全不再是附加选项,而是协议的一部分。
- 强加密与认证:内置了强大的 IP 层加密和认证机制,从底层保障数据传输的机密性与完整性。
从 IPv4 到 IPv6 的平移:
- 不是所有的路由器都能够同时升级的
- 在 IPv4 和 IPv6 路由器混合时,网络如何运转
- 两种被提出的方法
- 双栈:一些具有双栈的路由器(IPv6, IPv4)可以在格式之间进行转换
- 隧道:IPv6 作为有效载荷在 IPv4 路由器之间的 IPv4 数据报中携带
双栈:

- IPv4 到 IPv6 的地址转换是需要的
- 一些 IPv6 特性会丢失
隧道:
IPv6 数据报被封装在 IPv4 数据报中,IPv4 路由器只需要转发 IPv4 数据报即可


4 通用转发
每个路由器包含一个流表(被逻辑上集中的控制器计算和分发)
- 流: 由分组(帧)头部字段所定义
- 通用转发: 简单的分组处理规则
- 模式:将分组头部字段和流表进行匹配
- 行动:对于匹配上的分组,可以是丢弃、转发、修改、将匹配的分组发送给控制器
- 优先权:几个模式匹配了,优先采用哪个,消除歧义
- 计数器:bytes 以及 packets

4.1 OpenFlow
OpenFlow 是通用转发在 SDN 架构中最具代表性的实现方式。它通过流表和 “匹配 + 动作” 模型,将通用转发的灵活性转化为可编程、可集中管理的网络能力。
路由器中的流表定义了路由器的匹配+行动规则(流表由控制器计算并下发)
- 流表的表项结构

匹配 + 动作: 统一化各种网络设备提供的功能
- 路由器
- match: 最长前缀匹配
- action: 通过一条链路转发
- 交换机
- match: 目标 MAC 地址
- action: 转发或者泛洪
- 防火墙
- match: IP 地址和 TCP/UDP 端口号
- action: 允许或者禁止
- NAT
- match: IP 地址和端口号
- action: 重写地址和端口号
目前几乎所有的网络设备都可以在这个 匹配+行动 模式框架进行描述,具体化为各种网络设备包括未来的网络设备
例子: 来自 H5 和 H6 的数据报应该通过 s1 然后经由 s2 再发向 H3 或者 H4

4.2 中间盒
在源主机和目的主机之间的数据路径上,除 IP 路由器的正常、标准功能外,执行其他功能的任何中间设备
- NAT(网络地址转换)
- 家庭、蜂窝网络、机构
- 防火墙,IDS(入侵检测系统)
- 企业、机构、服务提供商、ISP(互联网服务提供商)
- 负载均衡器
- 企业、服务提供商、数据中心、移动网络
- 应用特定:
- 服务提供商、机构、CDN(内容分发网络)
- 缓存
- 服务提供商、移动网络、CDNs

- 最初:专有(封闭)的硬件解决方案
- 转向采用开放 API 的 “白盒” 硬件
- 摆脱专有硬件解决方案
- 通过 “匹配 + 动作” 实现本地动作的可编程
- 转向在软件层面进行创新/差异化
- SDN:(逻辑上)集中的控制和配置管理,通常位于私有/公共云中
- 网络功能虚拟化(NFV):在白盒网络、计算、存储之上实现可编程服务
标题:4 网络层:数据平面
作者:Zwing
创建于:2026-08-08 06:48:13
更新于:2026-08-07 23:07:52
链接:https://zanytriumph.github.io/posts/4 网络层-数据平面.html
版权声明:本文章采用 CC BY-NC-SA 4.0 进行许可