Skip to content

5. 网络层——控制平面

C. Yin edited this page Feb 20, 2024 · 1 revision

本章目标:

  • 理解网络层控制平面的工作原理
    • 传统路由选择算法
    • SDN控制器
    • ICMP:Internet Control Message Protocol
    • 网络管理(略)
  • 以及它们在互联网上的实例和实现:
    • OSPF, BGP, OpenFlow, ODL 和ONOS控制器, ICMP, SNMP

5.1 导论

  • 路由(route):按照某种指标(传输延迟,所经过的站点数目等)找到一条从源节点到目标节点的较好路径
    • 较好路径:按照某种指标较小的路径
    • 指标:站数,延迟,费用,队列长度等,或者是一些单纯指标的加权平均
    • 采用什么样的指标,表示网络使用者希望网络在什么方面表现突出,什么指标网络使用者比较重视
  • 以网络为单位(子网到子网)进行路由(路由信息通告+路由计算),而非主机到主机(主机到主机的路由规模比子网到子网大2-3个数量级)
    • 网络为单位进行路由,路由信息传输、计算和匹配的代价低
    • 前提条件是:一个网络所有节点地址前缀相同,且物理上聚集
    • 路由就是:计算网络到其他网络如何走的问题
  • 网络到网络的路由 = 路由器-路由器之间路由
    • 网络对应的路由器到其他网络对应的路由器的路由
    • 在一个网络中:路由器-主机之间的通信,链路层解决
    • 到了这个路由器就是到了这个网络
  • 路由选择算法(routing algorithm):网络层软件的一部分,完成路由功能

网络的图抽象

注:图抽象在其他网络场景中也十分有用,例如在P2P中,N是peer节点,E是TCP的连接

图抽象:边和路径的代价

  • c(x, x') = 链路的代价 (x, x')
    • e.g., c(w, z) = 5
  • 代价可能总为1
  • 或是 链路带宽的倒数
  • 或是 拥塞情况的倒数

$$ \text{Cost of path } (x_1, x_2, x_3, ... , x_p) = c(x_1, x_2) + c(x_2, x_3) + ... + c(x_{p-1}, x_p) $$

最优化原则(optimality principle)

  • 汇集树(sink tree)
    • 此节点到所有其它节点的最优路径形成的树
    • 路由选择算法就是为所有路由器找到并使用汇集树

路由选择算法的原则

  • 正确性(correctness):算法必须是正确的和完整的,使分组一站一站接力,正确发向目标站;完整:目标所有的站地址,在路由表中都能找到相应的表项;没有处理不了的目标站地址;
  • 简单性(simplicity):算法在计算机上应简单:最优但复杂的算法,时间上延迟很大,不实用,不应为了获取路由信息增加很多的通信量;
  • 健壮性(robustness):算法应能适应通信量和网络拓扑的变化:通信量变化,网络拓扑的变化算法能很快适应;不向很拥挤的链路发数据,不向断了的链路发送数据;
  • 稳定性(stability):产生的路由不应该摇摆
  • 公平性(fairness):对每一个站点都公平
  • 最优性(optimality):某一个指标的最优,时间上,费用上,等指标,或综合指标;实际上,获取最优的结果代价较高,可以是次优的

路由算法分类

  • 全局或者局部路由信息?
    • 全局:
      • 所有的路由器拥有完整的拓扑和边的代价的信息(上帝视角)
      • “link state”算法
    • 分布式:
      • 路由器只知道与它有物理连接关系的邻居路由器,和到相应邻居路由器的代价值
      • 叠代地与邻居交换路由信息、计算路由信息
      • “distance vector”算法
  • 静态或者动态的?
    • 静态:
      • 路由随时间变化缓慢
    • 动态:
      • 路由变化很快
      • 周期性更新
      • 根据链路代价的变化而变化
    • 静态-->非自适应算法(non-adaptive algorithm):不能适应网络拓扑和通信量的变化,路由表是事先计算好的
    • 动态-->自适应路由选择(adaptive algorithm):能适应网络拓扑和通信量的变化

5.2 路由选择算法

5.2.1 link state 链路状态算法

LS路由的工作过程

  • 配置LS路由选择算法的路由工作过程
    • 各点通过各种渠道(如泛洪等)获得整个网络拓扑,网络中所有链路代价等信息(这部分和算法没关系,属于协议和实现)
    • 使用LS路由算法计算本站点到其它站点的最优路径(汇集树),得到路由表
    • 按照此路由表转发分组(datagram方式)
      • 严格意义上说不是路由的一个步骤
      • 分发到输入端口的网络层
graph LR

A[获得网络拓扑和链路代价信息]
B[使用最短路由算法得到路由表]
C[使用此路由表]

A-->B
B-->C
Loading

链路状态路由选择(link state routing)

  • LS路由的基本工作过程

    1. 发现相邻节点,获知对方网络地址

      • 一个路由器上电之后,向所有线路发送HELLO分组
      • 其它路由器收到HELLO分组,回送应答,在应答分组中,告知自己的名字(全局唯一)
      • 在LAN中,通过广播HELLO分组,获得其它路由器的信息,可以认为引入一个人工节点
    2. 测量到相邻节点的代价(延迟,开销)

      • 实测法,发送一个分组要求对方立即响应
      • 回送一个ECHO分组
      • 通过测量时间可以估算出延迟情况
    3. 组装一个LS分组,描述它到相邻节点的代价情况

      • 发送者名称
      • 序号,年龄
      • 列表:给出它相邻节点,和它到相邻节点的延迟
    4. 将分组通过扩散的方法(泛洪)发到所有其它路由器(以上4步让每个路由器获得拓扑和边代价)

      • 顺序号:用于控制无穷的扩散,每个路由器都记录(源路由器,顺序号),发现重复的或老的就不扩散
        • 具体问题1:循环使用问题
        • 具体问题2:路由器崩溃之后序号从0开始
        • 具体问题3:序号出现错误
      • 解决问题的办法:年龄字段(age)
        • 生成一个分组时,年龄字段不为0
        • 每个一个时间段,AGE字段减1
        • AGE字段为0的分组将被抛弃
      • 关于扩散分组的数据结构
        • Source:从哪个节点收到LS分组

        • Seq.,Age:序号,年龄

        • Send flags:发送标记,必须向指定的哪些相邻站点转发LS分组

        • ACK flags:本站点必须向哪些相邻站点发送应答

        • DATA:来自source站点的LS分组

        • 如:节点B的数据结构

    5. 通过Dijkstra算法找出最短路径(这才是路由算法)

      • 每个节点独立算出来到其他节点(路由器=网络)的最短路径
      • 迭代算法:第k步能够知道本节点到k个其他节点的最短路径
      1. 路由器获得各站点LS分组和整个网络的拓扑
      2. 通过Dijkstra算法计算出到其它各路由器的最短路径(汇集树:该源节点的路由表)
      3. 将计算结果安装到路由表中
  • LS的应用情况

    • OSPF协议是一种LS协议,被用于Internet上
    • IS-IS(intermediate system-intermediate system):被用于Internet主干中,Netware
  • 符号标记:

    • c(i, j):从节点i到j的链路代价(初始状态下非相邻节点之间的链路代价为 $\infty$
    • D(v):从源节点到节点V的当前路径代价(节点的代价)
    • p(v):从源到节点V的路径前序节点
    • N':当前已经知道最优路径的的节点集合(永久节点的集合)
  • LS路由选择算法的工作原理

    • 节点标记:每一个节点使用(D(v), p(v)) 如:(3, B)标记
      • D(v)从源节点由已知最优路径到达本节点的距离
      • P(v)前序节点来标注
    • 2类节点
      • 临时节点(tentative node):还没有找到从源节点到此节点的最优路径的节点
      • 永久节点(permanent node) N':已经找到了从源节点到此节点的最优路径的节点
  • Dijkstra算法的框架

    1. 初始化
      • 除了源节点外,所有节点都为临时节点
      • 节点代价除了与源节点代价相邻的节点外,都为 $\infty$
    2. 从所有临时节点中找到一个节点代价最小的临时节点,将之变成永久节点(当前节点)W
    3. 对此节点的所有在临时节点集合中的邻节点(V)
      • 如果 D(v) > D(w) + C(w, v),则重新标注此点为 (D(v) + C(w, v), W)
      • 否则,不重新标注
    4. 开始一个新的循环(第2步)
    5. 最终搜索得源节点到所有节点的最优路径,算法终止
    • 例子

  • Dijkstra算法的讨论

    • 算法复杂度:考虑 $n$ 节点的情况
      • 每一次迭代:需要检查所有不在永久集合N中的节点
      • $n(n+1)/2$ 次比较: $O(n^2)$
      • 有很有效的实现: $O(n\log{n})$ 最小堆 or 斐波那契堆
    • 可能的震荡:
      • e.g., 链路代价 = 链路承载的流量:切换路径过快

5.2.2 distance vector 距离矢量算法

距离矢量路由选择(distance vector routing):迭代式算法

  • 动态路由算法之一
  • DV算法历史及应用情况
    • 1957 Bellman, 1962 Ford Fulkerson
    • 用于ARPANET, Internet(RIP) DECnet, Novell, ApplTalk
  • 距离矢量路由选择的基本思想
    • 各路由器维护一张路由表,结构如图(其它代价)

    • 各路由器与相邻路由器交换路由表

    • 根据获得的路由信息,更新路由表

  • 代价及相邻节点间代价的获得
    • 跳数(hops),延迟(delay),队列长度
    • 相邻节点间代价的获得:通过实测
  • 路由信息的更新(定期测量它到相邻节点的代价,定期与相邻节点交换路由表(DV),这里的距离矢量(DV)实际上为约定次序的往各个目标节点的代价向量:(目标, 代价)列表)
    • 根据实测 得到本节点A到相邻站点的代价(如:延迟)
    • 根据各相邻站点声称它们到目标站点B的代价
    • 计算出本站点A经过各相邻站点到目标站点B的代价
    • 找到一个最小的代价,和相应的下一个节点Z,到达节点B经过此节点Z,并且代价为A-Z-B的代价
    • 其它所有的目标节点一个计算法

例子:

以当前节点J为例,相邻节点A, I, H, K

  • J测得到A, I, H, K的延迟为8ms, 10ms, 12ms, 6ms
  • 通过交换DV,从A, I, H, K获得到它们到G的延迟为18ms, 31ms, 6ms, 31ms
  • 因此从J经过A, I, H, K到G的延迟为26ms, 41ms, 18ms, 37ms
  • 将到G的路由表项更新为18ms, 下一跳为:H
  • 其它目标一样,除了本节点J

距离矢量算法(Bellman-Ford)

  • Bellman-Ford方程(动态规划) 递归风车

    • $d_x(y)$ 为从 $x$$y$ 的最小路径代价,那么 $$d_x(y) = \min_v(c(x, v) + d_v(y))$$
    • 其中 $c(x, v)$$x$ 到邻居 $v$ 的代价, $d_v(y)$ 为从邻居 $v$ 到目标 $y$ 的代价, $\min_v$ 为取所有 $x$ 的邻居取最小的 $v$
  • Bellman-Ford例子

    • 明显的: $d_v(z) = 5$ , $d_x(z) = 3$ , $d_w(z) = 3$
    • 由B-F方程得到:
      $$d_u(z) = \min(c(u,v) + d_v(z), c(u,x) + d_x(z), c(u,w) + d_w(z)) = \min(2+5, 1+3, 5+3) = 4 $$
    • 那个能够达到目标 $z$ 最小代价的节点 $x$ ,就在到目标节点的下一条路径上,在转发表中使用
  • $D_x(y)$ 为节点 $x$$y$ 代价最小值的估计

    • $x$ 节点维护距离矢量 $D_x = [D_x(y): y \in N]$
  • 节点 $x$

    • 知道到所有邻居 $v$ 的代价记为 $c(x,v)$
    • 收到并维护一个它邻居的距离矢量集
    • 对于每个邻居, $x$ 维护 $D_v = [D_v(y): y \in N]$
  • 核心思路:

    • 每个节点都将自己的距离矢量估计值传送给邻居,定时或者DV有变化时,让对方去算
    • $x$ 从邻居收到DV时,自己运算,更新它自己的距离矢量
      • 采用B-F equation:
        $$D_x(y) \leftarrow \min_v{c(x,v) + D_v(y)}, \qquad \text{for every $y \in N$ } $$ 其中 $D_x(y)$$x$$y$ 的代价, $c(x,v)$$x$ 到邻居 $v$ 代价, $D_v(y)$$v$ 声称到 $y$ 的代价
    • $D_x(y)$ 估计值最终收敛于实际的最小代价值 $d_x(y)$
      • 分布式、迭代算法
        • 异步式,迭代:每次本地迭代被以下事件触发:

          • 本地链路代价变化了
          • 从邻居来了DV的更新消息
        • 分布式:

          • 每个节点只是在自己的DV改变之后向邻居通告
          • 然后邻居们在有必要的时候通知他们的邻居
        • 每个节点:

          graph TD
          
          A[等待本地链路代价变化或者从邻居传送新的DV报文]
          B[重新计算各目标代价估计值]
          C[如果到任何目标的DV发生变化则通告邻居]
          
          A-->B
          B-->C
          C-->A
          
          Loading

DV的无穷计算问题

  • DV的特点
    • 好消息传的快,坏消息传的慢
  • 好消息的传播以每一个交换周期前进一个路由器的速度进行
    • 好消息:某个路由器接入或有更短的路径(链路由断变为通,链路代价由大变小),举例:

    • 坏消息的传播速度非常慢(无穷计算问题)

      • 例子:第一次交换之后,B从C处获得信息,C可以到达A(C-A,要经过B本身),但是路径是2,因此B变成3,从C处走;第二次交换,C从B处获得消息,B可以到达A,路径为3,因此,C到A从B走,代价为3;无限此之后,到A的距离变成INF,不可达

通过 水平分裂(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
    • ……坏消息以一次交换一个节点的速度传播
  • 水平分裂的问题:在某些拓扑形式下会失败(存在环路)
    • 例子:
      • A,B到D的距离为2,C到D的距离为1
      • 如果C-D路径失败
      • C获知到D为INF,从A,B获知到D的距离为INF,因此C认为D不可达
      • A从C获知D的距离为INF,但从B处获知它到D的距离为2。因此A到B的距离为3,从B走
      • B也有类似的问题
      • 经过无限次之后,A和B都知道到D的距离为INF

DV完整例子:

LS 和 DV 算法的比较 2种路由选择算法都有其优缺点,而且在互联网上都有应用

  • 消息复杂度(DV胜出)
    • LS:有n节点,E条链路,发送报文O(nE)个
      • 局部的路由信息;全局传播
    • DV:只和邻居交换信息
      • 全局的路由信息;局部传播
  • 收敛时间(LS胜出)
    • LS: $O(n^2)$ 算法
      • 有可能震荡
    • DV:收敛较慢
      • 可能存在路由环路
      • count-to-infinity 问题
  • 健壮性:路由器故障会发生什么(LS胜出)
    • LS:
      • 节点会通告不正确的链路代价
      • 每个节点只计算自己的路由表
      • 错误信息影响较小,局部,路由较健壮
    • DV:
      • DV节点可能通告对全网所有节点的不正确路径代价
        • 距离矢量
      • 每一个节点的路由表可能被其它节点使用
        • 错误可以扩散到全网

5.3 因特网中自治系统内部的路由选择(内部网关协议)

互联网中的内部网关协议有两种常见协议:RIP 和 OSPF

5.3.1 RIP

RIP(Routing Information Protocol)

  • 在1982年发布的BSD-UNIX中实现

  • 基于 Distance vector 算法

    • 距离矢量:每条链路cost=1,# of hops (max = 15 hops) 跳数 (跳数为16表示目标不可达)
    • DV每隔30秒和邻居交换DV,通告(AD)
    • 每个通告包括:最多25个目标子网

RIP 通告(advertisements)

  • DV:在邻居之间每30秒交换通告报文
    • 定期,而且在改变路由的时候发送通告报文
    • 在对方的请求下可以发送通告报文
  • 每一个通告:至多AS内部的25个目标网络的DV(用于小型网,代价小,简单)
    • 目标网络 + 跳数

例子:


RIP:链路失效和恢复

  • 如果180秒没有收到通告信息-->邻居或者链路失效
    • 发现经过这个邻居的路由已失效
    • 新的通告报文会传递给邻居
    • 邻居因此发出新的通告(如果路由变化的话)
    • 链路失效快速(?)地在整网中传输
    • 使用毒性逆转(poison reverse)阻止ping-pong回路(不可达的距离:跳数无限 = 16 段)

RIP进程处理

  • RIP以应用进程的方式实现:route-d (daemon)
  • 通告报文通过UDP报文传送,周期性重复
  • 网络层的协议使用了传输层的服务,以应用层实体的方式实现

5.3.2 OSPF

OSPF(Open Shortest Path First) 开放最短路径优先协议

  • “open”:标准可公开获得
  • 使用LS算法
    • LS分组在网络中(一个AS内部)分发
    • 全局网络拓扑、代价在每一个节点中都保持
    • 路由计算采用Dijkstra算法
  • OSPF通告信息中携带:每一个邻居路由器一个表项
  • 通告信息会传遍AS全部(通过泛洪)
    • 在IP数据报上直接传送OSPF报文(而不是通过UDP和TCP)
  • IS-IS路由协议:几乎和OSPF一样

OSPF“高级”特性(在RIP中的没有的)

  • 安全:所有的OSPF报文都是经过认证的(防止恶意的攻击)
  • 允许有多个代价相同的路径存在(在RIP协议中只有一个),可以在多条路径之上做负载均衡
  • 对于每一个链路,对于不同的TOS有多重代价矩阵
    • 例如:卫星链路代价对于尽力而为的服务代价设置比较低,对实时服务代价设置的比较高
    • 支持按照不同的代价计算最优路径,如:按照时间和延迟分别计算最优路径
  • 对单播和多播的集成支持:
    • Multicast OSPF (MOSPF) 使用相同的拓扑数据库,就像在OSPF中一样
  • 在大型网络中支持层次性OSPF

层次化的OSPF路由

  • 2个级别的层次性:本地区域,骨干区域
    • 链路状态通告仅仅在本地区域Area范围内进行
    • 每一个节点拥有本地区域的拓扑信息;
      • 关于其他区域,知道去它的方向,通过区域边界路由器(最短路径)传到其他区域
  • 区域边界路由器:“汇总(聚集)”到自己区域内网络的距离,向其它区域边界路由器通告(区域边界路由器参与多个区域的计算)
  • 骨干路由器:仅仅在骨干区域内,运行OSPF路由
  • 边界路由器:连接其它的AS’s
  • 层次性的好处:每个链路状态分组仅仅在一个区域内进行泛洪

5.4 ISP之间的路由选择(外部网关协议):BGP(边界网关协议)

平面路由

  • 一个平面的路由
    • 一个网络中的所有路由器的地位一样
    • 通过LS,DV,或者其他路由算法,所有路由器都要知道其他所有路由器(子网)如何走
    • 所有路由器在一个平面
  • 平面路由的问题
    • 规模巨大的网络中,路由信息的存储、传输和计算代价巨大
      • DV:距离矢量很大,且不能够收敛
      • LS:几百万个节点的LS分组的泛洪传输,存储以及最短路径算法的计算
    • 管理问题:
      • 不同的网络所有者希望按照自己的方式管理网络
      • 希望对外隐藏自己网络的细节
      • 当然,还希望和其它网络互联
  • 所以需要层次化路由!

层次路由

  • 层次路由:将互联网分成一个个AS(路由器区域)
    • 某个区域内的路由器集合,自治系统“autonomous systems”(AS)
    • 一个AS用AS Number(ASN)唯一标示
    • 一个ISP可能包括1个或者多个AS
  • 路由变成了:2个层次路由:自治区域内+自治区域间
    • AS内部路由:在同一个AS内路由器运行相同的路由协议
      • “intra-AS” routing protocol:内部网关协议
      • 不同的AS可能运行着不同的内部网关协议(私有)
      • 能够解决规模和管理问题
      • 如:RIP, OSPF, IGRP
      • 网关路由器:AS边缘路由器,可以连接到其他AS
    • AS间运行AS间路由协议(每个自治区域只表现为一个点)
      • “inter-AS” routing protocol:外部网关协议
      • 解决AS之间的路由问题,完成AS之间的互联互通

层次路由的优点

  • 解决了规模问题
    • 内部网关协议解决:AS内部数量有限的路由器相互到达的问题,AS内部规模可控
      • 如AS节点太多,可分割AS,使得AS内部的节点数量有限
    • AS之间的路由的规模问题
      • 增加一个AS,对于AS之间的路由从总体上来说,只是增加了一个节点=子网(每个AS可以用一个点来表示)
      • 对于其他AS来说只是增加了一个表项,就是这个新增的AS如何走的问题
      • 扩展性强:规模增大,性能不会减得太多
  • 解决了管理问题
    • 各个AS可以运行不同的内部网关协议(私有)
    • 可以使自己网络的细节不向外透露(安全)

互联网AS间路由:BGP

  • BGP (Border Gateway Protocol):自治区域间路由协议“事实上的”标准(非某机构制定,而是大家约定俗成)

    • “将互联网各个AS粘在一起的胶水”
  • BGP 提供给每个AS以以下方法:

    • eBGP:从相邻的ASes那里获得子网可达信息

    • iBGP:将获得的子网可达信息传遍到AS内部的所有路由器

    • 根据子网可达信息和策略来决定到达子网的“好”路径

    • 注:eBGP, iBGP 连接

  • 允许子网向互联网其他网络通告“我在这里”

  • 基于改进后的距离矢量算法(路径矢量)

    • 不仅仅是距离矢量,还包括到达各个目标网络的详细路径(AS序号的列表)能够避免简单DV算法的路由环路问题和无穷式的计算迭代

BGP基础

  • BGP会话:2个BGP路由器(“peers”)在一个半永久的TCP连接上交换BGP报文:
    • 通告向不同目标子网前缀的“路径”(BGP是一个“路径矢量”协议)
  • 当AS3网关路由器3a向AS2的网关路由器2c通告路径:AS3,X
    • 3a参与AS内路由运算,知道本AS所有子网X信息
    • 语义上:AS3向AS2承诺,它可以向子网X转发数据报
    • 3a是2c关于X的下一跳(next hop)

路径的属性 & BGP路由

  • 当通告一个子网前缀时,通告包括 BGP 属性
    • prefix + attributes = “route”
  • 2个重要的属性:
    • AS-PATH:前缀的通告所经过的AS列表: AS 67 AS 17
      • 检测环路;多路径选择
      • 在向其它AS转发时,需要将自己的AS号加在路径上
    • NEXT-HOP:从当前AS到下一跳AS有多个链路,在NETX-HOP属性中,告诉对方通过那个I转发。
    • 其它属性:路由偏好指标,如何被插入的属性
  • 基于策略的路由:
    • 当一个网关路由器接收到了一个路由通告,使用输入策略来接受或过滤(accept/decline)
      • 过滤原因例1:不想经过某个AS,转发某些前缀的分组
      • 过滤原因例2:已经有了一条往某前缀的偏好路径
    • 策略也决定了是否向它别的邻居通告收到的这个路由信息

BGP 路径通告例子:

  • 路由器AS2.2c从AS3.3a接收到的AS3,X路由通告(通过eBGP)
  • 基于AS2的输入策略,AS2.2c决定接收AS3,X的通告,而且通过iBGP)向AS2的所有路由器进行通告
  • 基于AS2的策略,AS2路由器2a通过eBGP向AS1.1c路由器通告AS2,AS3,X 路由信息
    • 路径上加上了AS2自己作为AS序列的一跳

- 网关路由器可能获取有关一个子网X的多条路径,从多个eBGP会话上: - AS1网关路由器1c从2a学习到路径:AS2,AS3,X - AS1网关路由器1c从3a处学习到路径AS3,X - 基于策略(对路径进行打分,考虑政治上、经济上等),AS1路由器1c选择了路径:AS3,X,而且通过iBGP告诉所有AS1内部的路由器

BGP报文

  • 使用TCP协议交换BGP报文。
  • BGP 报文:
    • OPEN:打开TCP连接,认证发送方
    • UPDATE:通告新路径(或者撤销原路径)
    • KEEPALIVE:在没有更新时保持连接,也用于对OPEN 请求确认NOTIFICATION:报告以前消息的错误,也用来关闭连接

关于其他自治区域的可达信息,是由内部网关运算和外部网关运算协议的结果共同决定的。首先由外部网关协议规划到目标子网的路径,然后信息传输进入各子网内部后由内部网关协议决定出入口如何走

BGP 路径选择

  • 路由器可能获得一个网络前缀的多个路径,路由器必须进行路径的选择,路由选择可以基于:
    • 本地偏好值属性:偏好策略决定
    • 最短AS-PATH:AS的跳数
    • 最近的NEXT-HOP路由器:热土豆路由
    • 附加的判据:使用BGP标示
  • 一个前缀对应着多种路径,采用消除规则直到留下一条路径

热土豆路由

  • 假设2d通过iBGP获知,它可以通过2a或者2c到达X
  • 热土豆策略(“赶紧甩掉烫手的山芋”):选择具备最小内部区域代价的网关作为往X的出口(如:2d选择2a,即使往X可能有比较多的AS跳数):不要操心域间的代价!

为什么内部网关协议和外部网关协议如此不同?(内部网关协议更关注性能,外部网关协议更关注策略)

  • 策略:
    • Inter-AS:管理员需要控制通信路径,谁在使用它的网络进行数据传输;
    • Intra-AS:一个管理者,所以无需策略;
      • AS内部的各子网的主机尽可能地利用资源进行快速路由
  • 规模:
    • AS间路由必须考虑规模问题,以便支持全网的数据转发
    • AS内部路由规模不是一个大的问题
      • 如果AS太大,可将此AS分成小的AS;规模可控
      • AS之间只不过多了一个点而已
      • 或者AS内部路由支持层次性,层次性路由节约了表空间,降低了更新的数据流量
  • 性能:
    • Intra-AS:关注性能
    • Inter-AS:策略可能比性能更重要

5.5 SDN控制平面

前面关注了控制平面的传统方式,现在聚焦于SDN方式。

OpenFlow:控制器<-->交换机报文

  • 一些关键的控制器到交换机的报文
    • 特性:控制器查询交换机特性,交换机应答
    • 配置:交换机查询/设置交换机的配置参数
    • 修改状态:增加删除修改OpenFlow表中的流表
    • packet-out:控制器可以将分组通过特定的端口发出
  • 一些关键的交换机到控制器的报文
    • 分组进入:将分组(和它的控制)传给控制器,见来自控制器的packet-out报文
    • 流移除:在交换机上删除流表项
    • 端口状态:通告控制器端口的变化

幸运的是,网络管理员不需要直接通过创建/发送流表来编程交换机,而是采用在控制器上的app自动运算和配置

OpenDaylight (ODL) 控制器

  • ODL Lithium 控制器
  • 网络应用可以在SDN控制内或者外面
  • 服务抽象层SAL:和内部以及外部的应用以及服务进行交互

ONOS 控制器

  • 控制应用和控制器分离(应用app在控制器外部)
  • 意图框架:服务的高级规范:描述什么而不是如何
  • 相当多的重点聚焦在分布式核心上,以提高服务的可靠性,性能的可扩展性

SDN:面临的挑战

  • 强化控制平面:可信、可靠、性能可扩展性、安全的分布式系统
    • 对于失效的鲁棒性:利用为控制平面可靠分布式系统的强大理论
    • 可信任,安全:从开始就进行铸造
  • 网络、协议满足特殊任务的需求
    • e.g., 实时性,超高可靠性、超高安全性
  • 互联网络范围内的扩展性
    • 而不是仅仅在一个AS的内部部署,全网部署

5.6 总结

  • 网络层控制平面的方法
    • 每个路由器控制(传统方法)
    • 逻辑上集中的控制(software defined networking)
  • 传统路由选择算法
    • 在互联网上的实现:RIP, OSPF, BGP
  • SDN控制器
    • 实际中的实现:ODL, ONOS
  • Internet Control Message Protocol
  • 网络管理和SNMP协议