网络层
数据平面与控制平面,IP、路由器、路由选择算法、OSPF、BGP 和 SDN
网络层概述
- 网络层的分解
- 数据平面
- 控制平面
- 数据平面功能:网络中每台路由器的功能,决定到达路由器输入链路之一的数据报如何转发到该路由器的输出链路之一
- 传统 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 路由器:负责与远端控制器通信,接收由远程控制器计算的转发表项
- 输入端口(input port)
-
路由器的输入端口、输出端口和交换结构几乎总是用硬件实现
输入端口处理和基于目的地转发
- 输入端口的线路端接功能与链路层处理实现了用于各个输入链路的物理层和链路层
- 转发表从路由选择处理器经过独立总线 (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/24223.1.2.0/24223.1.3.0/24223.1.9.0/24223.1.8.0/24223.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 数据报 (源 IP0.0.0.0本主机,目的 IP255.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/8172.16.0.0/12192.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 数据报格式如图
-
相较于 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 字段可重写
网络层-控制平面
- 控制平面不仅控制沿着从源主机到目的主机的端到端路径间的路由器如何转发数据报,而且控制网络层组件和服务如何配置和管理
- OSPF 是一种运行在单一 ISP 网络中的路由选择算法,BGP 是一种在因特网中用于互联所有网络的路由选择算法
概述
-
计算、维护和安装转发表与流表的方法:
-
每路由器控制和逻辑集中式控制之间的关键差异:路由器中的控制组件能否相互交互并主动参与计算转发表
-
逻辑集中式控制路由选择控制服务出于容错和性能扩展性的原因,很可能由多个服务器实现
路由选择算法
-
路由选择算法 (routing algorithm) 的目的:从发送方到接收方的过程中确定一条通过路由器网络的好的路径
-
图 (graph) 是一个 个节点和 条边的集合,每条边是取自 的一对节点,用 表示连接节点 和 边的开销,如果 不属于 ,则 ,如果属于 则节点 为节点 的领居(neighbor)
-
路由选择算法的目标找出从源到目的地间的最低开销路径 (least-cost path),若图中的所有边具有相同的开销,则最低开销路径也是最短路径 (shortest path)
-
路由选择算法分类:
- 根据集中式还是分散式
集中式路由选择算法(centralized routing algorithm):用完整的、全局性的网络知识计算出从源到目的地之间的最低开销路径,具有全局状态信息的算法常被称作链路状态 (Link State, LS) 算法分散式路由选择算法(decetralized routing algorithm):路由器以迭代、分布式的方式计算出最低开销路径。没有节点拥有关于所有网络链路开销的完整信息,之后学习的距离向量 (Distance-Vector, DV) 算法就是分散式路由选择算法
- 根据静态的还是动态的
静态路由选择算法(static routing algorithm):路由随时间变化慢,通常是人工调整动态路由选择算法(dynamic routing algorithm):随着网络流量负载或拓扑发生变化而变化
- 根据负载敏感还是负载迟钝
负载敏感算法(load-sensitive algorithm):链路开销动态变化以反映出底层链路的当前拥塞水平负载迟钝算法(load-insentitive algorithm):链路开销不明确反映拥塞水平
- 根据集中式还是分散式
LS 算法
-
实践中是让每个节点向网络中的所有其他节点广播链路状态分组来实现 (链路状态广播 link state broadcast 算法)
-
所有节点都拥有网络的完整视图
-
Dijkstra 算法 [@TuWenXiangJieDijkstraZuiDuanLuJingSuanFa2021][@DijkstraAlgorithm2023]:计算从某节点到达网络中所有其他节点的最低开销路径
- 经过算法的 次迭代后,可知道 个目的节点的最低开销路径
-
当 LS 算法中止时,对于每一个节点,都可以得到从源节点沿着最低开销路径的前一节点 (可回溯),通过对每个目的节点存放从 到目的地的最低开销路径上的下一跳节点,从而可以构建转发表
-
拥塞敏感的路由选择的振荡
- 考虑图中的情况,节点 和 向节点 发出造成链路开销为 1 的流量,节点 向节点 发出开销为 e 的流量了
- 如果路由选择算法拥塞敏感,则在第二次接收到同样开销的流量运行 LS 算法时,节点 会根据第一次的链路开销选择
y -> z -> w的路径,由于在第一次情况下y -> x -> w总开销为 而y -> z -> w的总开销只有 ,相类似的节点 和 都会选择顺时针方向发送流量 - 同样当第三次执行 LS 算法时所有的流量均逆时针发出,第四次则全为顺时针,造成振荡
- 防止这种情况出现的方法是让所有的路由器在同一周期的不同时刻运行 LS 算法,但是在运行一段时间后路由器会发生自同步现象,避免这种现象的方法是让每台路由器发送链路通告的时间随机化
DV 算法
- 分布式:每个节点都要从一个或多个直接相连邻居接收某些信息,执行计算,然后将其计算结果分发给邻居
- 迭代:此过程一直要持续到邻居之间无更多信息要交换为止
- 异步:不要求所有节点相互之间步伐一致地操作
- Bellman-Ford 方程
- 遍历 的所有相邻节点 ,从 到 的最低开销时所有相邻节点 的 的最小值 (待补充)
- 令 为取得方程最小值的相邻节点,若节点 要沿着最低开销路径向节点 发送一个分组,它应当先向 发送分组,所以节点 的转发表指定节点 作为下一跳路由器
- 使用 DV 算法,每个节点维护一个下列路由选择信息
- 到所有相邻节点的开销
- 节点 的距离向量 包含 到 中所有目的地 的开销估计值,注意 只是该距离向量的一个分量 (之后的叙述中可能会将这两个概念混淆,因为发送的是完整的距离向量,然而在下文的例子中通常只更新其中一个分量)
- 每个邻居的距离向量
- 每个节点不时向每个邻居发送距离向量,当节点 从任何一个邻居 接收到新距离向量时,它保存该距离向量,然后使用 Bellman-Ford 方程更新自己的距离向量,如果 的距离向量发生了变化,则 向所有的邻居发送更新后的距离向量,从而让所有邻居更新自身的距离向量,只要所有的节点以异步方式交换自己的距离向量,则每个开销估计值 会收敛到 (节点 到节点 的最低开销路径的开销)
- 为了一个给定路径 而更新转发表,节点 关注的是沿着最短路径到 的下一跳路由器邻居节点
链路开销改变与链路故障
-
如果运行 DV 算法的节点检测到从自己到邻居的链路开销发生变化时,它就更新自己的距离向量,如果到该邻居的距离向量分量发生了变化,则向所有邻居通知新的距离向量
-
路由选择环路 (routing loop)
- 假设链路开销变化时,,,, ,则 时刻当 检测到链路开销变化时 (从开销 4 变为 60), 计算到 的新的距离向量的分量
y -> x -> x和y -> z -> x相比较 - 这时遇到了路由选择环路,发出的分组为了到达 , 认为应该向 转发,而 认为应该向 转发,分组于是在这两个节点之间不停地来回反复
- 此时节点 计算出 所以在 时刻将更新后的距离向量告诉
- 在 时刻, 收到 的新距离向量,指示了 到 的最低开销是 6 , 计算到 的最低开销 (这时 已经知道了
z -> x的链路开销发生了变化),并在计算完后 时刻通知 其新开销 - 当 在 时刻收到 的通知时,计算到 的最低开销 并向 发送距离向量,随后 计算得到 并向 发送距离向量
- 如此反复直到 向 发送距离向量 ,此时 到 的最低开销链路切换为
z —> x,再发送接收一个迭代后,进入静止状态,此时为了让分组到达 , 会直接选择直接向 转发,路由选择环路状态结束
- 假设链路开销变化时,,,, ,则 时刻当 检测到链路开销变化时 (从开销 4 变为 60), 计算到 的新的距离向量的分量
增加毒性逆转 (poisoned reverse)[@SplitHorizonRoute2023]
- 如果 通过 路由选择到目的地 ,则 将通告 ,此时 相信 没有到 的路径,通过这个善意的谎言, 将不会试图经由 路由选择到
- 更新其距离向量,分量 ,并将新的距离向量发送给
- 此时 更新距离向量并通知
- 收到 的更新后 用 更新距离表,但是为了毒化逆向路径, 向 通告
- 注意如果涉及 3 个或更多节点无法用毒性逆转技术检测
LS 和 DV 算法比较
- LS 要求每个节点通过广播与所有节点通信,但只告诉所有节点与该节点之间相连的链路开销,以便确定全局信息
- DV 中每个节点仅与所有相邻节点通信,但为相邻节点提供了自己到网络中所有节点的最低开销估计
- LS 算法的的复杂性为
- LS 由于各节点执行各自的计算,提供了一定程度的健壮性,而 DV 算法一个不正确的节点计算值会扩散到整个网络
自治系统内部的路由选择:OSPF
-
实践中上文介绍的模型有一些简单化,原因有
- 规模:随着路由器数目变得很大,涉及路由选择信息的通信、计算和存储的开销将高得不可实现
- 管理自治:在理想情况下,一个组织应当能够按自己的愿望运行和管理其网络,还要能将其网络与其他外部网络连接起来
-
自治系统 (Autonomous System, AS):每个 AS 由一组通常处在相同管理控制下的路由器组成,ISP 可将其网络划分为一个或多个 AS ,AS 号由 ICANN 所分配
-
在一个 AS 中运行的路由选择算法叫做自治系统内部路由选择协议 (intra-autonomous system routing protocol)
-
开放最短路优先 (OSPF) 是一种链路状态协议[@moyOSPFVersion1998],使用洪泛链路状态信息和 Dijkstra 最低开销路径算法,路由器构建了关于整个自治系统的完整拓扑图,通过 Dijkstra ,路由器可以确定一个以自身为根节点到所有子网的最短路径树
-
各条链路的开销可以由网络管理员配置,但 OSPF 不强制使用设置链路权值的策略
- 将每条链路开销设置为 1 可以实现最少跳路由选择
- 将链路权值与链路容量设为反比,不鼓励流量使用低带宽链路
-
使用 OSPF 时,路由器向自治系统内所有其他路由器广播路由选择信息
- 每当链路的状态发生变化,路由器广播链路状态信息
- 链路的状态不发生变化,路由器也要周期广播链路状态,可以增加链路状态算法的健壮性
-
OSPF 协议报文直接由 IP 承载,所以 OSPF 需要自己实现可靠报文传输,链路状态广播等功能
-
OSPF 的优点
- 安全:使用鉴别机制
- 多条相同开销的路径
- 对单播和多播路由选择的总和支持
- 支持在单个 AS 中的层次结构:在每个区域内,一台或多台区域边界路由器向该区域内所有其他路由器广播其链路状态
ISP 之间的路由选择:BGP
- 分组跨越多个 AS 进行路由时,需要自治系统间路由选择协议 (inter-autonomous system routing protocol)
- 因特网中,所有的 AS 运行相同的 AS 间选择协议,称为边界网关协议 (Broader Gateway Protocol, BGP)
BGP 的作用
- 对于相同 AS 中的目的地而言,在路由器转发表中的表项由 AS 内部路由选择协议决定
- BGP 中分组不是路由到一个特定的目的地址,而是路由到 CIDR 化的前缀
- BGP 为每台路由器提供了一种完成以下任务的手段
- 从邻居 AS 获得前缀的可达性信息
- 确定该前缀的"最好的"路由
通告 BGP 路由信息
-
对于每个 AS ,每台路由器要么是一台网关路由器 (gateway router),要么是一台内部路由器 (internal router),网关路由器位于 AS 边缘,内部路由器仅连接自己 AS 中的主机和路由器[@ShiMeShiBGPBGP]
-
从高层次 (AS) 上考虑,若要向所有路由器通告前缀 的可达性信息
- AS3 向 AS2 发送一个 BGP 报文
AS3 x,告诉 存在并位于 AS3 中 - AS2 向 AS1 发送一个报文
AS2 AS3 x,告诉 存在可通过-> AS2 -> AS3的途径到达
- AS3 向 AS2 发送一个 BGP 报文
-
BGP 中,每对路由器通过使用 179 端口的半永久 (?) TCP 交换路由选择信息
-
每条之间连接以及通过该连接发送的 BGP 报文称为 BGP 连接 (BGP Connection),跨越两个 AS 的 BGP 连接称为外部 BGP (eBGP)连接,相同 AS 中的两台路由器之间的会话被称为内部 BGP (iBGP) 连接,每个路由器之间还有多条 iBGP 连接,应该指出的是,使用 iBGP 并非使用 eBGP 的前提条件。自治系统可从多种内部协议中选择,来连接内部网络上的路由器
-
再次考虑上述过程
- 路由器 3a 先向网关路由器 2c 发送一个 eBGP 报文
AS3 x - 网关 2c 向 AS 中所有其他路由器发送 iBGP 报文
AS3 x - 网关 2a 向 1c 发送一个 eBGP 报文
AS2 AS3 x - 网关 1c 向 AS1 中所有路由器发送 iBGP 报文
AS2 AS3 x
- 路由器 3a 先向网关路由器 2c 发送一个 eBGP 报文
-
实际网络中从某个给定的路由器到目的地可能有多条不同的路径
确定最好的路径[@WeiShiMeBGPSheQuBi2022]
- 路由器通过连接通告前缀时,在前缀中包括一些 BGP 属性 (BGP attribute)
- 按 BGP 术语来说,前缀及其属性称为路由 (route)
- AS-PATH:包含了通告已经通过的 AS 的列表,如果路由器在路径列表中看见了包含自己的 AS 则会拒绝该通告,以防止环路
- NEXT-HOP:AS-PATH 从左到右起始的路由器接口的 IP 地址,即最后经过的 AS (AS2) 的网关路由器出端口的 IP 地址,虽然是不属于当前 AS (AS1) 的路由器的 IP 地址,但是包含该 IP 地址的子网直接连接到 AS1
- 一段实际的 BGP 消息
BGP Message
Type: UPDATE Message
Path Attributes:
Path Attribute - Origin: IGP
Path Attribute - AS_PATH: 64500 64496
Path Attribute - NEXT_HOP: 198.51.100.1
Path Attribute - COMMUNITIES: 64500:13335
Path Attribute - Multi Exit Discriminator (MED): 100
Network Layer Reachability Information (NLRI):
192.0.2.0/24
热土豆路由选择 (hot potato routing)
-
运行热土豆路由选择算法的路由,当路由器收到到达前缀
x的多条 BGP 路由时,通过 AS 内部路由选择信息选择到达每个网关的最低开销路径 (几个网关就有几条),并选择这些路径中具有最低开销的那条,将通往这条路径的接口I的转发表项(x, I)加入转发表中
-
热土豆路由选择是自私的算法,试图减小在自身 AS 中的开销,尽可能快地以最低开销将分组送出自身 AS
路由器选择算法
-
对于任何给定的目的地前缀,进入 BGP 的路由选择输入是到某前缀的所有路由的集合,如果到相同的前缀有一条这样的路由,BGP 选择该路由,如果有多条这样的路由,则顺序地调用下列消除规则直到只剩一条路由
- Local-preference:取决于网络管理员的设置,可能由路由器设置或从相同 AS 中的其它路由器学习到
- AS-PATH:从具有相同的 local-preference 的路由中,选择具有最短 AS-PATH 的路径,如果该规则是路由选择的唯一规则,BGP 使用距离向量算法决定路径,其中距离测度使用 AS 跳的跳数而不是路由器跳的跳数
- Hot Potato Routing (图中没有呈现):选择最靠近 NEXT-HOP 路由器的路由
- 其他 BGP 标识符
Anycast
- 动机
- 在许多分散的不同地理位置,替换不同服务器上的相同内容
- 让每个用户从最靠近的服务器访问内容
- 配置时,CDN 公司为多台服务器指派相同的 IP 地址,并使用标准 BGP 从这些服务器的每台来通告 IP 地址,当 BGP 路由器收到对该 IP 地址的多个路由通告,他将这些通告处理为对相同的物理位置提供不用的路径,配置路由选择表时,路由器将本地化使用 BGP 路由选择算法 找到到 IP 地址最好的路由
- 当某客户请求视频时,CDN 向客户返回由地理上分散的服务器使用的共同的 IP 地址 (注意和集群选择策略区分),最近的服务器是 BGP 路由选择算法定义的
- 由于 BGP 路由选择的变化会导致 TCP 连接的不同分组到达 Web 服务器的不同实例,所以实践中 CDN 通常选择不使用 Anycast,但 IP 任播被广泛用于将 DNS 请求指向最近的 DNS 根服务器,Anycast 可以将请求路由到负责该地址的最近的 DNS 服务器
- 不妨在页面上查找一下距离最近的 DNS 服务器
| HOSTNAME | IP ADDRESSES | OPERATOR |
|---|---|---|
| a.root-servers.net | 198.41.0.4, 2001:503:ba3e::2:30 | Verisign, Inc. |
| b.root-servers.net | 199.9.14.201, 2001:500:200::b | University of Southern California, Information Sciences Institute |
| c.root-servers.net | 192.33.4.12, 2001:500:2::c | Cogent Communications |
| d.root-servers.net | 199.7.91.13, 2001:500:2d::d | University of Maryland |
| e.root-servers.net | 192.203.230.10, 2001:500:a8::e | NASA (Ames Research Center) |
| f.root-servers.net | 192.5.5.241, 2001:500:2f::f | Internet Systems Consortium, Inc. |
| g.root-servers.net | 192.112.36.4, 2001:500:12::d0d | US Department of Defense (NIC) |
| h.root-servers.net | 198.97.190.53, 2001:500:1::53 | US Army (Research Lab) |
| i.root-servers.net | 192.36.148.17, 2001:7fe::53 | Netnod |
| j.root-servers.net | 192.58.128.30, 2001:503:c27::2:30 | Verisign, Inc. |
| k.root-servers.net | 193.0.14.129, 2001:7fd::1 | RIPE NCC |
| l.root-servers.net | 199.7.83.42, 2001:500:9f::42 | ICANN |
| m.root-servers.net | 202.12.27.33, 2001:dc3::35 | WIDE Project |
路由选择策略
-
在路由选择算法中,首先根据本地偏好属性选择路由,本地偏好值由本地 AS 的策略决定
-
如图所示的自治系统,假设
W X Y是接入 ISP ,A B C是主干提供商网络,并且彼此发送流量并向客户网络提供全部的 BGP 信息,所有进入一个接入 ISP 网络的流量必定是以该网络为目的地,所有离开一个接入 ISP 网络的流量必定源于该网络
-
X是一个多宿接入 ISP,X 如果向 B 和 C 通告它没有通向除自身外任何其他目的地的路径,那么它将起到一个接入 ISP 的作用 -
商业 ISP 遵从的经验法则:任何穿越某 ISP 主干网的流量必须是其源或者目的 (或两者) 位于该 ISP 的某个网络中
SDN 控制平面
- SDN 体系结构的四个关键特征
- 基于流的转发
- 数据平面和控制平面分离:网络交换机在流表中执行"匹配加动作"规则,控制平面由服务器和决定管理交换机流表的软件组成
- 网络控制功能:控制平面自身由 SDN 控制器和网络控制应用程序组成
- 可编程的网络
- SDN 中数据平面交换机、SDN 控制器和网络控制应用程序是分离的实体,可以由不同的厂商和组织机构提供
SDN 控制器和 SDN 网络控制应用程序
- 控制器的功能层次
通信层:SDN 控制器和受控设备间的通信,设备需要想控制器传递本地观察到的事件,通过"南向"接口与受控设备通信网络范围状态管理层对于网络控制应用程序层的接口:通过"北向"接口与网络控制应用程序交互,允许网络控制应用程序在状态管理层之间读 / 写网络状态和流表
- 出于故障容忍、高可用性或性能等方面的考虑,在实践中这些服务和用于保持状态信息的数据库一般通过分布式服务器集合实现
OpenFlow 协议
- OpenFlow 协议运行在 SDN 控制器和 SDN 控制的交换机或其他实现 OpenFlow API 的设备之间
- OpenFlow 协议运行在 TCP 之上,使用 6653 默认端口号
- 在控制器
->受控交换机流动的重要报文- 配置:设置交换机的配置参数
- 修改状态:增加 / 删除或修改交换机流表中的表项,并设置交换机的端口特性
- 读状态:从交换机的流表和端口手机统计数据和计数器值
- 发送分组:令受控交换机在特定的端口发送一个特定的报文
- 从受控交换机
->控制器流动的报文- 流删除:通知控制器已删除一个流表项
- 端口状态:向控制器通知端口状态变化
- 分组入:动作 到达交换机端口的分组不能与任何流表项匹配,分组会被发送给控制器进行额外处理
数据平面和控制平面交互的例子
- 与 每路由器控制 不同的是,在上图的 SDN 场景中
- Dijkstra 算法作为一个单独的程序执行,位于分组交换机外部
- 分组交换机相 SDN 控制器发送链路更新且不相互发送
- 假设路由器 S1 和 S2 之间的链路状态发生变化
- S1 经历了链路故障,通过端口状态报文通知 SDN 控制器链路状态的更新
- SDN 控制器接收到了报文,通告链路状态管理器更新链路状态库
- Dijkstra 链路状态路由选择应用程序进行了注册,当链路状态更新时,应用程序接收到关于链路状态更新的通告
- 应用程序与链路状态管理器相互作用,得到更新的链路状态,参考状态管理层中的其他组件,计算新的最低开销路径
- 链路状态路由选择应用于流表管理器交互,流表管理器决定更新的流表
- 流表管理器使用 OpenFlow 协议报文更新 s1、s2 和 s4 的流表
ICMP [@InternetControlMessage1981]
- ICMP 的典型用途是差错报告
- ICMP 报文作为 IP 有效载荷承载
- ICMP 大部分类型报文格式 (详见 RFC )
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type | Code | Checksum |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| unused |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Internet Header + 64 bits of Original Data Datagram |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- Traceroute 用 ICMP 报文实现,在应用 nexttrace 中向目的地主机发送一系列 ttl 递增的 ICMP 报文,当第 n 和数据报到达第 n 台路由器时,数据报 TTL 过期,路由器丢弃数据报并回送一个 ICMP 告警报文 (Type 11 Code 0) ,当数据报到达目的地目的主机会送一个 ICMP 回显报文 (Type 0 Code 0),程序不再发送探测分组
- RFC 4443 [@guptaInternetControlMessage2006] ,新增了 IPv6 所需的新类型和编码,包括"分组太大"类型和"未被承认的 IPv6 选项"差错编码
网络管理
- 网络管理的定义:网络管理包括了硬件、软件和人类元素的设置、综合和协调,以监视、测试、轮询、配置、分析、评价和控制网络及网元资源,用合理的成本满足实时性、运营性能和服务质量的要求
网络管理框架
- 管理服务器 (managing server):运行在网络运营中心 (NOC) 的集中式网络管理工作站上,执行网络管理活动
- 被管设备 (managed device):一个被管设备包含几个被管对象 (managed object),被管对象可以是被管设备中硬件的实际部分或用于这些硬件及软件组件的配置参数
- 管理信息库 (Management Information baseBase, MIB):收集被管设备中每个被管对象的关联信息,MIB 对象由称为 SMI (Structure of Management Information) 的数据描述语言所定义
- 网络管理代理 (network management agent):与管理服务器通信,在管理服务器的命令和控制下在被管设备中采取本地动作
- 网络管理协议 (network management protocol)
简单网络管理协议
-
简单网络管理协议 (Simple Network Management Protocol):应用层协议,用于在管理服务器和代理之间传递网络管理控制和信息报文
-
最常使用的是请求响应模式,SNMP 管理服务器向 SNMP 代理发送一个请求,代理收到请求后,执行动作并回送报文
-
代理向服务器发送陷阱报文 (trap message),用于通知管理服务器异常的发生导致了 MIB 对象值的改变
-
SNMP 报文类型如下
- 报文一般被称为协议数据单元 (PDU)
- GetRequest、GetNextRequest 和 GetBulkRequest PDU 都是由管理服务器向代理发送,用于请求一个或多个 MIB 对象值
- 管理服务器使用 SetRequest PDU,来设置被管设备的一个或多个 MIB 对象值,代理用带有"noError"的 Response PDU 进行应答
- InformRequest PDU 用于通知另一个 MIB 信息管理服务器
- 陷阱报文异步产生,为了响应管理服务器要求的事件