场景:两台路由器,ip分别是10.1.45.4,10.1.45.5,以下描述分别为R1,R2
第一阶段:互相发送DD报文进入到exstart状态
第一份DD报文(也叫空DD报文):(作用是选举主从)根据ospf头部中的router-id大的选为主
R1发送的DD报文包含的字段内容:MTU=0(默认),I位初始化为1,M位为后续还有DD报文为1,M/S为初始都认为是主所以置1,然后假如自动生成的序列号为1000
R2发送的DD报文包含的字段内容:MTU=0(默认),I位初始化为1,M位为后续还有DD报文为1,M/S为初始都认为是主所以置1,然后假如自动生成的序列号为2000
为啥要选举主从呢:首先要确认报文的序列号,
那么序列号的作用是什么呢?
因为ospf工作在ip层,是面向无连接的,不可靠的协议,所以不能保证数据包的正确到达,所以才需要通过序列号的方式进行确认,说明对方已经收到了。
通过序列号的方式达到一个确认的效果这个叫隐式确认
第二阶段:
主从选举结束进入exchange状态:R1为从,R2为主
R1发送DD报文中:I位为0,M位为0或为1取决与后续是否有DD报文,M/S位为0,序列号为主第一份DD报文的序列号2000 (总结:从永远使用主发来的序列号不会进行任何更改)
R2发送的DD报文中:I位为0,M位为0或为1取决与后续是否有DD报文,M/S位为1,序列号为从发来的DD报文的序列号加1后是2001
如果一侧的dd报文比对方多,就会出现一侧发送的dd报文有内容,而一侧的dd报文时空dd一直等对方发送的dd报文中的M位为0时,才停止发送空的dd报文。期间主的序列号会一直加1,而从的序列号为主的序列号进行确认。发送的dd报文中会携带LSA的头部
当两端的M位发送的DD报文都为0时,则说明exchange状态的结束进入Loading状态
现实中为了加快收敛。会在exchange和Loading状态之间交互
也就是说当我收到的DD报文中的LSA是我缺少的LSA的话那么我将直接发送LSR不会一直等到DD报文全部发送完之后在去进行LSR的请求,而是收到缺少的LSA直接进行发送LSR,后续的DD依旧会发送,收到后如果缺少就继续发送LSR,当DD报文全部发送完以后,相应的LSR也将发送0次或几次后停止发送。
Loading状态:
根据DD报文中的LSA的头部。查看自己缺少的LSA,然后向外发送LSR(LS type,Link State ID,Advertising Router)这个三要素可以唯一区分一条LSA
比如R1有1,2,3,4的LSA,R2有4,5,6,7LSA,
R1将发送LSR 要请求包含5,6,7的LS type,LS ID,advertising Router(5,6,7这些信息都是从对方发来的DD报文中LSA头部获取的)
R2将会发送LSU给R1,其中包含5,6,7具体的LSA信息
当R1收到R2的LSU时会向它发送一个确认LSack报文,其中包含5,6,7的LSA头部,如果R2没有收到LSACK的确认报文那么会5s重传 ,会在一个Dead时间内重传,既然ACK到不了,那么hello报文一定也到不了,所以在down之前都会进行重传
当收到了LSACK之后邻居进入FULL状态。