行至水穷处

坐看云起时

[学习笔记]DR/BDR的选择过程

关于DR/BDR选举 在ROUTING TCP/IP V1中的解释 我一直看不懂.刚总结了半天,提交失败,竟然都丢失了晕死,大概过程就如下,下面这个是我复制别人的,和我从书上总结的一样

1. 在与一个或多个邻居之间的双向通信建立起来之后,(路由器)对每个邻居(发送来)的Hello包中的优先级、DR和BDR域进行检查。列出所有能够参加选举的路由器(也就是说,路由器的优先级高于0并且此路由器的邻居状态至少为“双向”);所有路由器都宣称自己为DR(将它们自己的接口地址置于Hello包的DR域中);而且所有路由器都宣称自己为BDR(将它们自己的接口地址置于Hello包的BDR域中)。进行计算的路由器也要将自身包括在此列表内,除非它被禁止参加选举。
2. 从(以上)备选路由器列表中,创造一个子集,此子集包含所有未宣称为DR的路由器(宣称自己为DR的路由器无法被选举为BDR). TMD这里我就不明白,第一步都说了都宣告自己为DR,哪怎么又有没有宣告为DR的.
3. 如果此子集中的一或多个邻居将它(们)自身的接口地址置于BDR域中,这些邻居中拥有最高优先级的路由器将被宣告为BDR。如果出现平局(路由器优先级相等),拥有最高Router ID的邻居将被选举出来。
4. 如果此子集中没有任何路由器被宣告为BDR,拥有最高优先级的邻居将被宣告为BDR。如果出现平局,拥有最高Router ID的邻居将被选举出来。 TMD这里我就又不明白,第一步都说了都宣告自己为BDR,哪怎么又有没有宣告为BDR的.
5. 如果一或多个备选路由器将它(们)自身的接口地址置于DR域中,拥有最高优先级的邻居将被宣告为DR。如果出现平局,拥有最高Router ID的邻居将被选举出来。
6. 如果没有任何路由器宣告自己为DR,则新选举出来的BDR将成为DR。
7. 如果进行计算的路由器是新选举出来的DR或者BDR,或者如果它不再是DR或者BDR,重复步骤2到6。

简而言之,当一个OSPF路由器启动并开始搜索邻居时,它先搜寻活动的DR和BDR。如果DR和BDR存在,路由器就接受它们。如果没有BDR,就进行一次选举将拥有最高优先级的路由器选举为BDR。如果多于一台路由器拥有相同的优先级,那么拥有最高路由器ID的路由器将胜出。如果没有活动的DR,BDR将被提升为DR然后再进行一次BDR的选举。

但是看人家RFC 2178上的解释就明白多了:

DR选举机制按照如下规则运作:将进行计算的路由器称为路由器X。路由器X将会检查所有连接到此网络并与路由器X建立起双向通信的邻居的列表。此列表恰好为所有与路由器X的状态等于或高于“2-Way”状态的所有邻居的总和。路由器X也将其本身包括在此列表内。将列表中无权参加选举的所有路由器剔除。(拥有优先级0的路由器将无权成为DR。)。基于列表中剩余的所有路由器执行如下步骤:
1.记录当前网络中的DR和BDR值。此值稍后将作比较之用。
2.为此网络按照如下方式计算BDR。只有那些在列表中的没有宣称自己为DR的路由器才能参加BDR选举。如果多于一台路由器宣称自己为BDR(例如,当前在它们的Hello包中它们将自己列为BDR,但不是DR),则拥有最高路由器优先级的路由器被选举成为BDR。如果路由器的优先级相等,则拥有最高Router ID的路由器将当选。如果没有路由器宣称自己为BDR,则选举拥有最高路由器优先级的路由器为BDR(同样不考虑那些宣称自己为DR的路由器),同样使用Router ID来打破平局。
3.按照如下方法为此网络计算新的DR。如果一或多个路由器宣称自己为DR(也就是说,当前在它们的Hello包中将它们自己列为DR),则拥有最高路由器优先级的路由器被宣告为DR。如果出现平局,拥有最高Router ID者胜出。如果没有路由器宣告自己为DR,则新选择出来的BDR成为DR。
4.如果路由器X现在被选为新的DR或者BDR,或者它不再成为DR或者BDR,重复步骤2和3,然后跳到步骤5。例如,如果路由器X现在是DR,当重复第2步时路由器X将不能再参加BDR的选举。此外,这也会保证没有任何路由器会同时宣告自己为BDR和DR。
5.作为选举的结果,路由器本身可能现在成为了DR或者BDR。路由器的接口状态将被依此而设置。如果路由器现在成为了BDR,则端口的新状态为“备份”。否则,接口的新状态成为DR Other。
6.如果所连接的网络是NBMA网络而路由器本身正好被选举为DR或者BDR,它必须开始发送hello包给那些无权成为DR的邻居。这是通过调用每个拥有路由器优先级0的邻居消息“Start”来实现的。
7.如果以上计算导致了DR或者BDR身份的改变,与此端口关联的邻接关系需要进行改变。某些邻接关系需要建立,而其他一些将被打破。为了实现此动作,为所有状态至少为“2-Way”的邻居调用消息“AdjOK?”。这将会导致它们重新检查邻接状态。

点赞