OSPF协议包类型和状态
首先是OSPF协议发包的目的地址是两个多播地址,224.0.0.5和224.0.0.6,224.0.0.5是所有的OSPF路由器都能够收到,这就意味着DR路由器使用这个地址对所有的路由器进行路由的通告。
而224.0.0.6是只有DR路由器才能够收到,这就意味着DRother通过这个地址于DR路由器进行交换路由信息的。
OSPF总共有五个大类的数据包:
1、hello:这是路由器之间互相发现,建立关系以及保活的数据包。
2、DD:数据库描述包,这个数据包就像是一份路由条目的清单列表,里面包含着LSA的头部信息,当其他路由器发现有自己缺少的路由条目,就会发送LSR。
3、LSR:用于向OSPF邻居请求LSA,来补充自己的路由条目的空缺。
4、LSU:LSU承载着LSA,而LSA正是包含着路由信息的数据媒介
5、LSAck:当收到对端的LSU,需要回送一个LSAck表示确认,否则路由器会启用重传机制,默认是4秒。关于OSPF相关的timer,可以在发送OSPF相关协议包的接口上进行设置。
OSPF的所有报文都有统一的报文头部,如下图所示:
里面包含着许多通常的信息。其中类型字段总共有五种,代表着上述描述的五类协议包。
然后还需要注意的地方就是验证类型,验证类型表明了这个路由器是否对它的OSPF的进程设置了相关的验证信息,只有验证信息相互符合才能互相接收到对方的路由信息。
1、hello报文![](https://img-blog.csdnimg.cn/d6c7a2960f544122a851893fc80099c3.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5Z6D5Zy-6KKL5oy66IO96JeP5ZWK,size_20,color_FFFFFF,t_70,g_se,x_16)
hello包除了携带OSPF的包头,也就是一些通常的信息之外,还包含着DR和BRD,自身的hello timer,以及路由优先级,等等信息。
hello包作为发现邻居关系,建立full状态的第一步,它会判断双方的路由器的一些参数是否是相同的,比如hello包的发送间隔,路由器失效的时间,区域ID,版本类型,双方接口的子网掩码总的来说就是参与OSPF的路由器都要有一致的活动规律和身份,确保大家都是属于同一种方式去维护整个网络。
我们还需注意的在发送hello包的时候,设计两个状态的变化,第一个状态是init状态,当路由器互相发现对端的hello包的时候,它们的状态转变为init,需要注意的是,这个时候它们发送的hello包中的邻居字段是全0,也就是没有发现任何的邻居,当接收到对方的hello包后会将route-id填入字段,当对方收到包含自己的route-id的hello包后会知道对端已经发现自己了,于是就建立起two-way状态。
DD报文
DD报文用于描述数据库的整体概况,以及用于DR于BDR和DRother的选举,一般的DD数据包会携带LSA头部用于描述大致的路由信息,但是当DD数据包用于选举的时候,是不会承载任何的LSA信息。
当他们的选举角色都确立之后,双方就使用DD报文描述各自的LSDB,在这种DD报文中包含着LSDB的LSA的头部。路由器可以使用多个DD报文描述LSDB,同时注意DD数据包的结构,它有一个序号的字段,当主的路由向其他路由送DD报文描述LSDB的时,接收到这个DD报文的路由器,当它要发送自己的DD报文的时候,需要使用之前接收的DD报文的序号,也就是说DR作为DD的发送主导者,其他路由器使用的都是DR发送的DD报文的序号。当DR和DRother互相发送DD报文一段时间之后,就结束了DD报文的互相发送。
在DD包中的可选项表达了它是如何进行DR的选举以及LSDB的描述结束。
同样在DD报文发送的过程中也会涉及状态的改变,当开始发送DD报文去描述自身的LSDB的时候,路由器的状态就转变为exstart,当DD传送结束后就变为loading阶段。
LSR报文
该报文表达了请求的LSA的类型,比如它的LSA的类型,链路状态ID,链路状态ID是LSA的信息的标识,而通告路由器是通告该LSA的路由器。
LSU报文
当DR在接收到所有路由器的LSA后,就会将完整的LSDB的信息以LSU的信息会议其他路由器的LSR的请求。
LsAck报文
LSA包含着对LSA的确认,同时一个LSAck内部可能包含着多个LSA确认。
重要的知识点,ABR只能将自己的区域内部的路由通告给area0,而不能通告自己到达其他区域的路由。
相关文章
- Python实现远程控制单片机led状态
- 卡尔曼滤波—建立状态空间表达式
- Android中StateListDrawable的种类(状态的种类)
- java核心知识点学习----并发和并行的区别,进程和线程的区别,如何创建线程和线程的四种状态,什么是线程计时器
- 重新整理操作系统概念系类——进程状态与切换
- 检查最后运行命令的状态
- 利用stat命令获取Linux文件系统和文件的详细状态信息
- Nginx http_stub_status_module状态查看模块
- k8s部署redis有状态服务statefulset
- HTTP协议状态码详解(HTTP Status Code)
- HTTP协议 结构,get post 区别-HTTP状态码(阿里)
- HTTP协议状态码详解(HTTP Status Code)
- Atitit 状态码专题 目录 1. FTP1 1.1. 1xx - 肯定的初步答复1 1.2. 2xx - 肯定的完成答复1 1.3. 3xx - 肯定的中间答复2 1.4. 4xx -
- Atitit 命令指令的分类与权限 IMAP协议为例子 目录 1. 指令的作用的权限吧。 全局命令 未认证状态命令 未认证状态命令 选中状态指令2 1.1. 1.在任何状态下都有效的指令(全局命
- 【Android 电量优化】电量优化 ( 充电状态获取 | 主动获取充电状态 | 广播接受者监听充电状态 | 被动获取充电状态 | 注册空广播接受者获取历史广播 )
- FineUI Grid 缓存列显示隐藏状态
- MongDB副本集成员状态
- 19 01-通过状态掩码读取DTC数目
- VC++如何实时感知Windows系统进入和退出待机状态(附源码)
- 贪心算法——状态不重复,无法使用dp优化的时候就要考虑了
- HTTP协议中的302,303状态码
- HTTP 协议必知必会 无状态/Cookie Session
- 根因解析 | Kubernetes Pod状态异常九大场景盘点