一、OSPF介绍与特性
OSPF(open shortest path first,开放最短路径优先),属于动态路由协议中的链路状态协议。何谓“链路状态”?链路指的是接口,状态指的是邻居接口之间的关系
OSPF的AD=110,基于IP协议(即OSPF封装在IP协议中),协议号89(即在IP数据包的protocol会填写89)
特点:
- 无路由环路
- 每台路由拥有完整的网络拓扑
- 采用SPF算法计算最短路径
- OSPF数据包封装在IP数据包中
- AD值为110
- 适合中大型网络
二、OSPF基础知识
1.cost计算
cost计算我这里分为了两种:
1)单个接口cost计算
单个接口cost一般计算公式为= (100*1000K)/接口带宽
其中接口带宽的单位是Kbit/sec,但是如果路由器接口带宽是超过100000Kbit/sec,那么单个接口cost计算结果一般小于或等于1,等于1还好,小于1的话怎么办?规定小于1的cost计算结果统一为1
2)路由的cost计算
路由的cost计算都是基于单个接口cost计算得出的,路由的cost计算的基础就是某路由学习到A路由,那么A路由从目的路由器传递过来这一路上经过的每个路由器的入接口cost累计和
2.组播地址
OSPF数据包的交互依赖组播地址224.0.0.5和224.0.0.6,其中224.0.0.5这个组播地址是所有启用OSPF的路由器所共同监听的,而224.0.0.6在broadcast网络类型中是DR和BDR监听的。
注意在broadcast网络类型中,OSPF邻居建立完成后,DRothers都只和DR和BDR建立FULL关系,DRothers之间建立TWO-WAY关系。这里的关系也就是我们前面所说的“链路状态”中的状态。继续说,LSA泛洪完毕,如果此时某条链路断开则产生LSU和LSACK,假设DRothers_A下的链路断开,那么他会向224.0.0.6发送LSU(需要实验)
3.OSPF计时器
OSPF最重要的4个计时器,就是hello time、dead time、LSA刷新时间、LSA最大老化时间
- hello time:该字段位于hello包中,默认设定时间为10s,启用OSPF的路由器接口将每10s发送一次hello包
- dead time:该字段位于hello包中,默认设定时间为40s,在接口每次收到hello包之后,dead time重置,如果dead time倒计时为0时,仍然没有收到hello包,那么宣告该邻居失效
- LSA刷新时间:为了保证每台路由器的LSA信息完整和有效,每隔30min将会执行LSDB泛洪,且每条LSA序列号 + 1,同时重置LSA age
- LSA最大老化时间:当收到LSA时,重置LSA age时间,如果超过LSA age(即2*LSA刷新时间),那么LSA就会被从LSDB中删除。
4.接口优先级
OSPF的接口优先级是用在broadcast网络类型中用于选举DR和BDR,接口优先级很容易懂,接口越“优先”(即优先级值越大),那么就越有可能成为老大/老二(即DR/BDR)。但是注意接口优先级值如果是0,那么表示该接口不参与broadcast网络类型的DR/BDR选举
5.router-id
OSPF网络的router-id用于唯一标识OSPF域的路由器。同时也用于broadcast网络类型中用于选举DR和BDR。如果你没有修改OSPF域路由器的接口优先级,那么按照默认接口优先级都是相同的,但是仍需要选举出DR/BDR,所以需要另一个参数来比较,这个参数必须不能再相同,如果再相同也是不能比较并选举出DR/BDR的。如果你没有手动配置router-id,那么思科路由器的router-id自动选择是如果有loopback接口地址,那么使用最大的loopback接口地址为router-id,如果没有则选举出活跃物理接口中最大的接口IP地址为router-id
6.DR与BDR选举
现在我们讲到前两个参数相关的DR和BDR选举了,DR/BDR选举只能在broadcast网络类型中选举。
为什么broadcast网络类型需要DR和BDR选举?
因为需要精简OSPF邻居数量,以减少OSPF数据包的交互和简化邻居关系。
什么是DR、BDR、DRothers?
- DR是design router,即指定路由器
- BDR是backup design router,即备份指定路由器
- DRothers是其他路由器
DR和BDR选举流程:同一个broadcast网络中的路由器发送hello报文,建立邻居后,开始先选举BDR,然后如果broadcast网络中没有DR,那么BDR成为DR,重新选举BDR。BDR/DR选举原则就是先比较邻居发送的hello包中的priority,大的成为BDR,如果hello包中的priority一致(一般都是一致的为1,因为一般不改priority,除非你不想让某台路由器的某个接口参加DR/BDR选举),那么根据hello数据包的ospf header中的router-id进行比较,大的成为BDR。这样选举出broadcast网络中的DR/BDR。剩下的不是DR和BDR的路由器接口就是DRothers。
值得注意的是DR和BDR选举完后,如果你想修改DRothers的priority为最大也是没有效果的,即DR/BDR非抢占原则。
7.序列号
OSPF两个序列号:
- DD seq
- LSA seq
1) DD seq
DD序列号是用于确定DBD交互时master和slave的同步,该字段位于DBD报文中
2) LSA seq
LSA序列号用于比较LSA的新和旧,该字段位于每个LSA中(一般完整LSA位于LSU和LSACK中)。LSA序列号长度为4字节,OSPF每隔30min泛洪LSA,以保持每一条LSA的有效性和LSDB同步。每次泛洪LSA都会将LSDB中的LSA的序列号 + 1,如果超过LSA age,那么LSA就会被删除
三、OSPF基本原理与实现
1.OSPF数据包
1)OSPF header
OSPF数据包 = OSPF header(24字节) + OSPF data
OSPF data带着是5种不同的OSPF数据包类型,比如hello、DBD、LSR、LSU、LSACK。而5种不同的OSPF数据包有着相同的OSPF header。那么先介绍OSPF header,然后在下个小节中介绍5种OSPF data

- 版本:IPV4使用的OSPFv2、IPV6使用的是OSPFv3
- 类型:5种OSPF数据包类型(hello、DBD、LSR、LSU、LSACK)
- 总长度:ospf header + ospf data
- router-id:即OSPF路由器的router-id
- area-id:OSPF接口所处的OSPF区域,如果是虚链路这里会填写0.0.0.0,因为虚链路被认为是骨干的一部分
- 认证类型:如果OSPF链路两端配置了认证,才会有下面的认证*字段
- 数据部分:这里就需要根据OSPF数据包类型来决定了
其中影响邻居建立的字段是area-id、认证
2)OSPF数据包类型
简单了解下5种OSPF数据包类型

hello
作用:用于建立和保活OSPF邻居,其中部分字段会影响OSPF邻居的建立,比如area-id、网络掩码、认证、hello-time、dead-time

- 网络掩码:指发送数据包的接口的网络掩码,网络掩码影响OSPF邻居建立
- hello time:指接口发送hello包的间隔时间,hello time影响OSPF邻居建立
- 可选项:见可选项
- priority:接口的优先级
- dead time:指接收到hello包的最大时间,如果在该时间段内没有收到hello包,那么就会将邻居断开
- DR:指broadcast网络上的DR接口IP地址
- BDR:指broadcast网络上的BDR接口IP地址
- 邻居:在dead time时间内建立的邻居router-id列表
tips:
- 如果接口网络掩码不同,那么DR无法用2类LSA描述你这台路由器,所以会影响OSPF邻居建立
- 如果接口网络类型为P2P,同时接口网络掩码不同,尽管邻居可以建立,但是路由无法加表!
DBD
作用:DBD报文用于正在建立的邻居关系

- 接口MTU:指定接口所允许的MTU大小
- 可选项:见可选项
- I M MS:
-
- I:如果I位=1,那么表示该DBD包是第一个DBD包
-
- M:如果M位=1,那么表示该DBD包不是最后一个
-
- MS:如果MS=1,表示发送该DBD包的是master,如果MS=0,表示发送该DBD包的是slave
- DD序列号:在LSDB同步过程中,需要确保路由器能够收到完整的DBD序列,由master指定,后续DD seq依次增加
- LSA首部:列出始发路由器的LSDB中的部分或全部LSA首部
LSR
作用:收到DBD后,对比本地LSDB中的LSA,如果有感兴趣的LSA,本路由器会使用LSR封装感兴趣的LSA首部进入数据部分中发送到链路上

- LSA type:1类LSA-7类LSA(除6类LSA)
- link state id:根据LSA type变化而变化,具体见LSA详解中每种LSA的link state id
- advertising router:是指始发LSA通告的路由器的router-id
LSU
作用:LSU是用于完整LSA信息的泛洪扩散和发送LSA去响应LSR的。OSPF数据包是不能离开发起他们的网络的,因此一个LSU可以携带一个或多个完整的LSA,但是这些LSA只能传送到始发路由器的直连邻居。接收LSA的邻居路由器将负责在新的LSU中重新封装相关的LSA,从而进一步泛洪扩散到自己的邻居

- LSA数目:记录该LSU中携带了多少个LSA
- LSA:会有多个LSA,LSA中不仅有LSA首部,会有更加详细的LSA信息,见LSA详解
LSACK
为什么需要LSACK?因为OSPF基于IP协议,而根据IP协议的首部字段得知IP协议不可靠,为了保证OSPF的数据包可靠交互,需要增加该数据包
LSACK的内容就是LSA首部