对于某个目的网络,EIGRP持续关注它的各种距离参数。EIGRP使用复合度量参数,不过为了简化,这里使用一个没有单位的数值。同样出于简化,这里的EIGRP路由器都不使用水平分割。
本例中,我们主要关注R1与目的网络2001:DB8:CC1E::/64之间的行为。R4上的重分布配置已经被移除了。
下为R1上的几条show命令
show ip eigrp topology all-links 的输出内容中列出了2001:DB8:CC1E:: /64网络.并且去往这个网络有3个下—跳:路由器R2、R3和R4。 以“via”开头的每一行都描述了一条通过某个邻居去往这个目的地的路由.除了下一跳 IPv6地址和出接口外.小括号中还记录了两个数值。斜线后面的数值是报告距离(RD.Reported Distance).相当于这个邻居去往目的地的当前最小距离。换句话说.在路由器从 这个邻居那里收到的EIGRP数据包中.RD就是邻居在EIGRP数据包中报告的.其去往目的地的距离。R1通过从所有邻居那里接收的携带路由信息的EIGRP消息(更新包、査询包、响应包、 SIA査询包或SIA响应包).来学习这些距离参数。有些资料将RD称为通告距离(AD.Advertised Distance).但由于这个术语的缩写也是AD.容易与管理距离搞混.因此本书中使用RD。例中显示的路由器R2、R3和R4的RD值分別对应着它们的延迟值.都是使用延迟值乘以256计算得出的(256=1X256.1280=5X256.3072=12X256)。
小括号中斜线前面的数值称为汁算距离(CD,Computed Distance).指的是通过这个邻居去往目的地的总度量值。CD的汁算方法是:邻居的RD加J:R1与这个邻居之间链路的开销。 例中显示的值是从R1去往每个邻居的延迟总和.再乘以256得出的(2560=10X256..5120=20X256.4096=16X256)。
对于每个目的地网络来说.每个邻居都关联着一个CD值和一个RD值。工程师可以使用show ip eigrp topology命令.从“via”行中看到表示为 (CD/RD) 格式的这两个距离参 数。
与其他路由协议一样.EIGRP的目的是找出那条去往目的地度量值最小的路径。为了完成这个任务.EIGRP会选择那条拥有最低CD值的路径.并在确认这条路径无环之后.将它放入路由表中。从例8-9中可以看出.目前去往目的地网络的最小距离是由R2提供的.CD值为 2560。EIGRP将这条路由放入/R1的路由表中.并将这个CD值作为路由度量值。
CD值和RD值都是当前距离.CD表示这台路由器当时通过特定邻居去往目的地的总距离.RD表示邻居自己去往目的地的距离。EIGRP还会为每个目的地记录另一个距离:可行距离 (FD)。FD是EIGRP中最被大家误解且记戟最少的概念。对于每个目的地来说.FD记录了最后—次从活动状态转换到被动状态时.己知的最小距离。换句话说.FD是去往某个目的地己知最小CD的历史记录或历史副本.这个历史开始于最后一次的活动状态到被动状态的转换。从路由器上一次进入被动状态开始.作为己知最小CD值的记录.FD并不必与某目的地的当前最优CD值相等。FD的定义是:在被动状态时.当EIGRP初始化FD后.FD只能减少(如果当前的最优CD值变得比当前FD值小了)或保持当前值(如果当前的最优CD值增大.但路由仍处于被动状态)。无论有多少个EIGRP邻居.每个目的地只有一个FD值。非常值得注意的一点是.FD 值是内部可变的值.EIGRP为每个己知网络记录一个FD值.并永远不会把它通告给其他路由器。
下例很好地揭示了FD的行为.注意看案例输出中的注释内容。本例中的所有度量值变 更都是经过慎重选择.以避免违反可行性条件.从而导致去往2001:DB8:CC1E:: /64的路由进入活动状态。本例展示了路由保持被动状态时的FD行为。
现在假定R1与R2之间链路的延迟从9增加到11,注意下边的输出,CD via R2已从2560变为3072,因此路由表中的度量也已更改。网络标题中显示的FD保持在当前值2560,这时,FD的值意思为:在过去的某个时刻,R1距离目的地有2560个单位,即使与当前的最优CD不同。R2的RD也不变,因为R2到目的的最优路径不受任何影响。
现在进一步假定R2的LAN接口的延迟从1变为3。现在,R2的FD和CD都变了,RD变为768,CD变为3584。但FD还留在之前的值2560.在过去的某时,我们的最优CD为2560.
现在假定R2的LAN接口延迟回到1,另外,R1与R2之间的延迟降低到7.因为总延迟8是到目前为止的最优历史。不仅R2的RD和CD变了,作为已知的最小的CD记录,FD也从2560变为2048.
现在当R1与R2之间的延迟增加回9,CD回到之前的2560,FD将保持在2048,成为新的历史最小值。这个例子的最后,网络接口延迟完全回到初始状态,但是因为它的特性,FD从2560变为了2048即使当前最优路由的CD变回了原始的2560
从例中的几个示例可以看出, FD与真实的最低CD值不同,工程师可以通过命令show ipv6 route查看最低CD值。在向邻居通告去往2001:DB8:CCIE::/64的距离时, R1将会通告自已真实的距离,而不是通告FD,再次强调, FD是一个内部值,EIGRP用它来选择无环路径,但并不会在任何EIGRP数据包中通告FD值
刚才已经介绍了使用FD背后的意图,接下来考虑下图所示环境。这个拓扑与上图只有一点不同: R4只连接R1,并不连接LAN。工程师将R1-R4链路上的延迟配置为20。因此R4将去往2001:DB8:CCIE::/64的路由指向R1,同时对于这个网络, R4的总度量值会是: (2+9+1)×256=3072,与上图所得结论相同
现在假设R1-R2链路突然断开。在链路断开的瞬间,整个拓扑中只有R1和R2能够知道这个拓扑变化。R3和R4这时候还都不知道拓扑发生了变化。如果R1马上开始为这个目的地选择新的下一跳,它将会选择R4,因为在R2不可达后, R4提供的路径拥有最低开销:(2+12)×256=3584。然而,这种选择将会导致路由环路,因为当R1-R2链路断开,且R1尝试寻找其他下一跳时, R4并没有根据这个拓扑变化进行路由更新,因此它的RD (12×256=3072)已经过时了。盲目地信任这个值可不太明智。
这时就需要FD的介人了。工程师将FD设置为2560后, R1就会知道曾经在某个时间,有一条无环路径可以到达目的地,并且它的距离为2560。在拓扑中,所有链路的开销值都是正数(不会是负数,也不会是0),提供这条路径的邻居一定更靠近目的地,也就是说它们的RD一定小于2560。在曾经的那个时间点,任何距离小于2560的邻居都可以为R1提供安全的路径,因为这些邻居不会将数据包发回给R1,也不会通过其他更多的路由器将数据包发回给R1:这是因为如果邻居自已的距离小于R1的距离,邻居就没有理由通过距离大于自已的路径转发数据包。
现在,如果R1的真实距离随着时间变得更大了,那么对于那些距离小于2560的邻居来说,不使用Rl的理由更加充分了,与之前的理由一样,为什么要将数据包发送给距离比自已大,而且还越来越大的R1呢?要知道在这个逻辑中,邻居路由器甚至不需要知道R1的距离已经从2560增加到了一个更高的值,因此在这个可行性检查中,邻居甚至并不怎么需要R1的最新信息,但这却正是我们需要的!
上述这种思想就构成了FD (可行距离)以及与其相关的可行性条件检查的基础。FD是自上次路由变为被动状态后, EIGRP记录下的去往某目的地的最小已知距离,这个值描述的是路由器已知的去往该目的地最优路径的度量值。任何当前距离低于这个值的邻居都不会把数据包发回到这台路由器,而且就算邻居知道该路由器由于某种原因增大了自已的距离,它也不会考虑将数据包发回给这台路由器。因此,从这个目的地上一次变为被动状态后,任何比这台路由器距离目的地更近的邻居都不会造成路由环路,说得更专业一些就是:任何邻居的RD值只要小于这台路由器的FD值,就不会造成路由环路。这两种构想造就了可行性条件,这是由J. J. Garcia-Luna-Aceves博士在20世纪80年代末期和90年代早期提出的防环充分条件之一。这个可行性条件有时也称为源节点条件(Source Node Condition) ,指的是满足RD
要注意, FC是一个防环中的充分条件,并不是必要条件;也就是说每个满足FC的邻居都能够提供无环路径。但并不是每条无环路径都满足FC。在这两个拓扑中, R4向R1报告的它去往目的地2001:DB8:CCIE::/64的距离都是12×256=3072。在图1中, R4与目的地网络直连,能够直接将数据包转发到这个网络中。如果R4从R1那里收到了去往这个LAN的数据包, R4会直接把它们转发到这个LAN,并不会造成任何路由环路。可是在图2中, R4将R1作为去往LAN网络的下一跳,那么当R1试图通过R4来路由去往LAN的数据包时, R1会再次从R4收到这些数据包,从而造成路由环路。换句话说,如果邻居的RD值等于或大于R1的FD值,(也就是如果RD>FD还选它做下一跳的话就可能环路)这个邻居(图2)可能会或不可能(图1)造成路由环路;对于距离矢量协议来说, R1没有更多的信息能够确认到底是否会形成路由环路。不过有一点是肯定的,如果邻居的RD值小于R1的FD值(也就是自从目的地上一次变为被动状态后,这个邻居总是比R1更靠近目的地) ,这个邻居就永远不会造成路由环路。FC基本上把一台路由器的所有邻居分为了以下两组:保证能够提供无环路径的邻居;以及所有其他无法做出保证的邻居。
对于一个目的地来说,所有满足FC的邻居都称为可行后继(Feasible Successor) ,路由器可以安全地将它们用作去往该目的地的下一跳。换句话说,可行后继是指确保能够为某目的地提供无环路径的邻居;一个邻居是否是可行后继,检验标准就是FC。在所有的可行后继中,总会有一个或几个提供了去往该目的地的最小CD值;这些邻居称为后继(Successor) 。可行后继和后继都必须满足FC的要求,都保证能够提供无环路径;后继还必须要提供最短路径。其实从技术上说,每个后继也是可行后继,因为它也满足了FC的要求。不过在日常工作中,可行后继这个术语专门用来表示提供了无环路径的邻居,但它提供的路径还不是最短路径。工程师可以使用show ip eigrp topoIogy命令来查看某个目的地的所有后继和可行后继。不满足FC的邻居不会出现在这条命令的输出内容中;为了查看所有信息,工程师必须使用命令show ip eigrp topoIogy all-links.
回来看看图2,当R1-R2链路失效后, FC能够使R1不选择R4,从而不会构成路由环路。这是因为R4的RD是3584,而R1的FD是2560,因此R1认为R4可能会将自已当作去往这个LAN的下一跳。因此R4没有通过FC检查,也就不会被R1当作可行后继。当R1-R2链路断开的瞬间,只有R1和R2能够知道这个故障;而R1这时也知道,即使R4看起来提供了最低开销的下一跳路径,但它其实并不可靠。这样就避免了R1将路由指向R4,避免了构建短暂的路由环路。
EIGRP路由器总是可以使用任意后继和可行后继来访问目的地,对此并没有过多的限制。使用后继,可以通过最短的无环路径来传输数据包;使用可行后继,会使数据包传输更长的距离,但通过的路径也是无环的。当一条路由处于被动状态时,通常并没有理由使用可行后继来路由数据包,因为这会导致数据包被路由到次优的路径上;不过,这正是EIGRP提供的非等价负载分担特性的理念来源。