IERS-OSPF基本工作原理
一、邻居建立建立过程
1、Router ID
用于在自治系统中唯一标识一台运行OSPF的路由器,每台运行OSPF的路由器都有一个ROUTER ID
Route ID 是一个32位的无符号的整数,其格式和IP地址是一样的,Route iD 的选举规则如下:
1)、手动配置OSPF路由器的Router ID通常建议手配置
2)、如果没有手动配置Router ID,则路由器使用LoopBack接口中最大的IP地址作为Router ID;
3)、如果没有配置loopback 接口,则路由器使用物理接口中最大的ip地址作为route id
OSPF的路由器Router ID重新配置后,可以通过重置OSPF进程来更新router id;
2、发现并建立邻居-hello报文
2.1、hello报文的作用
邻居发现:自动发现邻居路由器
邻居建立:完成Hello报文中的参数协商,建立邻居关系
邻居保持:通过keepalive机制,检测邻居运行状态
2.2、OSPF邻居建立过程
邻居建立过程:
1)、现在RTA和RTB的router id 分别为1.1.1.1 和2.2.2.2 ,当RTA启动OSPF后,RTA会发送第一个hello报文,此报文中邻居列表为空,此时状态为down,RTB收到RTA的这个hello报文,状态置为init.
2)、RTB发送发送hellor报文,此报文中邻居列表为空,RTA收到RTB的hello报文,状态置为init.
3)、RTB向RTA发送邻居列表为1.1.1.1的hello报文,RTA在收到的hello报文邻居列表中发现自己的router id ,状态置为2-way。
4)、RTA向RTB发送邻居列表为2.2.2.2的hello报文,RTB在收到的hello报文邻居列表中发现自己的router id ,状态置为2-way;
因为邻居都是未知的,所以hello报文的目的IP地址不是某个特定的单播地址,ospf采用组播的形式发送hello报文(目的地址为224.0.0.5)。
5)、对于不支持组播的网络,ospf路由如何发现邻居呢?
ospf支持通过单播的方式建立邻居关系,对于不支持网络可以通过手动配置实现邻居的发现与维护,
ospf路由器之间建立邻居关系是为了同步链路状态信息,接下来学习OSPF如何实现链路状态数据库同步。
二、链路状态信息
1、OSPF链路状态信息主要包括
链路的类型、接口ip地址及掩码、链路上所连接的邻居路由器、链路的带宽(开销)
OSPF有丰富的数据链路层能力,数据链路层协议类型多种多样,工作机制也各不相同,为适配多种数据链路层协议必须考虑各类链路层协议在组网时的应用场景
2、OSPF是如何定义多种网络的?
p2p网络:仅两台路由互连,支持广播、组播,
广播型网络:两台或两台以上的路由器通过共享介质互连,支持广播,组播,广播型网络的例子:通过以太网链路相连的路由器网络。是OSPF最常见的网络类型
NBMA网络:两台或两台以下路由器通过VC互连,不支持广播、组播,在NBMA网络上OSPF模拟在广播网络上的操作,但是每个路由器的邻居需要手动配置;NBMA型网络的例子,通过全互连的帧中继链路相连的路由器网络
P2MP网络:多个点到点网络的集合,支持广播、组播,没有一种链路层协议默认属于P2MP类型网络,也就是说必须是由其他的网络类型强制更改为P2MP,常见的做法是将非完全连接的帧中继或ATM必为P2MP网络。
3、OSPF链路状态信息中的开销值是如何度量的呢?
某接口COST=参考带宽/实际带宽,默认参考带宽为100M,当计算有小数位时,只取整数位,结果小于1时,COST取1
标记: 优先级 1
更改COST的两种方式:1、直接在接口下配置;2、修改参考带宽(所有路由器都需要修改,确保选中一致性)
三、报文类型及作用
1、OSPF协议报文头部
OSPF使用IP承载其报文,协议号为89
在OSPF packet部分,所有的OSPF报文均使用相同的OSPF报文头部
version:对于当前所使用的OSPFV2,该字段的值为2.
type:OSPF报文类型
packet length:表示整个OSPF报文的长度,单位是字节。
router ID:表示生成此报文的路由器的router ID。
area ID:表示此报文需要被通告的到的区域。
checksum :校验字段,其校验的范围是整个OSPF报文包括OSPF报文头部
auth type:为0时表示不认证,为1时表示简单的明文密码认证;为2时表示加密MD5认证
authentication:认证所需的信息,该字段的内容随autype的值不同而不同。
OSPF的报文头部定义了OSPF路由器之间的通信标准与规则
2、OSPF报文类型
type=1为hello报文,用来建立和维护邻居关系,邻居关系建立之前,路由器之间需要进行参数协商
type=2为数据库描述报文(DD),用来向邻居路由器描述本地链路状态数据库。使得邻居路由器识别出数据库中的LSA是否完整。
type=3为链路状态请求报文(LSR),路由器根据邻居的DD报文,判断本地数据库是否完整,如不完整,路由器把这些LSA记录进链路状态请求列表中,然后发送一个LSR给邻居路由器
type=4为链路状态更新报文LSU,用于响应邻居路由器发来的LSR,根据LSR中的请求列表,发送对应LSA给邻居路由器,真正实现LSA的泛洪与同步
type=5为链路状态确认报文(LSACK),用来对收到的LSA进行确认,保证同步过程的可靠性。
3、DD报文和LSACK中包含LSA头部信息:包括 LS type ls id advertising router ls sequence ls checksum; LSU报文中包含完整的LSA信息, LSR 包含LS type ls id advertising router
四、LSDB同步过程
五种报文可以高效地完成LSA的同步 ,那么实际的报文交互过程是什么样的呢?
同步状态图
各个状态含义:
exstart:邻居状态变成此状态后,路由器开始向邻居发送DD报文。master和slave关系是在此状态形成的,初始DD序列号也是在此状态下确定的,在此状态下发送的DD报文不包含链路状态描述。
exchange:在此状态下,路由器与邻居之间相互发送包含链路状态信息摘要的DD报文。
loading:在此状态下,路由器与邻居之间相互发送LSR报文,LSU报文,LSAck报文
full:lsdb同步过程完成。路由器与邻居之间形成了完全的邻接关系。
LSDB同步过程:
1、RTA和RTB的router ID 分别为1.1.1.1 和2.2.2.2并且二者已经建立 了邻居关系,当RTA的邻居状态变为exstart后,RTA会发送第一个DD报文,此报文中,DD序列号被随机设置为X,I-bit设置为1,表示这是第一个DD报文,M-bit设置为1,表示后续还有DD报文要发送,MS-bit设置为1,表示RYA宣告自己为master。
2、当RTB的邻居状态变为exstart后,rtb会发送第一个dd报文,此报文中,dd序列号被随机的设置为Y(i-bit=1,m-bit=1,ms-bit=1,含义同上)。由于rtb的router ID较大,所在rtb将成为真正的master,收到此报文后,rta会产生一个negotiation-done事件,并将邻居状态从exstart变为exchange。
3、当RTA的邻居状态变为exchange后rta会发送一个新的dd报文,此报文中包含了LSDB的摘要信息,序列号设置为RTB在步骤2中使用的序列号Y, I-bit=0,表示这不是第一个DD报文,M-bit=0,表示这是最后一个包含LSDB摘要信息的DD报文,MS-bit=0,表示RTA宣告自己为SLAVE,收到此报文后,RTB会产生一个negotiation-done事件,并将邻居状态从exstart变为exchange。
4、当RTB的邻居状态变为exchange后RTB会发送一个新的DD报文,此报文包含了LSDB的摘要信息,DD序列号设置为Y+1,MS-bit=1,表示RTB宣告自己为master
5、虽然RTA不需要发送新的包含LSDB摘要信息的DD报文,但是作为slave,RTA需要对master发送的第一个DD报文进行确认,所以RTA向RTB发送一个新的DD报文,序列号为Y+1,该报文内容为空,发送完此报文后,RTA产生一个exchange-Done事件,将邻居状态变为loading。RTB收到此报文后,会将邻居状态变为full。(假设RTB的LSDB是最新最全的,不需要向RTB请求更新)