4.DD交换:主/从关系



 



当两台路由器之间形成了邻居关系后(ExStart),邻居双方需要决定在数据库交换的过程中,哪台路由器的角色是主,哪台路由器的角色是从。主和从这两个角色决定了DD包交换过程中路由器的职责。只有主路由器才能主动发送DD包,并且能够设置以及增加DD包的序列号。从路由器只能在收到主路由器发来的DD包后,返回DD包作为确认,并且必须使用与其接受到的DD包相投的序列号。事实上,从路由器只是被主路由器调差,并且智能对此进行响应。



除了其他字段外,DD包的头部还包含以下三个标记。



MS(主)标记:主路由器发送的所有DD包中设置这个标记;从路由器发送的所有DD包中不设置这个标记。



M(更多)标记:当还有后续DD包需要发送时设置。



I(初始)标记:指明这是开始交换的第一个DD包,后续的DD包(无论是主还是从发送的)都不设置这个标记。



 



如果一台路由器没有更多的LSA头部需要通告了,但对方却需要他发送更多的DD包回应,那他只需发送空的DD包就可以了。



从路由器可以在响应主路由器DD包的的那个DD包中设置M标记,来告知主路由器它还需要发送更多DD包,



 



主和从路由器都会在自己的DD包中正确设置M标记,来表示它们是否已经通告了整个链路状态数据库。路由器要想将邻居这置为相应的状态(Loading或Full),是需要这个信息的,它需要知道邻居数据库中的LSA列表何时通告完成。



 



在交换过程开始的时候,每台路由器都会把邻居置为ExStart状态。它们一上来都会把自己当做主路由器,然后向对方发送空的DD包,其中包含一个水机选择的序列号,将MS(主),M(更多),和I(初始)标记设置为1。在收到邻居发来的DD包后通过比较RID,RID较低的路由器会将自己的角色变更为从路由器,然后它会发送一个DD包作为响应,其中将MS和I标记设置为0,将序列号设置为主路由器发来的DD包的序列号。这时主/从选择就完成了,两台路由器都会进入Exchange状态。然后主路由器会发送一个序列号加1的DD包,其中可以包含一个或多个LSA头部,然后从路由器会使用序列号相同的DD包作为响应,也可以在其中通告自己的LSA头部。LSA头部的交换形式与此相同,主路由器会在后续的每个DD包中增加序列号,直到两台路由器都通告了自己已知的所有LSA头部位置(当主路由器通告了所有LSA头部,且最后一个DD响应包中的M标记为0时,主路由器才会停止发送DD包)。



 



5.请求,获得和确认LSA



在使用DD包交换了所有LSA头部后,每台路由器中都有邻居路由器已知的LSA列表。通过这些信息,路由器需要请求那些自己LSDB中缺少的LSA的完整



副本。



路由器使用LSR包向邻居请求一个或多个LSA。邻居路由器以LSU包作为响应,其中携带一个或多个完整的LSA。两台路由器都处于Loading状态,正在传输LSR/LSA。在这过程完成后,两台路由器会稳定在Full状态,这表示两台路由器已经完全交换了它们的数据库,同一区域的LSDB条目应该相同。



LSR/LSA交换过程使用了一种可靠传输协议,有以下两个选项能够用来确认收到的数据包。首先,接收方可以向发送方发送与其接收到的LSU包完全相同的LSU包,以此作为已收到LSU包的确认。或者路由器还可以使用LSAck包来确认收到的数据包,LSAck包中包含了已知的LSA头部列表。



交换完LSDB后,它们就可以各自运行Dijkstra SPF算法了,计算各自的最优路径。