1.2 EGP 的操作
RFC 827中定义的是EGP版本1。EGP版本2对版本1做了少量修改,并在RFC 888中首次被提出,正式的EGPv2则由RFC 904进行定义。
1.2.1 EGP 的拓扑结构问题
EGP邻居(也被称为对等体)之间需要交换EGP消息。如果邻居位于同一个AS之内,就被称为内部邻居(interior neighbours);如果邻居位于不同的AS之内,则被称为外部邻居(exterior neighbours)。EGP无邻居自动发现功能,需要用手工方式来配置邻居地址,邻居间交换的消息采用单播方式被传送到手工配置的邻居地址。
由于EGP消息只应该被传送给单一邻居,因而RFC 888建议将EGP消息的TTL(time-to-live,生存时间)设置为低值。不过,没有任何一种EGP功能需要EGP邻居共享同一条数据链路。例如,图1-1显示了两个被某台仅运行RIP的路由器所分隔的EGP邻居,由于EGP消息采用单播方式被传送到邻居,因而可以穿越该路由器边界。Cisco路由器将EGP消息的TTL设置为255。
图1-1 EGP邻居无需连接在同一个网络上
EGP网关既可以是核心网关(core gateway),也可以是末梢网关(stub gateway)。这两种类型的网关都能接受来自其他自治系统中的网络信息,但末梢网关只能发送其自身AS的网络信息,只有核心网关才能发送从其他AS学习到的网络信息。
为了理解EGP为何要定义核心网关和末梢网关,需要先来了解EGP体系结构方面的局限性。如前所述,EGP并不是一种路由协议,其更新信息中仅列出了可达网络,并没有包含确定最短路径或防止路由环路的足够信息,因而建立起来的EGP拓扑结构必须没有环路。
图1-2显示的EGP拓扑结构中只有一个核心AS,其他自治系统(末梢自治系统)必须连接在该核心AS上。这种两级树状拓扑结构与OSPF的两级拓扑结构需求非常相似,而且作用也完全相同。《TCP/IP路由技术(第一卷)》中曾提到,域间OSPF路由在本质上属于距离向量路由,因而很容易形成路由环路。为此,OSPF要求所有非主干OSPF域之间的流量都必须经过主干域,利用这种强制性的无环路域间拓扑结构,可以大大降低路由环路的可能性。与此类似,要求末梢自治系统间的所有EGP可达性信息都必须经过核心AS,可以大大降低EGP拓扑结构潜在的路由环路可能性。
图1-2 为防止出现路由环路,仅允许核心网关将学习自某个AS的网络信息发送给其他AS
1.2.2 EGP 功能
EGP由以下3种协议机制组成。
• 邻居获取协议(Neighbor Acquisition Protocol)
• 邻居可达性协议(Neighbor Reachability Protocol)
• 网络可达性协议(Network Reachability Protocol)
这3种协议机制利用10种消息类型来建立邻居关系,维护邻居关系,与邻居交换网络可达性信息,并向邻居通告程序或格式化差错。表1-1列出了所有的EGP消息类型以及使用每种消息类型的协议机制。
下面将逐一讨论上述3种EGP机制。1.2.3小节将详细讨论上述消息。
1.邻居获取协议
EGP邻居在正常交换可达性信息之前,必须首先确认兼容性问题。该功能由一个简单的双向握手过程来完成,由其中一个邻居发送Neighbor Acquisition Request(邻居获取请求)消息,而另一个邻居则响应Neighbor Acquisition Confirm(邻居获取确认)消息。
没有任何一个RFC说明了两个EGP邻居是如何初次发现对方的。在实际应用中,EGP网关都是通过手工配置邻居的IP地址来获知其邻居的。之后,该网关将向该手工配置的邻居发送一条单播Neighbor Acquisition Request(邻居获取请求)消息,该消息申明了一个Hello间隔(即该网关同意从其邻居接受的两条Hello消息之间的最小间隔)和Poll间隔(即该网关同意因路由更新而被其邻居轮询的最小间隔)。该邻居的响应消息Neighbor Acquisition Confirm(邻居获取确认)中也将包含其Hello间隔和轮询间隔,如果邻居双方就这两个间隔值达成一致,那么就可以交换网络可达性信息了。
当网关学习到邻居之后,将认为邻居处于Idle(空闲)状态;在发送第一条Neighbor Acquisition Request(邻居获取请求)消息之前,网关会将邻居的状态转换为Acquire(获取)状态,当网关接收到Neighbor Acquisition Confirm(邻居获取确认)消息之后,则将邻居的状态转换为Down(停用)状态。
如果网关的响应消息不是Neighbor Acquisition Confirm(邻居获取确认),而是Neighbor Acquisition Refuse(邻居获取拒绝),则表示拒绝该邻居。Neighbor Acquisition Refuse(邻居获取拒绝)消息中可以包含拒绝理由,如表空间不足,当然,也可以无任何特定理由即可拒绝该邻居。
利用Neighbor Cease(邻居终止)消息,网关可以随时终止已建立的邻居关系。与Neighbor Acquisition Refuse(邻居获取拒绝)消息一样,发起Neighbor Cease(邻居终止)消息的网关既可以在消息中包含终止原因,也可以什么原因都不说。邻居收到Neighbor Cease(邻居终止)消息之后,回应Neighbor Cease Acknowledgment(邻居终止确认)消息。
邻居获取进程的最后一种情况就是网关发送Neighbor Acquisition Request(邻居获取请求)消息,而邻居无任何响应。RFC 888建议“以一个合理的速率(如每隔30s)”来重传Neighbor Acquisition Request(邻居获取请求)消息,但Cisco的EGP实现并不仅仅在固定周期内重传未确认的消息,而是在初次发送Neighbor Acquisition Request(邻居获取请求)消息之后的30s重传未确认的Acquisition(获取)消息,之后在再次重传之前需要等待60秒钟的时间。如果在第三次重传之后的30s之内仍未收到响应消息,网关就将邻居的状态由Acquire(获取)转换为Idle(空闲),如例1-1所示。网关将Idle(空闲)状态保持到300秒(5分钟)之后,将Idle(空闲)状态转换到Acquire(获取)状态,并重新开始上述邻居获取进程。
例1-1:命令debug ip egp transactions的输出结果显示了EGP的状态转换过程。
需要注意的是,例1-1中的每条EGP消息都有一个序列号,利用该序列号可以表示EGP消息对(如Neighbor Acquisition Request/Confirm、Request/Refusal以及Cease/Cease-Ack消息对)。后面“网络可达性协议”部分将详细解释序列号的使用方式。
当两个EGP网关成为邻居之后,其中一个为active(主动)邻居,另一个是passive(被动)邻居。总是由主动网关发送Neighbor Acquisition Request(邻居获取请求)消息来发起邻居关系,被动网关从不发送Neighbor Acquisition Request(邻居获取请求)消息,它们仅响应主动网关发出的Neighbor Acquisition Request(邻居获取请求)消息。Hello/I-Heard-you消息对也是如此,由主动邻居发送Hello消息,而被动邻居则回应I-Heard-You(I-H-U)消息。不过,被动网关可以发起Neighbor Cease(邻居终止)消息,此时主动网关必须回应Neighbor Cease Acknowledgment(邻居终止确认)消息。
核心网关(可以是位于多个其他自治系统的路由器的邻居)既可能是某个邻居邻接(neighbor adjacency)关系的主动网关,也可能是其他邻居邻接关系的被动网关。Cisco的EGP实现利用AS作为决定因素,即AS号小的邻居成为主动邻居。
2.邻居可达性协议
网关获取到某个邻居之后,就通过发送周期性的Hell消息来维护邻居关系,而邻居则以 I-H-U消息作为Hello消息的回应。RFC 904没有指定Hello消息的标准周期,Cisco使用的默认周期为60秒,也可以使用命令timers egp对其进行修改。
交换完Hello/I-H-U消息对之后,邻居的状态由Down(停用)变为Up(启用)(参见例 1-2),之后邻居之间就可以交换网络可达性信息了,如下所述。
例1-2:命令debug ip egp transactions的输出结果显示了双向握手成功以及EGP的状态转换。
如果主动邻居连续发送了3条消息之后仍未收到响应消息,那么邻居的状态将被转换为 Down(停用)。网关以正常的Hello间隔发送3条以上的Hello消息,如果仍未收到响应消息,那么邻居的状态将被转换为Cease(终止)状态。网关按60秒的间隔时间发送3条Neighbor Cease(邻居终止)消息,如果邻居均回应Neighbor Cease Acknowledgment(邻居终止确认)消息,那么该网关就将邻居的状态转换为Idle(空闲)状态,并等待5分钟,之后再转换回Acquire(获取)状态,并尝试重新获取邻居。例1-3显示了该事件的顺序关系。
例1-3:地址为192.168.16.2的邻居停止回应,每条未被确认的EGP消息的间隔为60秒。
(待续)
例1-4给出了另一个沉寂(dead)邻居的例子,只是本例中处于被动模式下的核心网关(192.168.16.2)正在发现该沉寂邻居(192.168.16.1)。
例1-4:地址为192.168.16.1的邻居停止回应,debug消息来自处于被动模式下的核心网关(192.168.16.2)。
如果网关未在60s的Hello间隔内收到Hello消息,则将尝试“唤醒”其邻居。由于被动模式下的网关无法发送Hello消息,因而发送Poll(轮询)消息,之后该网关将等待一个Poll间隔。(Cisco的默认Poll间隔是180s,即3分钟。)如果网关未收到响应消息,将再次发送另一条Poll消息,并且再等待一个Poll间隔;如果仍未收到响应消息,网关就将邻居的状态更改为Down(停用),随后又更改为Cease(终止)状态。如例1-3所示,发送了3条Cease消息之后,邻居的状态被更改为Idle(空闲)。
3.网络可达性协议
当邻居的状态为Up(启用)时,EGP邻居之间可以开始交换可达性信息。每个网关都周期性地向其邻居发送包含了序列号的Poll(轮询)消息,邻居则以包含了相同序列号和可达网络列表的Update(更新)消息进行响应。例1-5解释了Cisco IOS软件对序列号的使用方式。
例1-5:EGP邻居之间进行周期性地相互轮询,以获得网络可达性更新。
邻居间交换的每对Hello/I-H-U消息中都包含了相同的序列号,直至发送Poll(轮询)消息时为止,Poll/Update消息对也使用相同的序列号。主动邻居每接收到一次Update(更新)消息,就将序列号加1,如例1-5所示,Poll/Update消息对中的序列号为120,之后被加1后变成了121。需要注意的是,本例中两个邻居都发送了Poll(轮询)消息,来自被动邻居(192.168.16.2)的Poll(轮询)消息带有完全不同的序列号(3),而邻居总是以包含了与Poll(轮询)消息中完全相同的序列号的Update(更新)消息作为响应消息。
Cisco IOS软件中的默认Poll间隔为180秒,也可以使用命令timers egp对其进行修改。通常情况下,只有当网关被轮询到时才发送Update(更新)消息,这就意味着拓扑结构的变化可能最多有3分钟时间无法向外部进行宣告。为此,EGP通过允许网关在每个Poll间隔内发送一条主动提供的(unsolicited)Update(更新)消息(即不作为Poll(轮询)响应消息的Update(更新))来解决这个问题,但Cisco不支持这种主动提供的Update(更新)。
注意:也可以使用命令timers egp来修改Hello间隔,命令格式为timers egp hello polltime。
Poll(轮询)和Update(更新)消息中都包含了源网络的地址,例如,例1-5中的Poll(轮询)和Update(更新)消息中显示的源网络地址为192.168.16.0。这里所说的源网络指的是通过该网络可以测量所有的可达性信息——也就是说,通过连接在源网络上的路由器可以到达所有被请求或被宣告的网络。虽然源网络通常就是与两个邻居都相连的网络,但更准确地说法应该是:源网络就是Poll(轮询)正在请求消息的网络以及Update(更新)正在提供信息的网络。EGP完全是一种有类别协议,而且源网络(也就是列在Update中的网络地址)总是主类(major class)网络地址(从来都不会是子网)。
在源网络地址之后是一台或多台路由器以及通过这些路由器可以到达的网络列表,该列表上的路由器的共同特征是都连接在源网络上。如果该列表上的路由器不是发起Update(更新)消息的EGP网关,那么该路由器就是间接(indirect)或第三方(third-party)邻居。
图1-3解释了间接EGP邻居的概念,名为Moe的路由器是一台核心网关,与其他3台网关形成对等关系。
图1-3 间接EGP邻居
例1-5中的调试消息来自AS1中的路由器Shemp。需要注意的是,由路由器Moe(192.168.16.2)发起的Update(更新)消息中,这3个网络都被列为可通过路由器Moe而到达,有4个网络可以通过路由器Larry(192.168.16.4)和Curly(192.168.16.3)而到达,而这2台路由器都是Shemp的间接邻居,需要通过Moe才能通达。AS3中的路由器Joe则不是一个间接邻居,因为该路由器并没有连接到源网络上,其网络仅仅被宣告为可以通过路由器Moe到达该网络。
间接路由器的宣告可以节省公共链路的带宽,但更为重要的是,通过消除不需要的路由器跳数可以大大提高路由效率。如图1-3所示,路由器Shemp仅与Moe形成对等关系,而事实上,路由器Larry并不运行EGP,只是通过RIP将其网络宣告给Moe,路由器Moe通过向Shemp告知有比自己更好的下一跳来执行”抢占重定向(preemptive redirect)”操作。
事实上,EGP的Update(更新)消息中也可以仅包含间接邻居——也就是说,消息发起方可能不将其作为通往其他网络的下一跳。此时,该发起方被称为route server(路由器服务器)。路由服务器通过IGP或静态路由可以学习到可达性信息,并将这些可达性信息宣告给EGP邻居,而自身并不执行任何包转发功能。
从EGP网关的角度来看,邻居既可以是内部网关,也可以是外部网关。如果位于同一个AS中,则邻居为内部网关,如果位于不同的AS中,则邻居为外部网关。图1-3中的所有EGP网关都将其邻居视为外部网关。如果路由器Larry也运行了EGP,而且与Moe形成对等关系,那么这两台路由器都会将对方视为内部网关。
EGP的Update(更新)消息中包含了两个用来描述其列表中的路由器是内部网关还是外部网关的字段(详见1.2.3小节)。下面来看一下例1-5的Update(更新)消息,可以看出这两个字段紧挨着源网络地址字段之前:IntGW=2以及ExtGW=1。这两个字段之和即为Update(更新)消息中列出的路由器数量。首先列出的是所有指定的内部网关,因而,如果IntGW=2以及ExtGW=1,则表示列出的前两个路由器为内部网关,最后一个路由器为外部网关。如果将例1-5中192.168.16.2的Update(更新)消息与图1-3相比较,可以看出,通过路由器Curly可达的3个网络都被列在Update(更新)的最后,并被标记为外部——也就是说,这3个网络可以通过路由器Moe的外部网关到达。由于末梢网关无法将网络宣告到本AS之外,因而只有核心网关的Update(更新)消息中才包含外部网关信息。
EGP的Update(更新)消息为每个列出的网络都关联一个距离值,距离字段为8bit,距离值范围为0〜255。不过,除了将255表示为不可达网络之外,RFC 904并没有具体指定距离值的解析方式,而且也没有RFC定义任何利用该距离值来计算AS间最短路径的算法。Cisco则将距离值理解为跳数,如例1-5所示,其默认规则也非常简单:
• 如果网关在本AS内宣告所有网络,则距离值为0;
• 如果网关在本AS之外宣告所有网络,则距离值为3;
• 如果网关指示某网络不可达,则将其距离值设置为255。
以例1-5和图1-3为例,尽管网络172.20.0.0与路由器Moe之间存在一跳路由,但Moe宣告该网络时的距离值为0,即与其直接连接的网络172.17.0.0的距离值相同。Moe与网络10.0.0.0之间存在一跳路由,与网络172.18.0.0之间存在两跳路由,由于这两个网络与Moe处于不同的AS中,因而Moe宣告这两个网络时的距离值都为3。需要记住的一点是,从本质上来看,EGP所使用的距离值对确定到某个网络的最佳路径毫无用处。
例1-6给出了Shemp的路由表以及例1-5中的Update(更新)所产生的路由项。
例1-6:路由器Shemp的路由表。
例1-6中的路由表有两点值得注意。首先,EGP项的管理距离为140,该管理距离要高于所有的IGP(外部EIGRP除外),因而路由器将总是选择IGP路由,即使EGP宣告的是同一个网络。
其次,每个由EGP宣告的网络的距离值都比例1-5 Update(更新)消息中显示的距离大1。这是因为,跟RIP路由算法一样,Cisco的EGP进程将所有的距离值都加1。
1.2.3 EGP 消息格式
EGP使用5种不同的编码格式来表示表1-1中的10类消息,所有消息的头部格式都一样,如图1-4所示。
图1-4 EGP消息头部
EGP消息的头部字段定义如下。
• 版本(Version):指定当前的EGP版本号。如果接收到的消息中的版本号与接收方的版本号不一致,则将拒绝该消息。当前所有EGP实现的版本号都是2。
• 类型(Type):指定头部后面是5种消息格式中的哪一个。表1-2给出了10类EGP消息及其使用的类型编号。
• 代码(Code):指定子类型。例如,如果类型为5,则代码可以指示消息是Hello还是I-Heard-Youo
• 状态(Status):根据消息类型的不同而不同(就像代码字段一样)。例如,Neighbor Acquisition(邻居获取)消息可以利用状态字段来表示主动或被动模式,而Neighbor Reachability(邻居可达性)消息可以利用状态字段来表示Up(启用)或Down(停用)状态。
• 校验和(Checksum):是EGP消息和反码的反码,与IP、TCP和UDP使用的差错校验算法相同。
• 自治系统号(Autonomous System Number):指定消息发起方的AS号。
• 序列号(Sequence Number):用于同步消息对(如本章前面所述)。例如,Update(更新)消息中包含的序列号应始终与Poll(轮询)消息中的序列号一致。
1.Neighbor Acquisition(邻居获取)消息(EGP消息类型3)
Neighbor Acquisition(邻居获取)消息属于EGP类型3。表1-3列出了用于指示EGP消息的代码值,源自RFC 904的表1-4给出了状态字段的可能值以及可能使用某特定状态的原因。
表1-3 消息类型3使用的代码
表1-4 消息类型3使用的状态编号
图1-5 给出了Neighbor Acquisition(邻居获取)的格式,Hello间隔和Poll(轮询)间隔字段仅出现在Neighbor Acquisition Request(邻居获取请求,代码0)和Neighbor Acquisition Confirm(邻居获取确认,代码1)消息中,其他Neighbor Reachability(邻居可达性)消息的格式与头部相同,不包含其他字段。
• Hello间隔(Hello interval):表示发起方同意接收的两个Hello消息之间的最小间隔,以秒为单位。Cisco的默认Hello间隔为60秒,可以利用命令timers egp对其进行修改。
图1-5 Neighbor Acquisition(邻居获取)消息
• 轮询间隔(Poll interval):表示发起方同意接收的两个Poll消息之间的最小间隔,以秒为单位。Cisco的默认Hello间隔为180秒,可以利用命令timers egp对其进行修改。
2.Neighbor Reachability(邻居可达性)消息(EGP消息类型5)
如图1-6所示,Neighbor Reachability(邻居可达性)消息就是EGP头部,类型字段为5。由于所有必需信息都包含在代码字段(参见表1-5)和状态字段(参见表1-6)中,因而Neighbor Reachability(邻居可达性)消息中不包含其他字段。
图1-6 Neighbor Reachability(邻居可达性)消息
3.Poll(轮询)消息(EGP消息类型2)
在EGP头部增加一个IP源网络(是指被请求了可达性信息的网络)字段即构成了Poll(轮询)消息(参见图1-7)。该字段中编码的IP地址总是A、B、C类网络地址,代码字段总是为0,所用的状态编号与表1-6相同(RFC 888将Poll(轮询)和Error(差错)消息中的状态字段列为未使用)。
4.Update(更新)消息(EGP消息类型1)
与Poll(轮询)消息一样,Update(更新)消息的代码字段始终为0,表1-7列出了状态字段的可能值,除了Unsolicited(主动提供的)值之外,其余均与表1-6一样。
图1-7 轮询消息
状态字段的最高位是Unsolicited(主动提供的)bit,如果该bit被置位(即该字段值为128),则Update(更新)消息为主动提供的消息。Unsolicited(主动提供的)bit可以与其他各种状态值一起使用。
Update(更新)消息包含一个4级列表的分层结构,图1-8解释了Update(更新)消息的格式以及这些列表分层结构的组织方式。
分层结构的最高一层是所有直接连接到源网络的路由器列表,列表上的网关数量由# of Interior Gateways(内部网关数)和# of Exterior Gateways(外部网关数)字段之和来表示。
接下来的一层将内部网关和外部网关完全区分开来,首先列出的是所有内部网关(包括发起方);如果有外部网关,则全部列在内部网关之后。
在分层结构的第3层,每个被列出的网关都有一个距离列表,与内部网关和外部网关一样,该层有一个用来指示列表上距离数量的字段。
最后,每个列出的距离值都有一个在该距离下通过该网关可以到达的网络列表,该层有一个用来表示列表上网络数量的字段。
有关Update(更新)消息格式字段的完整描述如下。
• 内部网关数(# of Interior Gateways):指定列表上内部网关的数量。
• 外部网关数(# of Exterior Gateways):指定列在内部网关之后的外部网关的数量。本字段与# of Interior Gateways(内部网关数)字段之和(如图1-8所示的N)表示Update(更新)消息中列出的所有网关数。
• IP源网络(IP Source Network):指示网络正在提供的是哪种可达性信息。也就是说,通过连接在该网络上的网关可以到达Update(更新)消息中列出的所有网络,该字段中编码的IP地址总是主类(A、B、C类)网络。
• 网关IP地址(Gateway IP Address):指定连接在源网络上的网关的IP地址,仅列出主类(A、B或C类)地址的主机部分。该字段的长度是可变的,在C类地址时长度为1个8位组,在A类地址时长度为3个8位组,至于IP地址的网络部分,从IP源网络字段即可得知。
图1-8 Update(更新)消息
• 距离数量(# of Distances):指示所列网关全部被宣告的距离数量。
• 距离(Distance):指示所列网关被宣告的特定距离值。
• 网络数量(# of Networks):指示所列网关全部被宣告的网络数量。
• 网络(Network):指示被宣告的网络的IP地址。如图1-8所示,每个网络都属于某个特定网关、特定距离和网络列表中的特定顺序。与网关IP地址字段一样,网络字段的长度也是可变的,但是与网关IP地址字段不同的是,网络字段列出的是主类(A、 B或C类)地址的网络部分,而不是主机部分。
5.Error(差错)消息(EGP消息类型8)
网关在任何时候都可以发送Error(差错)消息(如图1-9所示),向发送方指示EGP消息错误或字段值无效。Error(差错)消息中的代码字段总是为0,而状态字段的取值则如表1-7所示。
注意: RFC888将ERROR(差错)消息(与Poll(轮询)消息一样)中的状态字段说明为未用,而RFC904说明的状态字段情况如表1-7所示。
图1-9 Error(差错)消息
Error(差错)消息的发起方可以使用任意值作为序列号。表1-8描述了各种可能的原因(Reason)字段(取自RFC 904),Error(差错)消息头部是EGP消息(提示差错信息)的前12个8位组。