首先,我们应该知道,路由器或者其它三层网络设备都是根据路由表转发数据包,而路由表项可通过手动配置和动态路由协议生成。
而ospf 就是现在实际工作中动态路由协议使用得最多的一种,今天就让我们由零开始,仔细一步步剥开深入了解这个路由协议吧。
唠叨一下,为什么有的人说ospf一辈子也很难完全搞懂,而初学者却觉得ospf很简单,学起来也就那几条命令,虽然不明白它的工作,但自己平常工作中也经常在用,玩得很6,但是,当你要往专业方向深入一点走,或者找一份薪资更好的工作,在面试官面前,你就6不起来了,毕竟作为一名专业的网络工程师,会用协议,也要了解其工作原理。
面试官也要问(ospf经常会问,自己实践出来的)。
所以,我们要抱着【知其然,知其所以然也】的态度,这样才能避免找工作时被刷。
目录
一 . 背景和概述
1. 路由协议分类
2. OSPF概述
3. OSPF优点
二. ospf基础概念
1.概念
2. OSPF三张表
3. OSPF 5 种类型的报文(面试可能会问)
三 . OSPF工作过程
1.大概步骤
2.工作详细步骤
3.七大状态:
废话不多说,直接来吧!
不知为何,照片上传就模糊
问:算法之间有何区别?
距离矢量路由协议
运行距离矢量路由协议的路由器周期性地泛洪自己的路由表。通过路由的交互,每台路由器都从相邻的路由器学习到路由,并且加载进自己的路由表中,然后再通告给其他相邻路由器。
简单来说
对于网络中的所有路由器而言,路由器并不清楚网络的拓扑,只是简单的知道要去往某个目的网段至于方向在哪里,开销有多大它不知道,它只是按最短跳数来计算距离(最大距离15跳)。
链路状态路由协议 - LSA泛洪
链路状态路由协议通告的的是链路状态而不是路由信息。
运行链路状态路由协议的路由器之间首先会建立邻居关系,然后彼此之间开始交互LSA(Link State Advertisement,链路状态通告)。
举个例子:如果路由器A要访问路由器B。
运行距离矢量协议的话,它的度量值就是最短跳数,上面是3跳,下面是2跳,所以它会走下面的路径,可是,虽然路径是短了,但明显上面带宽更大,传输效率会更快,这样就白白浪费带宽了。
如果此时运行的是链路状态协议,那么它就会发送LSA包,计算详细的链路状态信息,从而走上面带宽更大的路径。
//最优路径的衡量值就是带宽,带宽越大,传输的数据才越多,例如上图R3,去往R2的路径是走R4。
OSPF是IETF定义的一种基于链路状态的内部网关路由协议。目前有2个版本,针对IPv4协议使用的是OSPF Version 2(RFC2328);针对IPv6协议使用OSPF Version 3(RFC2740)。
//就是我们实际工作中,接触的网络类型IP地址是IPv4,就选version 2就好,目前我们国内使用ipv4的还是比较多,IPv6还没真正应用开来。
基于SPF算法,以“累计链路开销”作为选路参考值。
采用组播形式收发部分协议报文 //只有开启ospf的设备才会收到报文,节省开销。
支持区域划分:每个区域的路由器只保留本区域的链路状态信息(LSDB),这样可以使得路由器的链路状态数据库不会过大。 这也使得ospf能很好应用于大型网络。
支持对等价路由进行负载分担
支持报文认证
Router ID
是一个32为的无符号整数,表现形式跟IP地址一样,但route ID 不是IP!
ospf正常工作必须配置router id,类似一个身份证,用于网络中标识具体的设备,要求不能重复。
实际工作中一般都是手工配。
区域
为了减小数据库LSDB的规模,然后让SPF计算更快速,所以采用划分区域。
度量值“COST”
Ospf计算度量值的方法 : 带宽/接口开销
//实际工作中一般都是手工写开销,“cost” =“开销”。
默认参考带宽为100Mbit/s
[AR4-ospf-1]bandwidth-reference //修改OSPF参考带宽值。
网络设备中没有小数概念,只有整数概念,当计算之后的取值有小数的时候只取整数位,没有四舍五入。
所有小于1的取值,都取1。
例:例如带宽100M,从路由器R1 访问PC 2,开销值为多少?
答:先计算接口开销值:8+2+6=16
那么ospf的开销就为 100/16 (开销值 = 带宽除以接口开销值)
邻居表:显示了OSPF路由器之间的邻居状态,使用display ospf peer查看。
链路数据库表:LSDB会保存自己产生的及从邻居收到的LSA信息,本例中R1的LSDB包含了三条LSA,使用display ospf lsdb查看。
OSPF路由表: OSPF路由表和路由器路由表是两张不同的表。本例中OSPF路由表有三条路由。 OSPF路由表包含Destination、Cost和NextHop等指导转发的信息,使用display ospf routing查看。。
OSPF报文直接采用IP封装,在报文的IP头部中,协议号为89。
报文:
Hello报文:用于发现和建立邻居关系。(目的地址224.0.0.5)
DD报文:主从关系协商,描述LSA的摘要信息。
LSR报文:请求特定的链路状态信息
LSU报文:发送详细的链路状态信息
LSA:用于确认报文
Hello包有一个确认机制:
A给B发送一个hello包,第一次里面邻居router-id为空。
B也给A发一个hello包,第一次同样为空。
A再给B发送一个hello包,这次里面写上我的邻居包含B( B 的router-ip),因为上次B给A发过一次hello包,所以A这次发送的hello包里面携带着邻居B。
B收到hello包后看到里面已经有自己的信息,就确定了。
在以太网链路上,缺省时,OSPF采用组播的形式发送Hello报文(目的地址224.0.0.5)。
DD报文的作用:
此处不明白没关系,下面在工作过程中会体现出来,更有助于理解,可以看完下面再回过头来看看。
建立邻居关系
第一阶段 (hello报文)
设备刚刚都开始运行OSPF,还没发送任何报文,此时状态为 Down。
第二阶段 (hello报文)
R1开始向周围R2, R3 交互hello报文,此时hello报文里面携带的邻居router-id 为空(第一次),同样收到R2,R3 发来的hello报文,发现他们发来的hello报文里面携带的邻居中也没自己的router-id。
此时状态进入Init。
第三阶段 (hello报文)
发现其它设备发来的hello报文中有携带自己的router-id,进入2-way状态。
运行ospf的设备继续交互hello报文 ,例如 R1 此时收到R2的hello报文,发现R2发来的hello报文中里面有携带者自己的Router-id,R2也发现R1发来的报文中携带着自己的Router-id,此时进入2-WAY状态,标志建立邻居状态。
建立邻接关系
第四阶段 (DD报文)
设备开始互相发送空 DD报文,刚开始发送的DD报文中,主设备都为自己本身,通过一轮比较,router-id大的最终为主设备,小的为从设备,完成主从选举,此时为Exstart 状态。
第五阶段 (DD报文)
完成主从选举,进入Exchange状态。 开始发送LSA摘要信息的DD报文。可以大概理解互相为告诉周围设备,自己有哪些路由链路状态信息。
第六阶段 (DD报文)
开始请求自己没有的链路状态信息,进入loading状态。
第七阶段
完成所需链路信息的交互,形成ospf路由表,进入full状态,形成最终的邻接状态。
Down:没有发现任何OSPF邻居
Init:发现了OSPF邻居。
2-WAY:收到了OSPF邻居的hello报文。并且发现对方的active-neighbor有自身的RID。(DR,BDR选举)
Exstart:用于发送空的DD报文,相互进行主从选举。
Exchange:当主从选举确定之后,进入exchange状态发送有LSA摘要信息的DD报文。
loading:当收到了对方的DD报文之后,同时发现M=0,将会进入到loading状态,请求自身没有的LSA。
Full:当自身请求列表中,所有待接待的LSA,对方都发送过来之后,将会进入到full状态。
参考文档为菊花厂公开HCIP学习文档,大家可去自由去下载。
第二次写东西,不对的请多多指教,主要记录一下自己的学习过程,当然,如果还能帮到大家就更好了~