网络层概述
- 网络层的分解
- 数据平面功能:网络中每台路由器的功能,决定到达路由器输入链路之一的数据报如何转发到该路由器的输出链路之一
- 传统 IP 转发 (转发基于数据报的目的地址)
- 通用转发 (使用数据报首部中几个不同域执行转发和其他功能)
- 控制平面功能:网络范围的逻辑,控制数据报沿着从源主机沿着到目的主机的端到端路径中路由器的路由方式
- 路由选择算法
- 软件定义网络(Software-Defined Networking, SDN):将控制平面功能作为一种单独服务,明确地分离数据平面和控制平面
转发和路由选择:数据平面和控制平面
- 转发(forwarding):将分组从一个输入链路接口转移到适当的输出链路接口的路由器本地动作
- 数据平面中实现的唯一功能
- 分组有可能被现有的路由器阻挡也有可能冗余的经过多条链路发送
- 路由选择(routing):确定分组从源到目的地所采取的端到端路径的网络范围处理过程,通常用软件来实现
- 路由选择算法(routing algorithm):计算分组从发送方流向接收方时采用的路由或路径
- 在控制平面中实现
- 转发表(forwarding table):路由器检查到达分组首部的一个或多个字段值,进而使用这些首部值在其转发表中索引
- 转发表的配置
- 控制平面:传统方法
- 路由选择算法决定了插入路由器转发表的内容,在一台路由器中的路由选择算法与其他路由器重的算法通信,计算出转发表的值
- 控制平面:SDN方法
- 路由选择设备仅执行转发,而远程控制器计算并分发转发表
- 软件定义网络 (Software-Defined Networking, SDN) 的本质:计算转发表并与路由器交互的控制器是用软件实现的 (控制器可能实现在具有高可靠性和冗余的远程数据中心中)
网络服务模型
- 网络服务模型(network service model)定义了分组在发送和接收端系统之间的端到端运输特性
- 考虑几种网络层能提供的可能的服务:参考应用层 > 可供应用程序使用的运输服务
- 确保交付
- 具有时延上界的确保交付
- 有序分组交付
- 确保最小带宽
- 安全性
- 很遗憾的是,以上提到的服务,因特网的网络层一个也不提供,因特网的网络层提供了单一的服务,称为尽力而为服务 (best-effort service)
没有服务就是最好的服务
- 尽力而为服务(best-effort service):因特网网络层提供的单一服务,传送的分组既不能保证以发送的顺序被接收,也不能保证最终交付,既不能保证端到端时延,也不能保证有最小的带宽
- ⚠️转发和交换这两个术语经常被互换使用
- 分组交换机:通用分组交换设备,根据分组首部字段中的值,从输入链路接口到输出链路接口转移分组
- 链路层交换机(link-layer switch):基于链路层帧中的字段值做出转发决定
- 路由器(router):基于网络数据报中的首部字段值做出转发决定
路由器工作原理
- 路由器组件
- 输入端口(input port)
- 终结入物理链路的物理层功能
- 与位于远端的数据链路层交互来执行数据链路层功能
- 查询转发表决定路由器的输出端口
- 控制分组从输入端口(指物理IO接口,与软件端口不同)转发到路由选择处理器
- 交换结构:将路由器的输入端口连接到输出端口,这种交换结构时网络路由器中的网络
- 输出端口:存储从交换结构接收的分组,通过执行必要的链路层和物理层功能在输出链路上传输这些分组(双向链路输出端口总是和输入端口成对出现在同一线路卡上)
- 路由选择处理器:执行控制平面功能,
- 传统路由器:执行路由选择协议,维护路由选择表与关联链路状态信息
- SDN 路由器:负责与远端控制器通信,接收由远程控制器计算的转发表项
- 路由器的输入端口、输出端口和交换结构几乎总是用硬件实现
输入端口处理和基于目的地转发
- 输入端口的线路端接功能与链路层处理实现了用于各个输入链路的物理层和链路层
- 转发表从路由选择处理器经过独立总线 (eg. PCI) 复制到线路卡
- 使用每个输入端口的影子副本,转发决策可在每个输入端口本地做出,避免了集中式处理瓶颈
- 路由器通过前缀(prefix)匹配来转发分组,当有多个匹配时使用最长前缀匹配规则(longest prefix matching rule)
- 在吉比特速率下,查找转发表必须在纳秒级执行,需要对大型转发表使用超出简单线性搜索的技术,实践中常用三态内容可寻址存储器(Tenary Content Address Memory, TCAM) 来查找,使用 TCAM 一个 32 位 IP 地址可在常数时间内返回对应的转发表项
- 在某些设计中,如果来自其他输入输出端口的分组当前正在使用该交换结构,一个分组可能在进入交换结构时被阻塞,这个被阻塞的分组需要在输入端口处排队
- 输入端口除了查找仍需要处理的事情
- 物理层和链路层处理
- 检查分组的版本号、检验和以及寿命字段,并重写最后两个字段
- 更新用于网络管理的计数器
交换
- 路由器通过交换结构使分组实际地从一个输入端口交换到另一个输出端口中
- 交换可以用许多方式完成:
- 经内存交换
- 最简单、最早的路由器使传统的计算机,输入端口和输出段口之间的交换是在 CPU (路由选择处理器) 的控制下完成的
- 处理首部时分组需要被复制到内存中,所以转发吞吐量受到内存带宽限制
- 共享系统总线一次只能执行一个内存读 / 写,所以不能同时转发两个分组
- 现代路由器由输入线路卡查找目的地址和将分组存储进适当的内存存储位置
- 经总线交换
- 输入端口经一根共享总线将分组直接传送到输出端口
- 输入端口为分组预先计划一个交换机内部标签,指示本地输出端口,分组被所有输出端口收到,但只有与该标签匹配的端口才能保存该分组
- 一次只有一个分组能跨越总线,交换带宽受总线速率的限制
- 经互联网络交换
- 使用更复杂的互联网络能克服单一、共享式总线的带宽限制
- 图中的纵横式交换机是由 2N 条总线组成的互联网络,交叉点通过交换结构控制器在任何时候能够开启和闭合
- 纵横式交换机是非阻塞的 (non-blocking),只要没有其他分组当前被转发到该输出端口,转发到输出端口的分组将不会被到达输出端口的分组阻塞,如果来自两个不同输入端口的两个分组其目的地为相同的输出端口,则一个分组必须在输入端等待
输出端口处理
- 输出端口取出已经存放在输出端口内存中的分组并将其发送到输出链路上
排队
- 路由器在输入端口和输出端口处都能形成排队
- 排队的位置和程度取决于流量负载、交换结构的相对速率和线路速率
- 当无内存可用于存储到达的分组时会出现丢包 (packet loss)
输入排队
- 如果瓶颈在交换结构的吞吐量,那么在输入端口将出现分组排队
- 考虑纵横式结构,假定:
- 所有链路速度相同
- 一个分组能以一条输入链路接收一个分组所用的时间量,从任意一个输入端口传送到给定的输出端口
- 分组按 FCFS (First Come, First Served) 方式,若有两个分组被发往同一输出队列,其中的一个分组被阻塞
- 线路前部阻塞 (Head-Of-the-Line, HOL) 阻塞:线路前部的另一个分组阻塞,则同一输出队列中排队的分组必须等待前部分组发送后才能发送

输出排队
- 在缓存已满时,需要做出决定
- 丢弃到达的分组,采用弃尾 (drop-tail) 的策略
- 删除一个或者多个已排队的分组
- 主动队列管理 (Active Queue Management, AQM) 算法
- 在缓存填满前丢弃一个分组,可以向发送方提供一个拥塞信号
- 随机早期检测 (Random Early Detection, RED) 是得到最广泛研究和实现的 AQM 算法之一

- 当分组到达输出端口并排队时,输出端口的分组调度 (packet scheduler) 在排队分组中选择一个分组来传输
- 路由器缓存长度的经验方法:缓存数量 (B) 应当等于平均往返时延 (RTT) 乘以链路的容量 (C),最近的理论和试验表明,当有大量的 TCP 流 (N 条) 流过一条链路时,缓存所需要的量
分组调度
- 先进先出 (First-In-First-Out, FIFO)
- 如果链路正忙于传输另一个分组,则到达链路输出队列的分组要排队等待传输
- 如果没有足够的缓存来容纳到达的分组,队列的分组丢弃策略确定该分组是否将被丢弃,或者从队列中去除其他分组以便为到达的分组腾出空间
- FIFO (FCFS) 调度规则按照分组到达输出链路队列的相同次序来选择分组在链路上的传输

- 优先权队列 (priority queuing)
- 到达输出链路的分组被分类放入输出队列中的优先权类
- 优先权排队规则将从队列为非空的最高优先权类中传输一个分组
- 在同一优先权类的分组之间的选择通常以 FIFO 方式完成
- 下图使用的规则是非抢占式优先权排队 (non-preemptive priority queuing),即一旦分组开始传输就不能打断,所以高优先权的分组 4 到达后需要先等待低优先权的分组 2 传输完成

- 循环加权公平排队
- 在循环排队规则 (round robin queuing discipline) 下,类之间不存在严格的服务优先权,循环调度器在这些类之间轮流提供服务,下图当传输一个分组传输完成时,调度器查找循环序列中的下一个类

- 保持工作排队 (work-conserving queuing) 规则:有任何类的分组等待传输时,不允许链路保持空闲,当寻找给定类的分组没有找到时,保持工作的循环规则将立即检查循环检查序列中的下一个类
- 加权公平排队 (Weight Fair Queuing, WFQ) 规则
- 到达的分组被分类并在适合的每个类的等待区域排队
- WFQ 调度器以循环方式为各个类提供服务
- WFQ 是一种保持工作排队规则,在发现一个空队列时,调度器立刻移向下一个类
- WFQ 和循环排队的区别是,每个类在任何时间间隔内可能收到不同数量的服务,第 i 类将确保收到的服务部分等于 ,对一条传输速率为 R 的链路,第 i 类能至少获得 的吞吐量
网际协议
IPv4 数据报格式

- IPv4 的数据报格式如图
版本:4 比特,规定 IP 协议版本,IPv4 的版本号为 0100,IPv6 的版本号为 0110,通过查看版本号,路由器能确定如何解释 IP 数据报的剩余部分
首部长度:4 比特,指定 IP 数据报首部长度,由于确定载荷的起始点,一般的 IPv4 数据报具有 20 字节的首部
区分服务 (Differentiated Services, DS):区分不同类型的 IP 数据报, 从而便于现代网络提供 Qos (quality of service),IPv4 中前 6 位为区分服务代码点 (Differentiated Services Code Point,DSCP) [@DifferentiatedServices2023],后 2 位被用于显示拥塞通知 (Explicit Congestion Notification, ECN)
- DSCP
- ECN
ECN-Capable Transport (ECT): 如果位 6 被设置,表明此数据报的传输已经做好拥塞遭遇的准备,也就是说,它可以承受网络中的拥塞而不需要丢弃数据报
Congestion Experienced (CE) : 如果位 7 被设置,表明在网络路径中已经遇到拥塞,需要减少发送速率
数据报长度:IP 数据报的总长度 (首部加上数据),数据报长度字段的设计考虑到了以太网帧的最大传输单元 (MTU),该长度确保一个 IP 数据报可以作为数据字段(也就是载荷)被完整地封装在一个以太网帧内部进行传输
标识(Identification)、标志(Flags)、片偏移(Fragment Offset):与 IP 分片 相关
寿命(Time-To-Live, TTL):确保数据报不会永远在网络中循环,每当一台路由器处理数据报时 TTL 减一,若 TTL 为 0,则该数据报必须丢弃
协议:指示了 IP 数据报的数据部分应该交给哪个特定的运输层协议,可能值详见 IANA Protocol Numbers ,协议号将网络层与运输层绑定到一起
首部检验和:计算方法同 运输层 > 检验和计算过程 ,因为每经过一台路由器 TTL 字段会改变,所以每台路由器上必须重新计算检验和并放回原处
- 为什么运输层和网络层都执行差错检测?
- 首先 IP 层只对 IP 首部计算检验和,而 TCP / UDP 是对整个报文段计算
- TCP / UDP 与 IP 不一定必须运行在同一个协议栈上
源和目的IP地址:通常源主机通过 DNS 查找来决定目的地址
选项:选项字段允许 IP 首部被扩展,IPv6 首部已经删除选项字段
数据(有效载荷):包含要交付给目的地的 运输层报文段,也可承载如 ICMP 报文等数据
IPv4 数据报分片
- 一个链路层帧能承载的最大数据量叫作最大传送单元 (Maximum Transmission Unit, MTU),故 MTU 严格限制 IP 数据报的长度
- 发送方与目的地路径上的每段链路可能使用不同的链路层协议,每段协议可能具有不同的 MTU
- 当出链路的 MTU 比入链路小时,需要将 IP 数据报中的数据分片成两个或多个较小的 IP 数据报,用单独的链路层帧封装这些数据报(这些数据报被称为片, fragment),再通过输出链路发送这些帧
- 坚持网络核心保持简单的原则,IPv4 设计者决定将数据报重新组装的工作放到端系统中
- 目的主机收到一系列数据报时,需要确定数据报中的某些是否是一些原来较大的数据报的片,如果是的话需要将这些片重新组装成数据报
- IP 是不可靠服务,源主机发送的不同数据报具有不同的
标识号,分片后通过 偏移字段 指定该片放在初始 IP 数据报的哪个位置,并将最后一个片的 标志 比特设置为 0 ,其他片的 标志 比特设置为 1
- 图中 4000 字节的数据报到达路由器需要被转发到一条 MTU = 1500B 的链路上,初始数据报中 3980 字节数据必须被分配为 3 个独立的片

IPv4 编址
- 接口 (interface):主机与物理链路之间的边界
- 路由器的任务是从链路上接收数据报并从某些其他链路转发出去,路由器必须拥有两条或更多条链路与它连接
- 一个 IP 地址与一个接口相关联,而不是与包括该接口的主机或路由器相关联
- IPv4 地址通常用点分十进制记法 (dotted-decimal notation) 书写
- 除了在 NAT 后的接口外,全球因特网中的每台主机和路由器的每个接口,都必须有一个全球唯一的 IP 地址
- 图中的 223.1.1 开头的接口通过一台以太网交换机或一个无限接入点互联,形成一个字网 (subnet),
223.1.1.0/24 的左侧 24 比特定义了子网地址,/24 为子网掩码,任何连接到该子网的主机都需要具有 223.1.1.xxx 形式 
- 定义子网的方法:为了确定子网,分开主机和路由器的每个接口,产生几个隔离的网络岛,使用接口端接这些隔离的网络的端点,这些隔离的网络中的每一个都叫作一个子网 (subnet)
- 下图有 6 个子网,分别是
223.1.1.0/24 223.1.2.0/24 223.1.3.0/24 223.1.9.0/24 223.1.8.0/24 223.1.7.0/24 
- 无类别域间路由选择 (Classless Interdomain Routing, CIDR):形式为
a.b.c.d/x 的地址的最高比特构成了 IP 地址的网络部分,并且经常被称为该地址的前缀 ( prefix ) (或网络前缀),一个地址的剩余 32 - x 比特可用于区分该组织内部设备,该组织的内部结构可以采用同样的方式划分子网
- 地址聚合 (address aggregation) / 路由聚合 (route aggregation) / 路由摘要 (route summarization):使用单个网络前缀通告多个网络的能力

- 最长前缀匹配:当组织 1
200.23.18.0/23 换用 ISPs-R-Us 的服务时,Fly-By-Night-ISP 继续通告原来的地址块,ISPs-R-Us 增加通告 200.23.18.0/23,当其他路由器看见 200.23.16.0/20 和 200.23.18.0/23 时,根据最长前缀匹配向 ISPs-R-Us 路由 
- 分类编址 (classful addressing):具有 8、16 或 24 比特子网地址的子网被分别被称为 A、B 和 C 类网络,分别可容纳 16777214、65534、254 (两个预留地址)台设备
- IP 广播地址:主机发送目的地址为
255.255.255.255 的数据报时,报文会交付给同一个网络中的所有主机,路由器也会有选择地向邻近的子网转发该报文
获取一块地址
- IP 地址由因特网名字和编号分配机构 (Internet Corporation for Assigned Names and Numbers, ICANN)管理,ICANN 向区域性因特网注册机构分配地址
- ICANN 还管理 DNS 根服务器,同时负责分配域名和解决域名纠纷
DHCP [@DynamicHostConfiguration2023]
- 动态主机配置协议 (Dynamic Host Configuration, DHCP) 允许主机自动获取一个 IP 地址,网络管理员能配置 DHCP 以使主机每次与网络连接时能得到一个相同的 IP 地址,或者分配一个临时的 IP 地址 (temporary IP address),DHCP 还允许主机得知其他信息,例如子网掩码、默认网关和本地 DNS 地址

- DHCP 又被称为即插即用协议 (plug-and-play protocol) 或零配置协议 (zeroconf)
- DHCP 协议的步骤如图
DHCP服务器发现:新主机使用 DHCP 发现报文 (DHCP discover message),通过向 subnet 广播封装了 UDP 分组 (67 端口) 的 IP 数据报 (源 IP 0.0.0.0 本主机,目的 IP 255.255.255.255 广播地址),让 DHCP 服务器接收到报文
DHCP服务器提供:服务器用 DHCP 提供报文做出响应该报文仍然使用 IP 广播地址 255.255.255.255,提供报文中包含推荐的 IP 地址、网络掩码以及 IP 地址租用期 (address lease time) 
DHCP请求:客户从一个或多个服务器选择一个,并向选中的服务器提供 DHCP 请求报文 (DHCP request message),回显配置的参数
DHCP ACK:服务器用 DHCP ACK 报文 (DHCP ACK message) 对 DHCP 请求报文进行响应
- DHCP 客户端状态转移图

- DHCP 客户端的缺陷是移动节点在子网之间移动时,不能维持与远程应用之间的 TCP 连接
NAT
- 网络地址转换 (Network Address Translation, NAT) 通常用于 SOHO (Small Office, Home Office) 中设备过多的 IP 地址不够分配的情况
- RFC 1918 [@moskowitzAddressAllocationPrivate1996] 定义了以下 IP 地址块,用于专用网络 (private network) 和具有专用地址的地域的地址空间:
10.0.0.0/8
172.16.0.0/12
192.168.0.0/16
- 具有专用地址的地域 (realm with private address):其地址仅对该网络中的设备有意义的网络
- 家庭网络计算机从 DHCP 服务器得到 IP 地址
- NAT 路由器维护一张 NAT 转换表 (NAT translation table),当生成一个新的源端口号时,NAT 路由器选择任意一个当前未在 NAT 转换表中的源端口号,并在 NAT 转换表中增加一个表项

- NAT 的使用对于运行在家庭网络的服务器会引起问题 (P2P 对等方),解决方案包括 NAT 穿越 (NAT traversal) 和通用即插即用 (Universal Plug and Play, UPnP[@UniversalPlugPlay2023])
IPv6
- IPv6 数据报格式如图
版本:用于标识 IP 版本号
流量类型:与 区分服务 类似
流标签:用于标识一条数据报的流,能够对一条流中的某些数据报给出优先权
有效载荷长度:数据字段的字节数量
下一个首部:与 IPv4 协议字段相似
跳限制:转发数据报的每台路由器将该字段的内容减 1,若值为 0 则该数据报被丢弃
源地址和目的地址:IPv6 地址的格式见 RFC 4291 [@deeringIPVersionAddressing2006]
数据:IPv6 数据报的有效载荷部分
- 相较于 IPv 4 已经不存在的字段
分组/重新组装:IPv6 不允许在中间路由器上分片和组装,过大的数据报会被丢弃并回送一个 ICMP 报文
首部检验和:快速处理 IP 分组是关注的重点,由于运输层和数据链路层执行了检验操作,所以设计者将 IP 中的冗余字段去除
选项:现在选项字段出现在下一个首部指出的位置上
IPv4 到 IPv6 的迁移
- 建隧道 (Tunneling) :隧道发送端的 IPv6 节点将整个 IPv6 数据报放到一个 IPv4 数据报的数据 (有效载荷) 字段中,隧道接收端 IPv6 节点查看协议字段指示 IPv6,从 IPv4 数据报中取出 IPv6 数据报并提供路由

- 隧道 (tunnel):两台 IPv6 路由器之间的中间 IPv4 路由器的集合
通用转发和 SDN
- A middlebox is a computer networking device that transforms, inspects, filters, and manipulates traffic for purposes other than packet forwarding
- 网络层基于目的地转发的特征:查找目的 IP 地址 (匹配),将分组发送到有特定输出端口的交换结构 (动作)
- 考虑一种通用"匹配加动作"范式 (不局限于 Layer 3),对协议栈的多个首部字段匹配,并采取相应的动作,包括将分组转发到一个或多个输出端口 (就像在基于目的地转发中一样),跨越多个通向服务的离开接口进行负载均衡分组 (就像在负载均衡中一样),重写首部值 (就像在 NAT 中一样),有意识地阻挡/丢弃某个分组 (就像在防火墙中一样),为进一步处理和动作而向某个特定的服务器发送一个分组 (就像在 DPI 一样),等等
- 由于通用转发中匹配加动作表将基于目的地的转发表一般化,所以既包括网络层又包括链路层的转发决定,所以用 分组交换机 统称 SDN 转发设备

- 本节将基于 OpenFlow 标准对通用转发进行讨论
- OpenFlow 1.0 引入了关键的 SDN 抽象和功能
- 匹配加动作转发表在 OpenFlow 中称为流表 (flow table),表项包括
首部字段值的集合:基于硬件匹配在 TCAM 内存中执行最迅速
计数器集合
所采取的动作集合
匹配
入端口:分组交换机上接收分组的输入端口
- OpenFlow 不允许基于 TTL 字段或数据报长度字段的匹配
- 抽象的艺术:在一个时刻做一件事,将它做好。一个接口应当俘获一个抽象的最低限度的要件。不要进行一般化,一般化通常是错误的
动作
- 每个流表项都有零个或多个动作列表
- 作为重要的动作可能是:
转发:一个分组可能被单播广播或多播到输出端口,也可能被封装并发送到远程控制器,控制器可能对该分组采取某些动作,包括安装新的流表项,以及可能在该分组返回给该设备以在更新的流表规则集合下进行转发
丢弃:没有动作的流表项表明匹配的分组应当被丢弃
修改字段:分组被转发到输出端口前,分组首部除了 IP 协议的 Layer 2.3.4 字段可重写