路由算法之链路状态路由算法LS

把我与谁连接告诉所有的路由器,那么所有的路由器就都具有了一幅网络图 由这副图计算每条具体的路径 

所以实现的关键在于

链路状态信息的可靠分发

根据链路状态信息计算路由

步骤

  1. 发现邻接点, 获得邻居的网络地址.
  • 每一个点对点链路发送 HELLO 分组
  • 邻居返回响应
  • 多个路由器通过LAN连接,路有器的一个端口有多个邻居,如何抽象?
    • 把 LAN 当做一个节点 LAN上指定的一个路由器来运行路由协议 
  1. 测量到每一个邻居的代价
  • 发送一个 ECHO 分组,邻居迅速返回响应
  • 测量往返时间, / 2即是到邻居的延迟
  • 多测几次取平均值 
  1. 构造链路状态分组(邻居信息)
  • LSP (Link-State Packet,链路状态分组)
    • 和路由计算相关的项
      • 产生 LSP节点的ID
      • 直接相连的邻居列表
      • 到每个邻居的代价
    • 和可靠性相关的项
      • 序号( sequence number),区分新旧消息
      • 年龄 ( age) 
  • 更新
    • 计时器超时 通常几十分钟  
    • 网络变化时
      • 直接连接的链路断开 可以用链路层协议检测
      • 直接连接的邻居下线 通过定期发送 “hello” 检测
  1. 分发链路状态包(发送给所有其它路由器).
  • 目的:保证所有参加路由的节点得到其它所有节点的链路状态信息的一个拷贝
  • 方法:可靠泛洪(Reliable Flooding)
    • 将 LSP发送到所有直接相连的链路  
    • 收到 LSP 的节点将它转发到所有其它链路
      • 存储每个节点的最新 LSP
      • 向所有相邻节点转发每个LSP,但不发送给发来该LSP的节点
    • 相邻路由器之间有确认和重传的机制 
  • 控制泛洪规模
    • Packet: 包含一个序号 保证拥有最新 copy
      • 序号存在的问题 
        • 问题1:序号回转 解决:使用大的序号空间,如32bit
        • 问题2:一个路由器崩溃了, 将丢失所有序号记录,恢复后从0开始 ,将会拒绝正常分组
        • 问题3:序号本身被破坏
      • 解决
        • 增加 age域 (TTL) 每经过一个路由器,age递减 Age=0,抛弃 
    • Router: 记录见过的分组 ( router, sequence number )  
      • 如果 LSP 是 duplicate , 就丢弃
        • Duplicate: LSP序号 is lower  
      • 当一个 LSP 到来时, it wait a short while, 而不是立即转发 
        • 当一个 LSP 到来, 先放到一个保留区等一会 有新 LSP 到来, 比较序号
          • 相等,是重复分组,不再转发
          • 不同 ,比较年龄,丢弃旧的分组
  1. 计算到每个节点的最短路径

优缺点

优点

没有慢收敛问题,对坏消息响应迅速

代价

存储空间开销 存储所有的链路状态分组

CPU 开销 任何拓扑变化都要重新计算最小代价树 

比较

和 DV对比,都要交流信息

  • DV(距离向量)
    • Who:   邻居
    • What:距离向量,可能有不确定(道听途说)的消息
    • 使用最短路径优先算法,算法复杂度为O(n^2) n个结点(不包括源结点),需要n*(n+1)/2 次比较 使用更有效的实现方法,算法复杂度可以达到O(nlogn) 可能存在路由振荡(oscillations)
    • 结点会广播错误的链路开销 每个结点只计算自己的路由表
  • LS(链路状态)
    • Who:  所有路由器
    • What :LSP,仅通告确定的消息 
    • 收敛时间不定 可能会出现路由循环 
    • 结点会广播错误的路径开销 每个结点的路由表被别的结点使用,错误会传播到全网
上一篇:如何在 VSCODE 中高效使用 R 语言 (图文详解)


下一篇:数据结构算法——1069. 二叉树路径和(先占个坑 后面再处理输入问题