因特网协议栈:网络层之控制平面

1,227 阅读16分钟

什么是控制平面

应用程序部署在不同的终端中,相互之间需要交换信息,然后有了应用层协议。终端需要给生存在其之内的应用程序提供来自其他终端的应用程序的信息,然后有了运输层协议。至于如何让信息从一个终端到达另一个终端,就是网络层协议要完成的事情。

网络层.png

为了更好的理解与部署网络层的工作,将网络层进一步分为两部分。控制平面决定了一个数据报如何在网络中穿梭,数据平面是交换设备根据控制平面的指示将数据报从自身的输出端口转发到自身的某个输出端口。

以车辆从A城市到达B城市的作为类比,控制平面决定了A-B之间要经过的路径,数据平面决定每辆车经过ETC时要做的处理如缴费、超载检查、指示通过的路口等。

此文章关注控制平面如何为数据报规划路线,并以此完成如负载均衡、防火墙等的控制目的。之后的内容假设已对数据平面有所了解。

数据平面参考

路由选择算法

如果对路由选择算法的实现不感兴趣,可以直接千万下一些,不妨碍整体的理解。

路由选择算法是指在所有可达的路径中,按照附加条件如最短,选择起始处到达目的地所经过的路径。路由选择算法可以不同的分类方式进行分类。

集中式与分散式

  • 集中式路由选择算法,意味着知道所有的节点已经它们所能到达的其他节点,然后从中提取出路径。这样具有全局状态新的算法也叫链路状态算法,LS
  • 分散式路由选择算法,意味着没有节点知道所有节点的信息,通过不断地与相邻的节点交换信息,最终计算出路径。

静态式与动态式

  • 静态式路由选择算法,意味着路由变化随着时间变化缓慢,通常可以通过人工进行调整。
  • 动态式路由选择算法,意味着要周期性地探测路由变化并对其做出调整,能快速地适应网络的变化。

此外,还可以按照负载敏感对算法进行区分,意味算法不仅仅考虑路径上的单一开销,还会进一步考虑实际速率等因素。

Dijkstra(迪杰斯特拉算法)

Dijkstra算法可以作为链路状态路由选择算法的代表。通过k次迭代,完成从源节点到k个节点中任意节点的最短路径计算。其算法过程为:

  1. 以 D(u) 记录到目前为止,源节点到达节点 u 的最短路径
  2. 以 r(u) 记录节点 u 是否访问过
  3. 维护一个队列,记录着源节点可以到达的节点,队列为空时,计算完成
  4. p(u) 表示当前节点到达 u 的开销
  5. 不断从队列中取出节点t,对于t可以到达的每个节点u,当节点 D(t) + p(u) > D(u) 时,说明找到更短路径,则 D(u) = D(t) + p(u)。如果节点u未曾被访问,加入队列中。

伪代码为

// 初始化
for all note as "u" be arrived from source
    D(u) = p(source)
    offer u to queue
D(other) = MAX_INTEGER   

// 迭代
loop: poll t from queue
    if(r(t)) continue
    for all note as "u" be arrived from t
        D(u) = min(D(u),  D(t) + p(u))
        if(!r(u)) offer u to queue
    r(t) = true

使用 Dijkstra,一个从A点到其他个点的最短路径的计算过程为例子为:

Dijkstra 图例 A-其他节点.png

DV算法(Distance-Vector,距离向量)

LS算法如 Dijkstra 算法的基本条件是,需要知道全局的路径信息。与之不同的,DV算法是一种迭代的、异步和分布式的算法。它的核心点为,所有节点不断向其他节点告知自己知道的信息,并从其他节点接收信息以更新自己知道的信息,迭代维护此过程,最终得到一个动态的最小消耗的模糊路径信息——要通过最低消耗的路径,我只需去往哪一个节点。

DV算法的过程为:

  1. 每个节点 x,向自己的邻居节点发送自己知道的去往任意节点 k 的最小消耗信息 Dx
  2. 每个节点 x, 接收其他节点 y 发送的信息去往任意节点k的最小消耗信息 Dy,并取 Dx(k) = min|Dx(k), Dx(y) + Dy(k)|
  3. 每个节点 x,dx(k) = p 含义是,要去往k节点我只需要经过我的邻居p节点

伪代码为:

// 初始化, 当前节点为 x
for each neighbor y
    send Dx to y
    
loop: 
    wait (I see a cost change to my neighbor y 
        or I receive Dy from neighbor)
        for each destination k :
            Dx(k) = min(Dx(k), Dx(y) + Dy(k))
            update dx
            
        if Dx(k) changed for any destination k
            send Dx to all neighbor y

可以看出DV算法是分布式的、异步的。DV算法与Dijkstra的鲜明对比是,使用Dijkstra的任意节点可以知道到达某一节点k,它所需要经过的所有路径;而DV仅知道要到达某一节点k,自己要经过的下一节点p。

一个 DV 算法的图例为:

DV算法图示.png

图中节点A、B、C开始是仅有自己去往其他节点的信息。然后向各自的邻居发送自己知道的信息,并接受来自于邻居的信息。在处理信息并且发现 dx 发生了改变,继续最新信息给自己的邻居,重复此过程到最终收敛。如果随着时间流逝,自己去往某个邻居节点的开销发生改变,算法又再次运行做出调整。也因此,一个节点只知道去往最终节点要去的下一个节点,而不知道整个路径的面貌。

AS

现实可以将网络由数量庞大的路由器组织而成。无论使用何种算法,都难以在期望的时间内收敛。并且对于不同的IPS网络供应商,希望对自己选择的路由算法有决定权。因此可以通过将路由器组织进入自制系统(Autonomous Systems,AS)来解决问题:

  • 规模:限定路由器网络中的路由器集合,使得在期望的时间内得到路由结果。
  • 管理自制:不同的ISP可以决定自己的路由器网络以及路由器算法。ISP可以拥有多个AS,AS可以与其他的AS连接。

每个AS中,每个节点(路由器,此后无特殊说明均值路由器)都处于相同的管理控制,并以相同的算法交换信息。在同一个AS中运行的算法也叫自制系统内部路由器选择协议。一个有代表性的内部路由选择算法为OSPF。

OSPF

OSPF中文称开放最短路径优先(Open Shortest Path first),是一种链路状态协议,它具有全局的节点信息。

OSPF运行原理.png

  • 在OSPF中,能够支持层次结构,这些层次结构能够给配置成多个区域,不同的区域可以运行自己的OSPF链路状态路由选择算法。在同一区域内的路由器,可以向区域内的其他路由器广播链路状态。
  • 每个区域,通过若干台边界路由器来来与其他区域连接。
  • OPSF会要求在区域中选举一个DR,每个路由器都与之建立相邻关系,DR负责收集所有的链路状态信息,并发布给其他路由器。同时也选举处一个BDR,以做DR的备份以在DR是失效时承担起DR的责任。
  • 并在最终形成主干区域,由其他区域的边界路由器或个别非边界路由器共同组成。主干区域提供了区域间的路由选择。

OSPF的优点可以包括为:

  • 安全:仅有受信任的路由器能参与AS内的OSPF协议,并能以鉴别的方式,基于在所有路由器上的共享秘密秘钥,来鉴别每个OSPF分组内容以验证真实性。
  • 多路径:对于具有相同开销的路径,允许使用多条路径。
  • 多层次:支持不同的节点集合层次,也分为不同区域,不同区域有不同目的并能有各自的路由算法。
  • 支持单播与多播的综合路由选择。

OSPF非常复杂,这里仅做简要了解。

BGP

类似OSPF的自制系统内部路由器选择协议解决了AS内部的路由问题,在其他时候,数据分组需要到达外部的AS。BGP(Border Gateway Protocol,边界网管协议)是互联网上一个核心的去中心化自治路由协议,通过维护IP路由表或“前缀”来实现AS之间的可达性。简而言之,BGP组织了AS相互之间如何到达。

BGP运行原理.png

简单来说,在BGP中,每个AS中的路由器要不是网关路由器要不是内部路由器。网关路由器视为AS的边缘,与其他网络路由器交换信息并组织出到达各个AS的可达性信息。

两个可以相互通信的网关路由器可以视为peer(对等方),也可理解为邻居。网关路由器运行着BPG协议,并在一开始配置邻居。 作为例子,考虑路由器 C2 如何到达 A1。

  • 在一开始,网关路由器X运行时,向自己的邻居Y发送BGP报文建立连接,然后相互交换各自AS的所有路由器所能处理的IP地址范围的前缀信息。
  • 每个AS的边缘定期地与邻居更新信息。
  • 假设A1所接受的地址前缀为 addrx ,在X与Y交换信息后,Y知道到达 addrx 路径为 “AS1 addrx”,以此类推,Z与U交换信息后,U知道到达 addrx 路径为 "AS2 AS1 addrx"。按照这样的方式,所有AS都知道了addrx的存在,并知道addrx的路径。其他的地址的可达性信息也如此交换。类似这样的路径表现为BGP的属性AS-PATHNEXT-HOP,前者为路径信息,后者为路径起点的路由器接口的IP地址。
  • 现在,C2可以向A1发送信息,将通过路径"AS2 AS1 addrx"最终将信息交付给A1。

BGP还支持一些特性以补充路由的选择:

  • 在每个AS中,可以有多个边缘。
  • 对于去往外部AS的流量,视为烫手的山芋,尽快地交出AS。AS考虑最短的AS可达路径,选择最小的内部路径开销将流量发出去而不考虑全局的开销。换言之,一条AS可达路径可最不是最短,但开销可能是最低的,AS总是选择最短的。如果有多条路径,可以选择任一一条。
  • 可以指派本地偏好,即按照想要的规则指定流量的路径。
  • 为了防止形成环路,网关路由器接受信息时,如果在AS-PATH中发现当前AS,则不记录这条路径。

每个AS通过BGP可以连接到外部AS,通过管理、维护、决策相互之间提供交换的路径信息,可以达到更多的流量控制目的。

BGP是相当复杂的路由协议,这里也仅是概括性地了解工作原理。

SDN 控制平面

交换设备的厂商可能使用不同的协议通信,还可能根据自身需要指定新的协议。使用不同的协议间的交换设备协作的前提是,知道其他协议是如何运作进而针对性地响应。这一过程是漫长的。

软件定义网络(SDN,Software Define Network)提供了一种网络设计理念:只要网络硬件可以在逻辑上集中式地进行软件管理,并且控制平面与数据平面(即控制与转发)是分开的,则认为这样的网络是一个SDN网络。SDN并不是某一种具体的技术或者协议,而是一种思想、架构。

SDN 架构.png

SDN具有的4个关键特征为:

  • 基于流的转发:在SDN中,可以依照位于运输层、网络层、链路层上的协议头中共11个字段进行匹配,将这些字段作为特征识别为一个流,然后给受控的交换设备提供流表项以决定流在网络中要通过的路径。交换设备能依据流表项行使数据平面的职能——转发。因此,SDN控制平面的工作是计算、管理、和安装所有交换设备中的流表项。
  • 数据平面与控制平面分离:参照于OpenFlow的抽象,总体上一个分组经过“匹配和动作”的规则完成一个交换设备自身的工作。匹配指交换设备参考流表项做出应用行为,动作指交换设备按照匹配结果将分组从某个端口发出。
  • 网络控制:传统交换设备相互通过某种协议交换信息,各自拥有本地的路由信息。与之不同的是,这一部分的软件职能在远端执行并与本地交换设备原理。因此,控制平面由SDN控制器网络控制应用程序两大部分组成。SDN控制器维护了所有受控设备的状态信息,并向网络控制应用程序提供这些信息,再同步给交换设备最新的路由信息。网络控制应用程序则根据SDN控制器提供的信息,监视、编程和控制受控设备。
  • 可编程的网络:网络控制应用程序是可编程的,逻辑上集中,代表了SDN的智力,也代表了在SDN下,能决定网络中的流如何流动,无论是NAT、负载均衡、防火墙等所代表的能力。

SDN控制器抽象.png

既然SDN要在逻辑上能集中式地管理整个网络,那么SDN架构就要抽象出一般性的控制平面能力。包括通信层、网络范围状态管理层、与网络控制应用程序的接口。

通信层是指定义与交换设备交换信息的协议能力,这些协议包括了如OpenFlow、SNMP等等可选的交换信息的抽象方式,以此作为南向API。

网络范围状态管理层是指,为了做出最终决策,必须掌握的状态信息,这些信息包括设备间的可达性、交换设备信息、链路信息等。以此为将要实现的目标功能提供参照条件。

与网络控制应用程序的接口是指,定义代表网络控制应用程序所应具有的能力的API,这些API包括、路由选择、负载均衡、防火墙等能力并以此作为北向API。网络范围状态管理层通过北向API提供各类状态信息,网络控制应用程序根据状态信息来具体实现北向API所描述的能力。

作为例子观察可能的运作过程,假设SDN下的某台交换设备的某条链路发生了故障:

  1. 交换设备通过OpenFlow(南向API)向SDN控制器通报了链路状态的改变。
  2. SDN控制器接收到OpenFlow报文,交由管理链路状态的管理器处理,此管理器更新了链路状态库。
  3. 负责路由选择的网络控制应用程序已提起注册,在链路状态更新时收到通知。
  4. 路由选择的应用程序与链路状态管理器共同协作,并参考管理层中的其他管理器,计算出最新的路由。
  5. 最新的路由信息交给流表管理器处理,它将决定流表的更新。
  6. 流表管理器通过OpenFlow向因此收到影响的交换设变发送新的流表,这些交换设备得以更新流表。

借助SDN的设计思想,穿梭在网络中的流量能被管理、控制。当然,在此阶段也仅仅是简要地了解其设计思想而没有深入细节。

总结

  • 在一开始,为了知道如何抵达端到端,需要路由算法决定端到端的路径以尽可能路由到开销小的路径。更进一步地,为了整体的交付性能,“开销”将引入许多参考条件已做整体评估,以此考虑整体的情况而不是仅仅是单次的路由选择。
  • 紧接着,为了减小规模使路由算法更快地收敛,并且为了各种实现目的而使用的不同路由算法得以应用,使用了AS将运行同一路由算法的或基于同一目的交换设备形成集合。
  • 每个AS内部可以决定自己使用的路由算法,并可以使用类似于OSPF的协议再次将内部层次化,自行决定AS内部的路由决策。
  • 对于AS之间,使用BGP确定两个AS的可达性并选择出合意的路由。
  • 最后以总体来看,以SDN来观察网络的发展趋势,即对在网络中端到端如何抵达,提供了逻辑上集中的管理控制框架。

总的来说,控制平面所做的事情是为网络中的流量选择合意的流向,使得任意的两端可以相互交换信息,并基于监测、分析、管理、控制、性能、质量等目的不断完善或重建控制平面的使能,并衍生出了SDN来一般化网络管理。

文章大部分内容来自《计算机网络——自顶向下方法》第七版第5章。

因特网协议栈各层文章传送门

因特网协议栈:应用层协议在做些什么

因特网协议栈:运输层如何交付数据

因特网协议栈:网络层之数据平面

因特网协议栈:网络层之控制平面

因特网协议栈:链路层概览

参考

《计算机网络——自顶向下方法》第七版第5章

OSPF详解

BGP漫谈