# 路由选择算法

# 路由概念

  • 路由:按照某种指标找到一条从源节点到目标节点的较好路径
    • 较好路径:按照某种指标较小的路径
    • 指标:站数,延迟,费用,队列长度等
  • 以网络为单位进行路由
    • 网络为单位进行路由,路由信息传输,计算和匹配的代价低
    • 前提条件:一个网络的所有节点地址前缀相同,且物理上聚集
    • 路由就是:计算机网络到其他网络如何走的问题
  • 网络到网络的路由 = 路由器 - 路由器之间的路由
    • 网络对应的路由器到其他网络对应的路由器的路由
    • 在一个网络中,路由器 - 主机之间的通信,链路层解决
    • 到了这个路由器就是到了这个网络
  • 路由选择算法:网络层软件的一部分,完成路由功能

# 路由的原则

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

# 路由算法分类

# 全局

  • 所有的路由器拥有完整的拓扑和边的代价的信息
  • link state 算法

# 分布式

  • 路由器只知道它有物理连接关系的邻居路由器,和到相应邻居的路由器的代价值
  • 迭代的与邻居交换路由信息,计算路由信息
  • distance vector 蒜贩

# 静态

  • 路由随时间变化缓慢

# 动态

  • 路由变化快
    • 周期性更新
    • 根据链路的代价的变化而变化

# 因特网中自治系统内部的路由选择

# RIP

# 概述

  • 在 1982 年发布的 B5D-UNIX 中实现
  • 在 Distance vector 算法
    • 距离矢量:每条链路 cost=1,max hops = 15 hops(最大跳数)
    • DV 每隔 30 秒和邻居交换 DV,通告
    • 每个通告包括:最多 25 个子网

# RIP 通告(advertisements)

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

# RIP 链路失效和恢复

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

# RIP 进程处理

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

image-20221220162929246

# 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 有多重代价矩阵
  • 对单播和多播的集成支持
  • 在大型网络中支持层次性的 OSPF

# 层次化的 OSPF 路由

  • 两个级别的层次性:本地,骨干
    • 链路状态通告仅仅在本地区域 Area 范围内进行
    • 每一个节点都拥有本地区域的拓扑信息
  • 区域边界路由器:汇总(聚集)到自己的区域内的网络的距离,向其他区域边界路由器通告
  • 骨干路由器:仅仅在骨干区域内,进行 OSPF 路由
  • 边界路由器:连接其他的 AS

# ISP 之间的路由选择 BGP

# 层次路由

# 概述

  • 一个平面的路由
    • 一个网络中的所有路由器地位一样
    • 通过 LS,DV 或者其他路由算法,所有路由器都要直到其他所有路由器如何走
    • 所有路由器在一个平面
  • 平面路由问题
    • 规模巨大的网络中,路由信息的存储,传输和计算代价巨大
      • DV:距离矢量很大,且不能收敛
      • LS:几百万个节点的 LS 分组的泛红传输,存储以及最短路径算法的计算
    • 管理问题
      • 不同的网络所有者希望按照自己的方式管理网络
      • 希望对外隐藏自己网络的细节
      • 当然,还希望和其他网络互连
  • 将互联网分成一个个 AS
    • 某个区域内的路由器集合,自治系统
    • 一个 AS 用 AS Number 唯一表示
    • 一个 ISP 可能包括一个或者多个 AS
  • 路由器变成了 2 个层次路由
    • AS 内部路由:在一个 AS 内路由器运行相同的路由协议
    • AS 间运行 AS 间的路由协议

# 优点

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

# 互联网间的路由 BGP

# 概述

  • BGP:自治系统区域间路由协议
    • 连接互联网中的各个 AS
  • BGP 提供给每个 AS 的方法
    • eBGP:从相邻的 AS 哪里获得子网可达信息
    • iBGP:将获得的子网可达信息传遍 AS 内部的所有路由器
    • 根据子网可达信息和策略来决定到达子网的好路径
  • 允许子网向互联网其他网络通告我的位置
  • 基于距离矢量算法

# BGP 基础

  • BGP 会话:两个 BGP 路由器在一个半永久的 TCP 连接上交换 BGP 报文

# 路径的属性 BGP 路由

  • 当通告一个子网前缀时,通告包括 BGP 属性
  • 两个重要属性
    • AS-PATH:前缀的通告所经过的 AS 列表
      • 检测环路
      • 在向其他 AS 转发时,需要将自己的 AS 号加上
    • NEXT-PATH:从当前 AS 到下一个 AS 有多个链路,NEXT-HOP 属性中,告诉对方通过哪个 I 转发
    • 其他属性:路由偏好指标,如何被插入的属性
  • 基于策略的路由
    • 当一个网关路由接收到一个路由通告,使用输入策略来接受或过滤
    • 策略也决定了是否向它别的邻居通告收到这个路由信息

# BGP 报文

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

# SDN 控制平面

# 概述

  • SDN 方式:逻辑上集中的控制平面
  • 一个不同的控制器与本地控制代理交互

# 为什么需要在逻辑上集中的控制平面

  • 网络管理更加容易:避免路由器的错误配置,对于通信流的弹性更好
  • 基于流表的转发,允许可编程的路由器
  • 控制平面的开放实现

# OpenFlow 协议

  • 控制器和 SDN 交换机交换的协议
  • 采用 TCP 来交换报文
  • 三种 OpenFlow 报文类型

# OpenFlow 控制器交换机报文

  • 特性:控制器查询交换机特性,交换机应答
  • 配置:交换机查询 / 设置交换机的配置参数
  • 修改状态:增加删除修改 OpenFlow 表中的流表
  • packet-out:控制器可以将分组通过特定的端口发出

# OpenFlow 交换机到控制器的报文

  • 分组进入:将分组(和它的控制)传给控制器,见来自控制器的 pcaket-out 报文
  • 流移除:在交换机上删除流表项
  • 端口状态:通告控制器端口的变化