本系列文章为笔者在学习b站中科大郑烇老师的计算机网络课程时(郑老师讲得很清晰!!),结合课程PPT与《计算机网络:自顶向下方法》(第七版)所作的学习笔记,部分图片源自课程PPT或书中,如有侵权,请联系作者删除。
笔记汇总
5.1 路由选择算法
5.1.1 路由的概念
按照某种指标,找到从源节点到目标节点的较好路径。
- 较好路径:按照某种指标,代价较小的路径
- 指标:延迟、费用、队列长度等
以网络为单位进行路由,一个网络的所有节点地址前缀相同,且物理上聚集,路由信息传输、计算和匹配的代价低。
由于到了网络中的路由器时意味着可以到达网络中的任意一台主机(由链路层解决),于是可以用路由器代表一个网络,且将路由器抽象成图上的节点,路由器与路由器之间的代价抽象成边,把路由问题当成图的最短路问题。
5.1.2 路由选择算法
原则
- 正确性:算法必须是正确和完整的
- 简单性:算法在计算机上应简单
- 健壮性:算法能够适应通信量和网络拓扑的变化
- 稳定性:产生的路由不应该摇摆
- 公平性:对每一个站点都公平
- 最优性:某个指标的最优(如果代价太高,也可以不追求最优)
分类
第一种分类方式,根据算法是集中式还是分布式的来分
- 集中式路由选择算法(全局)
所有路由器有完整的网络拓扑结构和边的代价信息,如链路状态(Link State, LS)算法。 - 分散式路由选择算法(分布式)
路由器只知道与它有物理连接关系的邻居路由器到它的代价信息,迭代地与邻居交换信息,计算路由信息,如距离向量(Distance-Vector, DV)算法。
第二种分类方式,根据算法是静态的还是动态的来分
- 静态路由选择算法
路由随时间变化缓慢,人工调整。 - 动态路由选择算法
路由变化很快,周期性更新路由信息,根据链路代价的变化而辩护。
5.1.3 LS路由选择算法
大致工作流程
各点通过各种渠道获得整个网络拓扑结构,链路代价等信息,然后使用LS路由选择算法(dijkstra算法),计算出本节点到其他所有节点的最优路径,得到路由表。
具体细节
- 发现相邻节点,获知对方地址
- 测量到相邻节点的代价
- 组装分组,描述相邻节点情况(节点名称,代价)
- 将LS分组泛洪到整个网络中(序号、AGE年龄字段用于避免重复泛洪,如果序号之前在节点中出现过,则不对外发送,如果AGE年龄字段减为0,则丢弃该分组)
- 通过LS分组获知整个网络拓扑结构和链路代价,用Dijkstra算法计算最短路(Dijkstra在这就不细讲了)
可能的震荡问题
如下图中的例子,假设链路的代价为链路实时流量,一开始x、y、z到w的路径均为顺时针方向,这会使得x到w的代价变小,在下一个计算周期时,将会把路径切换为逆时针方向,依次类推,路由将反复震荡。
5.1.4 距离矢量路由选择算法
主要思想
距离矢量算法是一种迭代的、异步的和分布式的算法的,其基本思想是:
- 各路由器维护一张路由表
- 各路由器与相邻路由器交换路由表
定期测量与相邻节点的代价,定期交换路由表 - 根据获得的路由信息,更新路由表
使用Bellman-Ford方程进行更新:
假设 d x ( y ) d_x(y) dx(y)为从x到y的最小路径代价,则 d x ( y ) = m i n v { c ( x , v ) + d v ( y ) } d_x(y)=min_v\{c(x, v) + d_v(y)\} dx(y)=minv{c(x,v)+dv(y)},其中 v v v为 x x x的相邻节点
特点
- 分布式
每个节点需要从一个或多个直接邻居获取路由信息,然后将其计算结果分发给它的邻居 - 迭代
过程要持续到收敛为止,即所有邻居之间都没有有用信息交换 - 异步
各节点间的计算是独立的,步伐不需要一致 - 好消息传得快
好消息的传播以每一个交换周期前进一个路由器的速度进行(好消息指的是某个路由器接入或有更短的路径),如下图例子,当路由器A接入互联网中时,B获取其最短路径长度并向C方向扩散,一个周期一个路由器。
- 坏消息传的慢
无穷计算的问题,考虑下图例子,当路由器A退出互联网时,B到A的直接链路不可达,但是C向B发送的路由信息却显示可达,于是B从C更新(这显然是不对的),导致传播速度将非常缓慢。
5.1.5 LS和DV算法的比较
-
消息复杂度(DV胜出)
LS:有 n n n个节点, E E E条链路,发送报文 O ( n E ) O(nE) O(nE)
DV:只和邻居交换路由信息 -
收敛时间(LS胜出)
LS: O ( n 2 ) O(n^2) O(n2)朴素算法, O ( n l o g n ) O(nlogn) O(nlogn)优化算法,有可能产生震荡
DV:收敛较慢,可能存在路由环路,无穷计算问题 -
健壮性(LS胜出)
当路由器故障时,
LS:节点会向其邻居通告不正确的链路代价,由于每个节点只计算自己的路由表,路由计算在某种程度上是可分离的,故错误信息影响较小,较局部。
DV:节点可以通过交换路由信息向任意或所有目标节点通告不正确的链路代价,通过邻居的邻居扩散到整个网络。
5.2 因特网中自治系统内部的路由选择协议
5.2.1 因特网中的自治系统
理论上的路由选择算法将网络看成一个互联路由器的集合,但在实践中,该模型与一组执行同样路由选择算法的同质路由器集合的观点有一点简单化,由于:
-
规模
当路由器数目变得很大时,路由信息巨大,通信、计算和存储的开销将高得不可实现。必须采取一些措施以减少像因特网这种大型网络中的路由计算重复性。 -
管理自治
因特网是ISP的网络,每一个ISP都有自己的路由器网络,ISP希望按照自己的意愿运行路由器,或者隐藏其网络内部组织面貌。一个组织应当能够按自己的愿望运行和管理网络,同时还要与其他外部网络互联。
为了解决以上问题,可以通过将路由器组织进自治系统(Autonomous System,AS)中来解决。通常在一个ISP中的路由器以及互联它们的链路构成一个AS。一个AS由其全局唯一的AS号所标识。
5.2.2 自治系统内部路由选择协议
在相同AS中的路由器都运行相同的路由选择算法,并有彼此的信息,在一个AS内运行的路由选择算法叫自治系统内部路由选择协议(intra-autonomous system routing protocol)。
RIP(Routing Information Protocol)
RIP路由选择协议使用距离矢量算法,链路代价为1,每隔30s和邻居交换路由信息,最多通告25个目标子网。适用于较小的网络。
开放最短路径优先
开放最短路径优先路由选择协议(Open Shortest Path First,OSPF)广泛用于因特网的AS内部路由选择。“open”指的是路由选择协议规范是公众可用的。
OSPF是一种LS协议,使用泛洪链路状态分组与Dijkstra算法。(其中链路代价由网络管理员进行配置)
使用OSPF时,路由器向AS内所有的其他路由器广播路由选择信息(而不只是邻居)。每当一条链路状态发生变化,路由器就会广播链路状态信息;即使链路状态未发生变化,路由器也会周期性进行广播(至少每隔30min一次)。
OSPF报文直接由IP数据报承载,故必须自己实现可靠数据传输、链路状态广播等功能。
具有以下几方面的优点:
-
安全
所有OSPF报文均经过认证(防止恶意攻击) -
多条相同开销的路径
当存在多条开销相同的路径时,无须仅选择单一的路径承载所有的流量 -
对单播和多播路由选择的综合支持
-
支持在单个AS中的层次结构
层次化地配置多个区域(area),每隔区域内都运行自己的OSPF链路状态算法,向该区域内所有其他路由器广播其链路状态。
在每个区域内,一台或多台区域边界路由器负责为流向该区域以外的分组提供路由选择。
在AS中只有一个区域配置成主干区域,该区域为AS中其他区域之间的流量提供路由选择。主干总是包含AS中所有的区域边界路由器,可能还包含一些非边界路由器。
AS中区域间的路由选择要求分组先路由到一个区域边界路由器,然后经由主干区域到达目的区域的区域边界路由器,最后到达目的地。
5.3 ISP之间的路由选择:BGP
上一节介绍的是AS内部的路由选择协议,而当分组跨越多个AS进行传输时,需要借助自治系统间路由选择协议(inter-autonomous system routing protocol)。由于AS间路由选择协议涉及到多个AS之间的协调,于是需要使用统一的AS间路由选择协议,此协议称为边界网关协议(Broder Gateway Protocol)。
5.3.1 BGP的作用
由于规模与管理等因素,我们把整个网络分为若干个自治系统,每个AS内部的路由由上一节所介绍的自治系统内部的路由选择协议计算。而BGP起到把各个AS粘合起来的作用,使得AS内部的路由器能够得知AS外部的路由信息。
作为一种AS间的路由选择协议,BGP为每一台路由器提供了完成以下任务的手段:
- 从邻居AS获得子网前缀的可达信息
BGP允许每个子网向因特网其余部分通告它的存在 - 确定到该前缀的“最好的”路由
基于策略与可达信息决定可行路由中的最佳路由
5.3.2 通告路由信息
在BGP中,每对路由器之间通过使用建立在179端口上的半永久TCP连接交换BGP报文,称为BGP连接。跨越两个AS的BGP连接称为外部BGP连接(eBGP),在相同AS中的两台路由器之间的BGP连接称为内部BGP连接(iBGP)。如下图例子所示:
在每个AS中,一台路由器要么是网关路由器(如上图的1c,2a,2c,3a)要么是内部路由器(除网关外的其他路由器),网关路由器同时运行iBGP和eBGP协议,内部路由器运行AS内部路由选择协议。
考虑AS3向AS2和AS1中的所有路由器通告前缀
x
x
x的可达信息的过程,首先网关路由器3a向2c发送一个eBGP报文“AS3 x”,网关路由器2c向AS2中的所有其他路由器发送iBGP报文“AS3 x”,然后网关路由器2a向1c发送eBGP报文“AS2 AS3 x”,最后1c向AS1中所有其他路由器发送iBGP报文“AS2 AS3 x”。
注意到在上述过程中,当网关路由器向其他AS转发路由信息时(即发送eBGP报文时),需要将自己所属的AS号加在路径上。
在真实场景下,从某个给定的路由器到某个给定的目标地址可能有多条不同的路径(不同的AS序列),如下图所示,从AS1到达子网
x
x
x有两条可行路径。在这种情况下,BGP需要帮助路由器确定最佳路径。
5.3.3 确定最佳路由
BGP属性
BGP路由包括前缀与BGP属性,其中最重要的两个BGP属性为AS-PATH和NEXT-HOP。
-
AS-PATH
该属性在上述例子中也有提到,就是通告时携带的AS号路径,表明了从当前AS到目标前缀所经过的AS路径。当网关路由器向其他AS通告路由信息时,需要在AS-PATH中加入自己所属的AS号。该属性有利于路由器做环路检测,如果检测到环路则停止通告。 -
NEXT-HOP
该属性指的是AS-PATH起始AS中网关路由器的接口IP地址,如上一张图片所示,网关路由器2a向AS1路由通告信息“AS2 AS3 x”时,会通告1c说此路由的NEXT-HOP是2a的左边接口的IP。
BGP路径选择
如有到相同前缀有两条或多条路由,则顺序查看以下规则直到只剩下一条路由(消除规则):
-
本地偏好
本地偏好属性的值是一种策略选择,取决于AS的网络网络管理员(下一节将详细介绍BGP策略问题)。选择本地偏好最高的路由。 -
最短AS-PATH
从余下的路由中选择AS跳数最少的路由 -
热土豆路由选择
选择具备最小内部区域代价的网关作为往目的前缀的出口(不关注AS间的代价),即尽可能快的将分组送出其AS,而不担心其AS外部到目的地的余下部分的开销,就像烫手的热土豆一样,尽可能快地交给别人 -
BGP标识符
如果仍剩下多条路由,则使用BGP标识符来选择路由(类似随机)
5.3.4 路由选择策略
假设某个ISP只想路由流量去/到往它的客户网络,不想承载其他ISP之间的流量,那么可以选择不通告这些路由(如果不是去往我的用户,也不是来自我的用户,那我就不管了)
如下图例子,其中w是A的客户,x是B和C的客户,y是C的客户,此时A向B和C通告路径Aw,但是B不会选择向C通告路径BAw,因为C、A、w都不是B的用户,B无法获得收益,于是C将无法得知CBAw这条路由的存在。
5.3.5 AS间与AS内部路由选择协议为什么不同
-
策略
在不同AS之间,策略问题起着主导作用,一个给定的AS流量不能穿过另一个特定的AS,管理者需要控制谁在使用他的网络进行通信
在AS内部,无需策略,只有一个管理者 -
规模
AS间的协议必须考虑规模问题,以便支持全网的转发
AS内部规模不是一个问题,如果AS太大,可以分小 -
性能
AS内部更加关注性能
AS外部更加注重策略
5.4 SDN控制平面
5.4.1 SDN控制平面组成
SDN控制平面大致分为两个部分,SDN控制器与SDN网络控制应用程序。
控制器的功能大致组织为3个层次:
-
通信层
SDN控制器与受控网络设备(即分组交换机)之间的通信。控制器和受控设备之间的通信跨越了一个接口,它现在被称为控制器的南向接口。 -
网络范围的状态管理层
网络链路、交互设备和服务的状态(采用分布式数据库) -
对于网络控制应用程序层的接口
控制器通过它的北向接口与网络控制应用程序交互
5.4.2 OpenFlow协议
运行在SDN控制器和SDN控制的交换机或其他实现OpenFlow API的设备之间。
从控制器到分组交换机流动的报文有:
-
配置
允许控制器查询并设置交换机的配置参数 -
修改状态
由控制器使用,以增加/删除或修改交换机流表中的表项,并设置交换机端口特性 -
读状态
该报文被控制器用于从交换机的流表和端口收集统计数据和计数器值 -
发送分组
该报文被控制器用于在受控交换机从特定的端口发送出一个特定的报文。
从分组交换机到控制器流动的报文有:
-
流删除
通知控制器已删除一个流表项,或作为“修改状态”报文的回应 -
端口状态
分组交换机向控制器通知端口状态的变化 -
分组入
将分组传给控制器