少女祈祷中...

本文主要参考自EagleBear2002的博客

路由协议

1、 RIP协议

RIPv1

一种内部网关协议(interior gateway protocol),向每个邻居路由器广播路由表,默认间隔30秒,最初在RFC-1058中定义

  • 使用跳数作为度量标准(每经过一个路由器就+1),最大为15(达到16时相当于不可达)
  • 能够在多达6个等价路径上达到负载平衡,默认为4个。

**负载平衡:**尽可能将网络流平均分发到多个节点,需要满足各个路径跳数相同。

限制:

  • 不支持VLSM或CIDR(因为不会在更新中发送子网信息)
  • 不支持身份验证(只要接入网络就可以启动RIP并获取到整个网路的拓扑)

RIPv2

是RIPV1的改进版本,新增以下功能:

  • 使用跳数指标的距离向量协议
  • 使用抑制计时器(holddown timers)、水平分割(split horizon)、防止路由循环,默认180秒(交换时间的6倍)
  • 使用16跳表示无限距离

V1和V2的区别

  • 支持有类路由(可以携带子网掩码)
  • 使用组播地址进行发送广播,给特定接收方接收
  • 需要身份认证决定是否继续进行接收

2、OSPF协议

开放最短路径优先协议

  • 基于开放标准的链路状态协议(对比RIP使用的是距离向量协议
  • 定义在RFC-2328中(已经不是最新的了,)
  • 首选的 IGP 协议,因为具有可伸缩性,与RIP相比优势较大

路由信息

  • 链路状态表示的是对接口的描述以及与相邻路由器的关系
  • 集合形成一个链路状态数据库(link-state database),或者拓扑数据库(topological database)
  • 使用最短路径优先算法Dijkstra shortest path first (SPF),选择最佳路径并放在路由表中

OSPF与RIP的差别

OSPF:用于大型网络,基于带宽,可以将网络分成不同区域(area),支持VLSM,支持多路负载平衡

OSPF特征

  • 更健壮,更具有可扩展性
  • 可以将大的网络分成多个area,每个area只和 area 0 相连,保证 area 没有回路
  • 层次最多只要两个

OSPF术语

  • 连接(Link):两个设备之间的物理链路
  • 链路状态(Link-State):物理链路的信息,包括路由器连接关系、通过什么接口、链路带宽、网络类型(点对点、多路复用)等
  • 代价/费用(cost)不同网络链路理的时候的代价,和链路带宽相关,成反比关系,一般是固定值除以带宽
  • 区域(area):有相同区域号的网段和端口,一个区域内的路由器有相同的链路状态(注意是一个端口指定一个area)
  • 自治系统(As):多个area形成一个自治系统
  • Neighbours必须在一个Area中,它们之间交换拓扑数据库,当中存的是链路状态
  • 一个area中获得全部 Link-State 后计算 Tree,生成表。

路由器中有三种数据库:相邻路由器数据库(存储相邻路由器)、拓扑数据库(存储所有路由器)、路由表(存储最佳路由)

  • 指定路由器(DR):被选举出来,代表区域中的所有路由器
  • 备用指定路由器(BDR):如果 DR 损坏,BDR 立即成为 DR,目的是提高交换效率。

一个区域有且仅有一个DR和BDR

OSPF域

一个域由32位组成,可以写作IP或十进制数的格式(Area 0 或Area 0.0.0.0)

  • area 0表示主干区域
  • 使用两级分层模型,多区域OSPF中所有区域都必须连接到主干区域0(且只与Area0相连)

OSPF行为:

OSPF的操作包含5个步骤:

  • 建立邻接关系
  • 选择DR和BDR(多路复用中使用)
  • 发现路线
  • 选择合适的路线
  • 维护路由信息

OSPF七个状态:

  • 初始化(Init)
  • 双向操作(2Way)
  • 预先启动(Ex Start)
  • 交换(Exchange)
  • 加载(Loading)
  • 完成(Full)

最短路径算法SPF:

  • 使用某个节点作为起点,检查相邻节点来计算无环拓扑(就是数据结构中的算法)

DR和BDR

OSPF网路类型

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

DR选举仅用于多路复用的网络(BMA\NBMA),例如BMA(以太网、Token Ring、FDDI),以及NBMA(Frame Relay,X25,SMDS),对于点对点或点对多则不使用(PPP,HDLC、管理员配置等)

为什么要选择DR/BDR?

  • 减少节点之间的连接。如果由5个路由器,不使用DR/BDR就要建立4*5/2 = 10个连接。而使用之后则只需要建立5-1 = 4个连接
  • DR可以作为一个“中转”来进行链路状态更新,区域内的其他路由器都可以连接到DR。

OSPF报文

一共有五种报文:

  • Hello问候报文:用于发现和维持邻站的可达性
  • Database Description数据库描述报文(DBD):向邻站给出自己的链路状态摘要信息
  • Link-State Request链路状态请求报文(LSR):向对方请求发送某些链路状态项目的详细信息
  • Link-State Update链路状态更新报文(LSU):用泛洪法对全网更新链路状态
  • Link-State Acknowledgement链路状态确认报文(LSAck):对链路更新分组的确认

OSPF一些机制

1、Hello协议:当路由器打开OSPF进程时每隔一段时间就会发送,使用IP地址为224.0.0.5,默认每10秒发送一次(连接到NBMA网段上的则是每30秒发送一次)Hello 几乎是空报文,用于确认邻站的可达性。

Hello的Type字段为1

2、DR、BDR选举
选择DR标准:

  • 首先把优先级(priority)作为标准。优先级越高,权重越高。当优先级相同时把RouterID作为标准。RouterID越高,权重越高。
  • 优先级:范围在1-255之间,默认值为1.如果优先级为0则不参与DR选举
  • RouterID:如果有环回接口(lo0等端口),就将该端口IP作为RouterID;否则就将物理接口上的最高IP作为RouterID(必须是活跃接口)(注意:环回接口只要你配置了,并且路由器是开的,那么环回接口就一直是active的)
  • 在以上标准下,DR选择的是权重最高的,BDR是权重第二高的。

3、信息交换发现路线
以路由器A与路由器B为例:

  • 首先在最初都处于Down状态,A需要发送hello报文,让B收到。
  • hello报文的TTL为1,因此不会跨路由器传播,收到即丢弃
  • 收到后,B也会发送Hello报文,然后A收到后进入Two Way 状态

  • 准备交换数据库(Exstart Starts)。首先选出RouterID高的一方,发送自己的数据库描述DBD报文,另一方接收处理,同时自己也发送自己的DBD报文

  • 交换完成后,分别检查自己有没有全部的信息
  • 如果有完整的信息则发送LSAck链路状态确认报文
  • 如果缺失了部分信息,那么发送LSR链路状态请求报文,然后等待对方发送LSU链路状态更新报文,收到后也发生LSAck
  • 完成之后就进入了Full State状态

OSPF总体流程

五大步骤(上文提过):

  • 建立邻接关系
  • 选择DR和BDR(多路复用中使用)
  • 发现路线
  • 选择合适的路线
  • 维护路由信息

1、建立邻接关系

关键词:Hello数据包

  • 初始处于down状态
  • 然后进入Init状态,路由器每隔一段时间发送Hello数据包,如果邻居发现了就将邻居添加到自己的邻居数据库。
  • 然后根据不同条件判断是否进入第二步:如果多路复用,并且DR/BDR字段未被占用(当前网络尚未存在DR/BDR),就进入Two-Way状态并进入第二步;否则(是点对点或点对多网络,或者DR/BDR字段已被占用)就跳过步骤2,直接进入步骤3

2、选举DR和BDR

进入Exstart状态,并使用之前讲过的DR/BDR选举的方式来选举DR/BDR

  • 注意:已经确定的DR和BDR是不会更改的,就算有新的优先级更高的路由器加入。除非原有的DR失败(故障)

3、发现路线

这一步需要从Exstart状态转换到Full状态。

  • 首先进入Exchange状态,开始交换数据库,按照上文讲过的方法
  • 然后进入LoadingState状态,开始补充各自缺失的信息,还是上文提过的方法。
  • 交换完成就进入了Full State状态

4、选择适当的路线

网络上所有其他路由器需要并行计算出最小生成树,使用SPF算法

  • 计算前提是所有路由器拥有相同的链路状态数据库
  • OSPF在计算完后在路由表中安装成本最低的路径,最多将安装 4 条等价路径以进行负载共享

5、维护路由信息

进行常规的Hello交换来检测邻居的状态,可达性

  • 网络类型不同时,Hello数据包的发送间隔也不同(速度为T1(1.544Mbps)使用10秒间隔;小于T1则使用30秒间隔)

6、链路状态出现变化

  • 假如A的链路发生了变化,那么A就使用224.0.0.6告知其他路由器的DR
  • DR收到后,使用224.0.0.5告知其他所有其他路由器
  • 如果路由器B连接到了其他area,则继续进行交换
  • 信息交换完毕后就更新路由表

OSPF配置

1、启动OSPF:router ospf [process-id]

  • process-id表示
  • 通常在整个 AS(自治系统)中保持相同的进程 ID(虽然不同应该影响不大)

2、识别IP网络并将网段纳入OSPF中:network [address] [wildcardmask] area [area-id]

  • area即区分了主干区域与其他区域
  • wildcardmask与子网掩码相反,为0表示如果IP想要符合要求,每一位必须与属于这个address中对应的位相等,为1的为表示不考虑这位(这位任意都可)

3、配置环回地址:interface [loopback number]

  • 环回接口比如lo0,它会决定主从关系并涉及到DR的选举
  • 需要使用32位子网掩码
  • 配置时(也就是输入完这段命令后)自动启动并生效,无需no shutdown

4、修改OSPF优先级:ip ospf priority [number]

  • 优先级为0表示不参与选举
  • 查看OSPF端口使用命令show ip ospf [interface type number]

5、修改ospf路径costip ospf cost [number]

  • 在config-if模式下输入
  • number在1-65535之间
  • 连接到相同链路上的接口必须拥有相同的cost,不然这条链路会被视为关闭
  • 思科路由器默认serial链路(串行链路)的成本为1784
  • 如果一个链路比默认速度更低,你需要将其重新设置为它真实的速度,使用命令:bandwidth [number](单位Kbps)

6、设置OSPF计时器

  • OSPF区域中的所有路由器必须拥有相同的Hello间隔和死间隔(具体数值看上文)
    命令:ip ospf hello-interval [seconds]

    ip ospf dead-interval [seconds]