EagleBear2002 的博客

这里必须根绝一切犹豫,这里任何怯懦都无济于事

互联网计算-08-路由协议

本文主要内容来自 SpriCoder的博客,更换了更清晰的图片并对原文的疏漏做了补充和修正。

RIP 协议

RIPv1

RIPv1 被认为是一种内部网关协议

  1. RIPv1 是一种距离向量协议,它以预定间隔将其整个路由表广播到每个邻居路由器。默认间隔为30 秒
  2. RIP 使用跳数作为度量标准,最大跳数为15,达到 16 跳的报文自动抛弃。

RIPv1 能够在多达六个等价路径上进行负载平衡(Load Balancing),默认情况下为四个路径,最多 6 个,跳数相同才能完成负载均衡,跳数不同不满足条件。

RIP 最初是在 RFC 1058 中指定的。RIPv1 具有以下限制:

  1. 它不会在其更新中发送子网掩码信息:意味着必须用同样的子网掩码,不支持 VLSM 或无类域间路由(CIDR)。
  2. 它以 255.255.255.255 的广播形式发送更新:只能发给邻居,不能通过路由器转发。
  3. 它不支持身份验证(authentication):只要启动 RIP 就可以接受到信息,也就意味着只要接入网络并且启动 RIP 进程,就可以了解到整个网络拓扑

RIP 配置

router rip 命令选择 RIP 作为路由协议。

network 命令分配基于 NIC 的网络地址,路由器将直接连接到该网络地址。

1
2
3
4
5
router rip # 选择 RIP 路由协议
network 1.0.0.0
network 2.0.0.0
凡是属于上面的网段的端口都运行 RIP 协议
这些网段必须做到直连该路由器

上图中,A 启动 RIP 进程,A 有 4 个端口

RIPv2

RIPv2 是 RIPv1 的改进版本,并且新增了以下的功能:

  1. 这是一种使用跳数指标的距离矢量协议。
  2. 它使用抑制计时器来防止路由循环,默认值为180 秒,6 倍于交换时间
  3. 它使用水平分割(Split Horizon)来防止路由循环(Routing Loops)
  4. 它使用 16 跳作为无限距离的度量。(15 跳及以内可达)

RIPv2 的配置

network 命令导致实现以下三个功能:

  1. 路由更新从接口多播。
  2. 如果路由更新进入相同的界面,则将对其进行处理。
  3. 广播直接连接到该接口的子网。

version 2:表示启动 RIPv2,直接使用 router rip 默认为 v1,一定要输入这个命令才能启动 RIPv2

验证与故障排除

验证 RIPv2:

1
2
Router#show ip protocols #验证 RIP 配置
Router#show ip route #显示 IP 路由表

故障排除 RIPv2:

1
2
Router#debug ip rip #显示更新路由表的时候的更新
Router#undebug all #(或 no debug all):停止 debug

实例:

debug IP RIP 命令

debug ip rip 命令显示 RIP 路由更新的发送和接收。在本示例中,更新是通过 183.8.128.130 发送的

它报告了三台路由器,其中一台无法访问,因为其跳数大于 15。然后通过 183.8.128.2 广播了更新

上图是查看路由表:Codes:表示对于路由协议类型的描述

120/1:表示 1 跳到达,120/2:表示 2 跳到达

RIPv1 和 RIPv2 之间的区别

  1. 支持有类路由:可以携带子网掩码
  2. 使用组播地址进行发送广播:特定给 RIP 接受,避免了接受后发现没有启动 RIP 进程耽误时间
  3. 需要身份认证才确定是否继续进行接收

OSPF 协议

本文介绍单个区域(single-srea)OSPF 协议。

OSPF 概述

  1. 开放最短路径优先(OSPF,Open Shortest Path First)是基于开放标准(即该标准可以再扩充)的链路状态路由协议
  2. 网络工程任务组(IETF,Internet Engineering Task Force)的多个标准中对此进行了描述:最新的描述是 RFC 2328(已经不是最新的了)
  3. 与 RIPv1 和 RIPv2 相比,OSPF 正在成为首选的 IGP 协议,因为它具有可伸缩性
  4. 和 RIP 相比优势比较大,很多网络公司在研究 OSPF 的优化

路由信息

  1. 链接的状态对接口及其与其相邻路由器的关系的描述
  2. 链接状态的集合形成一个链接状态数据库,有时也称为拓扑数据库
  3. 路由器应用 Dijkstra 最短路径优先(SPF)算法来构建以自己为根的 SPF 树
  4. 路由器通过 SPF 树计算最佳路径,然后选择最佳路径并将其放置在路由表

OSPF 和 RIP 差别

OSPF:用于大型网络,基于带宽,可以分层(将网络划分成 2 层),收敛更快,支持多路负载均衡

What is the Best Path from A to B?

上面带宽大,2 跳达到,下面带宽小,1 跳到达。

OSPF 从上面走,RIP 从下面走,但是上面会快一些,因此 OSPF 选择的路径是更加优越的

OSPF 特征

OSPF 的特征克服了这些限制

  1. 更健壮
  2. 更具可扩展性(有层次性涉及,涉及的网络更大)

大型 OSPF 网络使用分层设计,分为两层

  1. 将大的网络分成多个 area,每一个 area 只和 area 0 相连,保证 area 没有回路
  2. 层次最多只有 2 个,一个 area 就是 area 0。其它 area 都需要和 area0 相连
  3. 层次维持树的关系

OSPF 术语

  • 连接(Link):两个设备之间的物理链路

  • 邻居(Neighbors):相邻的路由器
  • 链路状态(Link-State):物理链路的信息,包括路由器连接关系、通过什么接口、链路带宽、网络类型(点对点、多路复用)等,不同网络类型处理代价不同(两种网络类型:点对点,多路复用)

  • 代价/费用(Cost):不同网络链路处理的时候的代价,和链路带宽相关,成反比关系,一般是固定值除以带宽

  • 区域(Area):一个有很多路由器的端口都属于的区域(相同)

  • 自治系统(Autonomous System,AS):多个 Area 形成一个自治系统

  • Neighbours 必须在一个 Area 中,Neighbour 之间交换拓扑数据库(Topology Databases)当中存的是 link-state
  • 一个 Area 中获得全部 Link-State 后计算 Tree,生成表

  • 指定路由器(Designated Router,DR):只有在多路复用的链路下使用,被选举出来
  • 备用指定路由器(Backup Designated Router,BDR):如果 DR 坏了,再次选举会出现问题,如果 DR 损坏,BDR 立即成为 DR,目的是提高交换效率

OSPF 域

逻辑指称的 OSPF 域。

区域用 32 位数字标识,可以是 IP 格式(标准定义),也可以是一个十进制值,例如:区域 0 或区域 0.0.0.0。

区域 0:区域编号为 0 的单个区域。 area 是 OSPF 两层结构划分的单位

OSPF 使用 2 级分层模型:逻辑上必须是 2 层结构,而物理实现上可能有一定的差异,如果更多需要进行逻辑配置。

在多区域 OSPF 网络中,要求所有区域都连接到区域 0(主干)。

注意,Area 是对端口的划分,即一个路由器的不同端口可以属于不同 area。

ABR(Area Border Router):区域边界路由器,有一定的约束(一个路由器最多连接 3 个路由器)。

一个 Area 中不能有超过 50 台路由器,否则会导致 SPF 算法产生的计算量和内存过大。

OSPF 行为

OSPF 使用邻居的邻接关系(Adjacencies)来全面了解网络。

OSPF 操作包括五个步骤:

  1. 建立邻接关系
  2. 选择 DR 和 BDR(如果需要):多路复用的时候才需要
  3. 发现路线
  4. 选择适当的路线
  5. 维护路线信息

OSPF 具有七个状态,它们是:

  1. 初始化(Init)
  2. 双向操作(2Way)
  3. 预先启动(Ex Start)
  4. 交换(Exchange)
  5. 加载(Loading)
  6. 完成(Full)

最短路径算法

最短路径算法(shortest path algorithm)使用该节点作为起点并依次检查它具有的有关相邻节点的信息来计算无环拓扑

SPF:有权图->树

以 C 为根的例子:找到最短的路径。

不根据跳数来进行选择,而是根据最小权和来寻找

选择 DR 和 BDR

OSPF 网络类型

  1. 广播多路复用网络,例如以太网
  2. 点对点网络
  3. 非广播多路复用网络(NBMA,Non-broadcast multi-access)

DR & BDR

为什么要选择 DR 和 BDR?

如上图,如果不选择 DR 和 BDR 会导致每一个路由器都和其他所有路由器交流(每个有 10 个连接)。每一个节点都要建立 \(10 = (5 \times 4 / 2)\) 个链接,对于链路的复杂比较高,如果有了 DR 就只需要 \(4=n-1\) 个连接。

BDR 是 DR 的备份,其他路由器之间就不用通信了。如果有 DR 则只需要 4 条连接。DR 和 BDR 之间必然有连接。

只有多路复用的实现方式需要 DR 和 BDR

  1. 然后,每个路由器与 DR 和 BDR 形成邻接关系
  2. 对于所有 OSPF 路由器,DR 使用 224.0.0.5(自己的 IP)的主播地址向该网段上的所有其他路由器发送链接状态信息
  3. 为确保 DR/BDR 看到所有路由器在网段上发送的链接状态,使用了所有 DR/BDR 的多播地址 224.0.0.6(DR 和 BDR 之间)

多路复用中的 OSPF

  1. Giga/Fast/Ethernet,FDDI,Token Ring

  1. 几个 Area 有几个 DR 和 BDR(是在不同 Area 上)
  2. DR 和 BDR 归属于区域

OSPF 报文

  1. OSPF 只有 5 个类型的报文
Fuction Name
Hello Hello
Database Description DBD
Link-State Request LSR
Link-State Update LSU
Link-State Acknowledgement LSAck
  • DBD:LSA,发现没有发送 LSR
  • 由于传输要求比较高,所以设计了 LSAck

OSPF Hello 协议

  1. 路由器在接口上启动 OSPF 路由过程时,将发送 hello 数据包,并继续以固定的时间间隔(intervals)发送 hello。
  2. 控制(govern)OSPF hello 数据包交换的规则称为 Hello 协议
  3. Hello 数据包的地址为 224.0.0.5
  4. 默认情况下,广播多路访问和点对点网络上每 10 秒发送一次 Hello 报文
  5. 在连接到 NBMA 网络的接口(例如帧中继)上,默认时间是 30 秒
  6. 保持心跳,确定还活着。Hello 几乎是空报文,给所有跑 OSPF 的路由器发送

OSPF 报文头部

Hello 报文的 Type 字段设置为 1

哪个路由器将成为 DR?

优先级为第一关键字,Router ID 为第二关键字,最大的是 DR,第二大的是 BDR

优先级:1-255,默认值:1

如何决定 Router ID:

  1. 如果有环回端口(loopback 端口,逻辑上的端口),将该端口 IP 地址作为 Router ID,以避免一般端口宕机出现问题;环回端口需要手动配置
  2. 如果没有环回 IP 地址,则将物理接口的最高 IP 地址作为 Router ID(Active 的端口上的 IP 作为参考)
  3. 如果接口出现故障,则路由器必须重新建立邻接关系并重新转换(re-advertising)LSA

OSPF 操作的完整步骤

  • 一开始的状态是 Down State
  • 然后发送 Hello 报文(Init State)
  • B 收到 A 的报文(收到报文一定是邻居):Hello 报文的 TTL 是 1,所以不会跨路由器传播,收到即丢弃
  • 收到后,B 也会发送自己的 Hello,然后 A 收到后进入 Two Way 状态

  • 准备交换数据库(Exstart Starts)
  • 首先确认主方(发送方)、从方(接受方),保证数据有序,简单就是谁的 Router ID 高
  • Router ID 高的(主方)发送自己 DBD 报文,从方对主方发送的 DBD 接受处理并发送

  • 交换完成后,各自检查自己是不是有全部的信息
    • 如果有完整的信息,则发送 LSAck
    • 如果发现有没有的,则发送 LSR,等待 LSU(整个链路的详细信息,不是 LSA)来进行学习,之后收到完成后发送 LSAck

回顾:OSPF 操作

  1. Step 1:Set up the adjacency relationships
  2. Step 2:Elect DR and BDR(if needed)
  3. Step 3:Discover the routes
  4. Step 4:Choose appropriate routes
  5. Step 5:Maintain the route information

步骤 1:建立路由器邻接

  1. 路由器每隔一段时间发送一次 hello 数据包,Hello 报文的 TTL 是 1,表明不会跨路由传播
  2. 如果邻居被发现了:将邻居添加到邻居数据库
  3. 发现网络类型
    1. 如果是多路复用网络,进入 DR/BDR 选举过程,然后进入步骤 2
    2. 如果是点对点或点对多点网络,则不会举行 DR/BDR 选举过程,并跳过步骤 2
    3. 如果 hello 数据包标头中的 DR/BDR 字段已被占用(即 DR/BDR 对已经存在),则不会进行 DR/BDR 选举,并跳过步骤 2
  4. 如果对方的 DP/BDP 优于我的 DP/BDP,则接受对方的。

Hello Interval:如果不同不能建立关系,Hello 报文包含了 DR 信息在内的必要的参数

步骤 2:选举 DR 和 BDR

  1. 如果没有其他路由器联机,则该路由器将成为 DR。下一个要“启动”的路由器将是 BDR
  2. 如果多个路由器(两个或更多)同时联机,则
    1. 优先级最高的路由器成为 DR:优先级为零表示“从不 DR”
    2. 如果存在平局,则具有最高 Router ID 的路由器将成为 DR: Router ID 是最高的环回或接口 IP 地址
    3. 具有第二高优先级或 Router ID 的路由器成为 BDR
  3. 如果 DR 无效,则 BDR 变为 DR
  4. 然而
    1. 如果新的 OSPF 路由器以更高的优先级或 Router ID 加入网络,则当前的 DR 和 BDR 不会更改
    2. 仅当当前 DR 失败时,它才成为新的 BDR

步骤 3:发现路线

  1. 这一步从 Ex Start 状态转换到 Full 状态
  2. 路由器确定“主/从(master/slave)”关系
  3. 多路复用网络中的 DR/BDR 交换 LSA,并且所有其他 DR 将其 Type 2 DBD 发送给 DR/BDR
  4. 如有必要,路由器可以通过发送请求更多信息的 LSR 进入负载状态:所有路由器必须在“加载状态”中等待,直到完全更新请求的路由器
  5. 路由器现在进入完整状态

步骤 4:选择适当的路线

  1. 现在,将与网络上的所有其他路由器并行地计算 SPF 算法。
    1. 切记:在发生这种情况之前,所有路由器必须具有相同的链接状态数据库
    2. SPF 使用 Cost 作为指标
    3. SPF 将从其自身到目的地的每条路径的成本相加,并以路由器为根来构建树
    4. OSPF 然后在路由表中安装成本最低的路径:最多将安装 4 条等价路径以进行负载共享

步骤 5:维护路由信息

  1. 常规的 Hello 交换是 OSPF 用于检测新邻居或故障(downed)邻居的机制
  2. 根据网络的类型,Hello 数据包以不同的默认间隔发送(确定对方是不是还好)
    1. 对于速度为 T1(1.544 Mbps) 或更高的链接,每 10 秒:广播多路访问和点对点链接
    2. 对于小于 T1 的链接,每 30 秒:非广播多路访问链接
    3. “死间隔”是问候间隔的四倍。(如果在这样子对方还没有成功则对方死了)

链路状态变化出现

  • Router A tells all OSPF DRs on 224.0.0.6(组播地址)
  • Event 触发交换:比如 A 连接的网段断掉了,否则不会有影响,只在有 event 发生时才会更新
  • A 使用 LSU(linkState update)告知DR

  • DR tells others on 224.0.0.5
  • DR 通过 LSU 告知所有的路由器

  • 如果 B 连接了别的 Area,则继续进行交换

  • 所有的路由信息交换完毕后,同时更新路由表。

基本的 OSPF 配置

  1. 在路由器上启动 OSPF
    1. Router(config)## router ospf process-id
    2. 进程号:process-id
      1. 取值: 1 ~ 65535
      2. 在一台路由器上识别多个 OSPF 进程
      3. 通常在整个 AS(自治系统)中保持相同的进程 ID
  2. 在路由器上识别 IP 网络
    1. Router(config-router) ## network address wildcardmask area area-id wildcardmask 和 subnet mask 相反
    2. 网络地址可以是整个网络,子网或接口的地址。
    3. address:IP 地址

  • 只有一个 Area,则为 area0
  • Wild-card Mask 和子网掩码相反:子网掩码是 255.255.255.0,则 Wild-card Address 就是 0.0.0.255
  • 写 IP 和写网段最后都是一样的

配置回路(Loop)地址

1
2
Router(config)#interface loopback number
Router(config-if)#ip address address subnet-mask
  1. 为 OSPF 路由器 ID 添加稳定性
    1. 必须在 OSPF 进程开始之配置回环接口:会涉及到主从关系确定和 DR 的选举
    2. 配置环回地址时,请使用/32 掩码以避免潜在的路由问题
    3. I 建议您在基于 OSPF 的网络中的所有关键路由器上使用环回地址(专用或公用地址)。
    4. 一旦配置立刻生效,不需要 no shutdown 的命令即可。

配置回路地址的方式如上图,删除只需要在前面添加 no

修改 OSPF 接口优先级

  1. 操纵 DR/BDR 选举
    1. Router(config-if) ## ip ospf priority number
    2. 优先级:越大越高
      1. 值:0-255,默认为 1
      2. 优先级 0 表示接口不能被选为 DR 或 BDR
  2. 操作 OSPF 的端口的优先级:Router ## show ip ospf [interface type number]
  3. Example:

OSPF 成本 = 指标

  1. Cost 适用于所有路由器连接路径
  2. 16 位数字(1 - 65,535)
  3. 较低的 Cost->更理想
  4. 路径决定是基于路径的总成本。
  5. 指标受到带宽的影响
  6. 用一个很大的数字去除以当前的带宽得到代价,计算方法如下

OSPF 路径 COST

  1. 连接到同一链接的所有接口必须就该链接的成本达成一致。否则,该链接将被视为关闭
    1. 意味着可以手动调整优先级
    2. 串行链路的 Cisco 路由器默认成本为 1784(56Kbps 带宽):Router(config-if) ## ip ospf cost number(1-65536)
    3. 如果链路是更低速的,你必须为其确定真实的链路速度。
    4. If the line is a slower speed, you must specify the real link speed: Router(config-if) ## bandwidth number(Kbps)
    5. cost 的计算标准不同公司有不同标准
  2. 例子:
    1. 需要更改成本的常见情况是在多供应商(multi-vendor)路由环境中。成本更改将确保一个供应商的成本值与另一供应商的成本值匹配。
    2. 另一种情况是使用千兆以太网。默认成本将最低成本值 1 分配给 100 Mbps 链路。

现在的除数已经比这个要大了

设置 OSPF 计时器

  1. OSPF 区域中的所有路由器必须在相同的 hello 间隔和相同的死间隔上达成一致,默认情况下:
    1. T1 或更高链接(广播)为 10 秒
    2. 慢于 T1 的链接为 30 秒(非广播)
    3. 死亡间隔= 4 *问候间隔
  2. 更改问候间隔的命令
1
2
Router(config-if)## ip ospf hello-interval seconds
Router(config-if)## ip ospf dead-interval seconds
  1. 注意:停顿间隔将自动调整为新的 hello 间隔的四倍。(只配置了一个的时候)