文章目录
- 路由控制方式
- 每路由控制
- 逻辑集中式控制
- 路由选择算法
- LS —— 链路状态路由选择算法
- DV —— 距离向量路由选择算法
- LS 和 DV 算法的比较
- 自治系统内部路由协议
- RIP
- OSPF
- 自治系统外部路由协议:BGP
- 通告 BGP 路由信息
- 选择最好的路由
- 相关术语
- 热土豆选择
- 路由选择算法(路径选择)
- SDN 控制平面
- SDN 控制器和 SDN 网络控制应用程序
- OpenFlow 协议
- 数据平面和控制平面交互的例子
- ICMP:因特网控制报文协议
路由控制方式
每路由控制
逻辑集中式控制
控制器与路由器中的控制代理(CA)进行交互,以配置和管理该路由器的转发表。CA 无法直接与控制器交互,而是被动的。
路由选择算法
LS —— 链路状态路由选择算法
在链路状态算法中,网络拓扑和所有的链路开销都是已知的,各个节点(即路由)都需要先获得网络拓扑中的所有链路开销才可以使用 LS 算法计算。
具体操作来说就是,通过让每个节点向网络中所有其它节点广播链路状态分组,其中每个链路状态分组包含它所连接的链路的标识和开销。
节点广播的结果是所有节点都具有该网络中各个点的链路开销,当各个点得到一张完整的链路开销后便可以运行 LS 算法计算出到各个点的最低开销路径,由此得到该路由最终的路由表(也称转发表)。
链路状态算法采用 Dijkstra 算法来实现,但在网络中我们称为 LS 算法。
路由器得到路由表的步骤:
- 首先路由器需要得到整个网络拓扑的链路开销。
- 得到网络拓扑的链路开销后,使用 LS 算法计算得到路由表。
路由震荡:
图中各点之间的边权表示拥塞程度。
DV —— 距离向量路由选择算法
距离矢量路由选择的基本思想
-
各路由器维护一张路由表 , 结构如图
To(目标) Next(邻接点) cost(链路消耗) A Z 14 … … … 我需要从某个点前往目标点,下一个点我得选择一个前往目标 B 最低开销链路的点。
-
各路由器与相邻路由器交换路由表 ( 待续 )
-
根据获得的路由信息 , 更新路由表 ( 待续 )
如下图所示,已知 X、Y、Z 三点到 B 的距离分别为 22、11、10,A 与 X、Y、Z 交换路由表,也得到相应的链路开销为 10、12、4,最终得到从 A 去向目标 B 的最低开销路径的下一个邻接点为 Z。
路由信息更新:
- 事件一:路由检测到自己到邻居的链路开销发生变化时,它就更新其距离向量。
- 事件二:邻居路由传给我的路由表中的距离矢量发生了变化,也需要更新。
事件一举例:当 A 到 X 的链路开销变为 5 时,此时 A 需要更新路由表,为了同步,X 也需要更新路由表。
事件二举例:当 X 到 B 的链路开销变为 2 时,此时 X 需要更新路由表,为了同步,A 也需要更新路由表。(此时 A 到 B 的距离最低开销为 12,因此 A 存储的不再是 B-Z-14,而是 B-X-12)
特点:
- 分布式:每个节点都需要从一个或多个邻接点接收某些信息,执行计算,然后将计算的结果分发给邻居。
- 迭代:此过程一直要持续到邻居之间无更多信息要交换为止(该算法是自终止的,即没有需要计算的时候,它便自我停止了)。
- 异步:不要钱所有节点相互之间更新、计算都保持一致。
每个节点都将持续经历如下过程:
无穷计算问题:
如下图所示,
-
首先初始状态时,A B C D E 均可达,B->A[1], C->A[2], D->A[3], E->A[4]。
-
After 1:B->A 不可达,此时邻居 C 说“我可达呀”,从 C 得到 C->A[2],但 C->A 需要经过 B,而 B->C[1],因此 B 决定从 C 处走,所以从 B 开始若要到达 A,则需要消耗 B->A[3]。
-
After 2:从 B 走到 C 后,C 要到达 A 就必须经过 B,而 B->A[3],因此从 C->A[4]。
-
After 3:从 C 走到 B 后,B 还是无法直接到达 A,因此又是传给 C,因此和 After 1 一样 B->A = C->A[4] + 1 = 4,即 B->A[5]。
从 B 走到 C 后,此时不再走 B,因此 D < B,且 D 也可以到达 A,即 D->A[3]。
从 C 走到 D 后,D 的邻接点是 C、E 且都可以到达 A,此时 C->A 和 E->A 的链路开销一致,我们默认选左边的,因此 D->A = D->C[1] + C->A[4] = 5,即 D->A[5]。
-
如此反复,直至各点都为 INF 无穷,表示 A 点都不可达。
-
TTL 到期后,会自动舍弃该分组。
解决方案:
平分裂 (split horizon) 算法:增加毒性逆转
- C 知道要经过 B 才能到达 A ,所以 C 向 B 报告它到 A 的距离为 INF ; C 告诉 D 它到 A 的真实距离
- D 告诉 E, 它到 A 的距离 , 但 D 告诉 C 它通向 A 的距离为 INF
- 第一次交换 : B 通过测试发现到 A 的路径为 INF, 而 C 也告诉 B 到 A 的距离为 INF, 因此 ,B 到 A 的距离为 INF
- 第二次交换 : C 从 B 和 D 那里获知 , 到 A 的距离为 INF, 因此将它到 A 的距离为 INF
- 如此反复,坏消息以一次交换一个节点的速度传播
优点:坏消息以一次交换一个节点的速度传播。
缺点:涉及 3 个或更多节点的环路将无法使用毒性逆转技术检测到,如图所示。
LS 和 DV 算法的比较
报文复杂性:DV 略胜一筹
- LS:有 n 个节点,E 条链路,发送 O(nE) 个报文。
- DV:只和邻居交换信息。
收敛时间:LS 略胜一筹
- LS:O(n2),收敛过程中可能遇到路由震荡。
- DV:收敛较慢,可能遇到环路、无穷计数问题问题。
健壮性:LS 略胜一筹
-
LS
- 节点会通告不正确的链路代价。
- 每个节点只计算自己的路由表,因此错误信息影响较小。
-
DV
- 节点可能通告全网所有节点不正确的路由代价。
- 每个节点的路由表可能被其它节点使用,因此错误可以扩散到全网。
两个算法没有输赢,它们现在都在因特网中得到了应用。
自治系统内部路由协议
RIP
OSPF
自治系统外部路由协议:BGP
BGP 解决了 AS 与 AS 之间的通信问题,各个 AS 内部路由协议可以不一致(AS 内部各个路由器的路由协议需要一致),但 AS 与 AS 之间需要保持一致。
BGP 是一种分布式和异步的协议,就像距离向量路由选择协议一样。
在 BGP 中,分组并不是路由一个特定的目的地址,而是路由到 CIDR 化的前缀,即子网。例如 a.b.c.d/x
高 x 比特便是前缀。
BGP 为每台路由器提供了如下任务:
-
从邻居 AS 获得前缀的可达性信息。
BGP 允许每个子网向因特网通告它们的存在,而 BGP 确保在因特网中所有 AS 都知道该子网。
-
确定到该前缀的“最好的”路由。
一台路由器可能知道两条或更多条到达特定前缀的不同路由。需要基于路由策略选择一条最好的。
通告 BGP 路由信息
对于每个 AS,路由器可分为网关路由器和内部路由器。
- 网关路由器是一台谓语 AS 边缘的路由器,它直接连接到其它 AS 中的一台或多台路由器。
- 内部路由器仅连接在它自己 AS 中的主机和路由器。
- 例如:如图,AS1 中 1a、1b、1d 是内部路由器,1c 是网关路由器。
在 BGP 中,每台路由器通过使用 179 端口的半永久 TCP 连接交换路由选择信息。每条直接连接以及所有通过该连接发送的 BGP 报文,称为 BGP 连接。
- 跨越两个 AS 的 BGP 称为外部 BGP(eBGP)连接
- 在相同 AS 中的两台路由器之间的 BGP 会话称为内部 BGP(iBGP)连接。
- 在每个 AS 内部使用 TCP 连接,而不再是物理链路。
向 AS1 和 AS2 中所有路由器通告前缀 x 的可达性信息。
- 网关路由器 3a 先向网关路由器 2c 发送一个 eBGP 报文 “AS3 x”。
- 网关路由器 2c 接着向 AS2 中内部的所有路由器(包括网关路由器 2a)发送一个 iBGP 报文 “AS3 x”。
- 网关路由器 2a 接下来向网关路由器 1c 发送一个 eBGP 报文 “AS2 AS3 x”。
- 最后,网关路由器 1c 向 AS1 中内部所有路由器发送一个 iBGP 报文 “AS2 AS3 x”。
- 这个过程完成后,在 AS1 和 AS2 中的每个路由器都知道了 x 的存在并且也都知道了通往 x 的 AS 路径。
当然,在真实网络中,从某个给定的路由器到某个给定的目的地可能有多条不同的路径,每条通过了不同的 AS 序列。
网关路由器可能获取有关一个子网X的多条路径,从多个 eBGP 会话上:
- AS1 网关路由器 1c 从 2a 学习到路径:AS2,AS3,X
- AS1 网关路由器 1c 从 3a 处学习到路径:AS3,X
- 基于策略,AS1 路由器 1c 选择了路径:AS3,X,而且通过 iBGP 告诉所有 AS1 内部的路由器
选择最好的路由
从一个给定的路由器到一个目的子网可能有多条路径,那么一台路由器就需要选择一条最好的路径。
相关术语
-
AS-PATH:包含了通告已经通过的 AS 的列表。当某个前缀通过某个 AS 时,该 AS 将其 ASN 加入到该 AS 的 AS-PATH 的现有列表中。
例如:AS1 到达 3a 可通过 AS-PATH “AS2,AS3,X”,而另一条是 AS-PATH “AS3,X”。
-
NEXT-HOP:是 AS-PATH 起始的路由器接口的 IP 地址。
例如:“AS2,AS3,X” 其属性 NEXT-HOP 是最左边 AS2 的路由接口地址。
BGP 路由器还使用 AS-PATH 属性来检测和防止通告环路。
如果一台路由器在路径列表中看到包含了它自己的 AS,它将拒绝该通告。
热土豆选择
热土豆路由选择依据的思想:对于路由器 1b,应尽可能快地使用最低开销将分组送出其 AS,而不担心其 AS 外部到目的地余下部分的开销。热土豆路由选择是自私的算法,因为它试图只减小自己 AS 中的开销,而忽略在其 AS 之外的开销。
比喻:热土豆,因为它烫,所以要尽快送出去(尽快送出其 AS)。
路由选择算法(路径选择)
-
路由被指派一个本地偏好值作为其属性之一。
- 一条路由的本地偏好可能由该路由器设置或可能由在相同 AS 中的另一台路由器学习到。
- 本地偏好属性的值是一种策略决定,它完全取决于该 AS 的网络管理员。
- 具有最高本地偏好值的路由将被选择。
-
若都具有相同的最高本地偏好值,则选择最短 AS-PATH 的路由。
若采用该规则,则 BGP 将使用 DV 算法来决定路径,其中距离测量单位为 AS 条数,而不是路由器跳数。
-
若都具有相同的最高本地偏好值和 AS-PATH 长度,则使用热土豆选择,即选择具有最靠近 NEXT-HOP 路由器的路由。
-
若结果上述规则的过滤后,还无法确定下一个路由(即下一跳),那么就使用 BGP 标识符来选择路由。
SDN 控制平面
SDN 体系结构具有 4 个关键特征:
-
基于流表的转发:分组转发规则被精确规定在交换机的流表中。
-
数据平面与控制平面分离
-
网络控制功能:控制平面由两个组件组成:一个 SDN 控制器和若干网络控制应用程序。
控制器维护准确的网络状态信息(如:远程链路、交换机和主机的状态),为运行在网络控制应用程序提供这些信息、方法,这应用程序通过这些方法能够监视、编程和控制下面的网络设备。
-
可编程的网络:运行在网络控制应用上的软件,这些软件使用了由 SDN 控制器提供的 API 来定义和控制网络设备中的数据平面。
SDN 控制器和 SDN 网络控制应用程序
控制器的功能大体分为 3 个层次:
- 通信层:SDN 控制器和受控网络设备之间的通信。控制器和受控设备之间的通信跨越了一个接口,它现在被称为控制器的“南向”接口。
- 网络范围状态管理层:负责存储有关网络的主机、链路、交换机和其它 SDN 控制设备的最新状态。
- 网络控制应用程序层:控制器通过它的“北向”接口与网络控制应用程序交互。该 API 允许网络控制应用程序在状态管理层之间读写网络状态和流表。
OpenFlow 协议
OpenFlow 协议运行在 SDN 控制器和 SDN 控制的交换机或其它实现 OpenFlow API 的设备之间。OpenFlow 协议运行在 TCP 之上,使用 6653 端口。
从控制器到受控交换机流动的主要报文有如下:
- 配置:该报文允许控制器查询并设置交换机的配置参数。
- 修改状态:该报文由控制器所使用,以增加/删除或修改交换机流表中的表项,并设置交换机端口特性。
- 读状态:该报文被控制器用于从交换机的流表和端口收集统计数据和计数器值。
- 发送分组:该报文被控制器用于在受控交换机从特定的端口发送一个特定的报文。
从受控交换机到控制器流动的重要报文有如下:
- 流删除:该报文通知控制器删除一个流表项,例如由于超时,或作为收到“修改状态”报文的结果。
- 端口状态:交换机用该报文向控制器通知端口状态的变化。
- 分组入:一个分组到达交换机端口,并且不能与任何流表项匹配,那么这个分组将被发送给控制器进行额外处理。“分组入”报文被用于将分组发送给控制器。
数据平面和控制平面交互的例子
例子简单,略,只贴图。
ICMP:因特网控制报文协议
ICMP 被用于主机和路由器用来在网络层彼此通信。
主机或路由器使用 ICMP 来发送差错报文和询问报文。
ICMP 报文被封装在 IP 数据报中发送。
ICMP 差错报文如下:
- 终点不可达
- 源点抑制
- 时间过期
- 参数问题
- 改变路由(重定向)
不应发送 ICMP 差错报文的情况:
- 对 ICMP 差错报文不再发送 ICMP 差错报文
- 对第一个分片的数据报片的所有后续数据报片都不发送 ICMP 差错报文
- 对具有多播地址的数据报不发送 ICMP 差错报文
- 对具有特殊地址(如:127.0.0.1 或 0.0.0.0)的数据报不发送 ICMP 差错报文
常用的 ICMP 询问报文:
- 响应请求和回答
- 时间戳请求和回答
ICMP 应用:
- 分组网探测:ping 命令
- 跟踪路由:tracerout 命令