蒋 磊
(南京城市职业学院,江苏 南京 210000)
在互联网发展早期,网络规模相对较小,网络内部路由器的数量也非常有限,这样经过几次中转,数据就可以从发送端到达目的端,从而完成对数据的转发。完成这项任务的路由器其内部执行的是一种被称为是IGP的内部网关路由协议,诸如RIP,OSPF,ISIS和EIGRP等都是IGP路由协议。它们在当时的网络环境下工作得很好,但随着互联网规模的扩大和发展,路由器的数量与日增长,路由表也变得异常庞大和臃肿,此时迫切需要将网络划分成一个个单独的管理单元,每个单元就是一个自治系统。自治系统内部拥有统一的管理策略和要求,也拥有数量众多的路由条目,如何在自治系统之间传递和分享路由就成为当时人们关注的热点,最终经过科研人员的不懈努力,终于诞生了一种被称为是EGP的外部网关路由协议的协议。目前EGP的最典型代表就是BGP协议,BGP是一种路径矢量路由协议,它的特点是在自治系统之间传递和控制路由,而不是计算路由,计算路由交给自治系统内部的IGP完成就好了[1]。
BGP是一种典型的外部网关路由协议,与内部网关路由协议在功能上和特点上各不相同,IGP在于计算和发现路由;EGP在于传递和控制路由。BGP是一种路径矢量型路由协议,每条路径都携带了大量的路径属性,可以通过这些属性完成对路由的传递和控制。BGP支持可变长子网掩码和路由聚合,这样可以进一步将路由进行缩减,以便于减少路由表条目的数量。BGP使用TCP作为其传输层协议,TCP本身可以提供一定的可靠性,因此,BGP在传递路由时可以通过TCP提供的可靠性完成对路由传递的确认。BGP支持增量更新和触发更新。这种更新方式可以减少对系统资源的消耗,避免更新对网络带来的冲击。
BGP的基本概念如下所示。
(1)自治系统:即AS,是处于一个管理机构控制之下的路由器和网络群组,每个自治系统都需要有一个AS号,可以是公有AS号,也可以是私有AS号,其长度为2字节。公有AS号的范围从1到64511,需要向因特网注册机构IANA进行申请;私有AS号的范围从64512到65535,不需要向IANA申请,并可重复使用。
(2)BGP发言者:运行BGP协议的设备都可以叫作BGP发言者。
(3)BGP对等体:相互交换BGP消息的发言者又称之为BGP对等体。
(4)IBGP:处在同一个AS内部的BGP发言者之间建立的对等体关系叫作IBGP。
(5)EBGP:处在不同AS内部的BGP发言者之间建立的对等体关系叫作EBGP。
(6)Router-ID:运行BGP协议的路由器都有一个Router-ID,Router-ID是一个32位的无符号整数,它是AS中每台BGP路由器的身份标识。Router-ID可以手工指定,也可以自动选举产生。
(7)BGP同步:同步指的是IBGP和IGP之间的同步,也就是说只有当IGP和IBGP都知道这条路由时,IBGP对等体才会把这条路由通告给其EBGP对等体,否则数据在转发过程中会产生路由黑洞。
(8)IBGP水平分割:IBGP对等体之间在传递路由时,不会再通告给其他IBGP对等体,目的是为了防止路由环路。
共有5种类型的BGP消息,分别是RFC 1771中定义的OPEN消息、KEEPALIVE消息、UPDATE消息和NOTIFICATION消息,以及RFC 2918中定义了ROUTEREFRESH消息。由于ROUTE-REFRESH消息并不常用,所以接下来的篇幅仅对RFC 1771中定义的消息类型进行简要阐述。但无论是哪种类型的BGP消息,其格式都由“消息头+消息体”两部分组成。
OPEN消息:它是BGP路由器完成TCP“三次握手”之后相互发送的第一个消息,用于建立BGP对等体之间的连接关系并进行参数协商,内容包括BGP版本号、自己所在的AS号、路由器Router-ID、Hold Time邻居关系保持时间、认证信息等。如果OPEN消息被接受,则对方回复一条KEEPALIVE消息进行确认,确认后就可以发送UPDATE消息了。
KEEPALIVE消息:BGP会周期性地向邻居发送KEEPALIVE消息,主要目的是让邻居知道自己的存在,保持邻居关系的稳定性,同时还有一个作用是对收到的OPEN消息进行确认,由于其消息格式中只包含消息头,没有消息体,所以默认长度为19字节。
UPDATE消息:UPDATE消息用来在BGP邻居之间交换路由信息,它既可以发布路由,也可以撤销路由,两者兼顾。UPDATE消息一次只能描述一条BGP路由,但可以携带多个路径属性,如果想让UPDATE消息一次描述多条路由,则每条路由的路径属性必须相同。同时UPDATE消息一次还可以描述多条被撤销的路由。
NOTIFICATION消息:该消息的作用是通知错误。当BGP邻居检测到对端发来的消息有错误或者对端主动断开BGP邻居关系,会主动发出NOTIFICATION消息通知BGP邻居,并关闭连接,回到Idle状态;如果收到邻居发来的NOTIFICATION消息,也会将连接状态变为Idle状态。NOTIFICATION消息的内容包括错误代码、子错误代码和错误数据。错误代码指出错误类型,子错误码描述错误的详细信息,错误数据用来诊断错误原因[2]。
BGP具有丰富的路径属性,它是路由信息中所携带的一组参数,BGP通过比较这些参数,来完成诸如路径选择、路由控制、路由优化、环路避免等工作[3]。
(1)公认必遵属性:要求所有的BGP路由器都必须能够识别这些属性,且必须在UPDATE消息中携带这些信息,如果缺少这些属性,路由信息就会出错。这些属性包括AS_PATH属性、ORIGIN属性和NEXT_HOP属性。
(2)公认可选属性:要求所有的BGP路由器都能够识别这些属性,但不要求一定在UPDATE消息中携带这些信息,可以根据具体情况来选择。这些属性包括ATOMIC_AGGREGATE属性和LOCAL_PREF属性。
(3)可选传递属性:在AS之间具有可传递性的属性,BGP路由器可以不支持这些属性,但即使不支持这些属性,仍然会接收这些属性,并把它传递给其他的BGP对等体。这些属性包括COMMUNITY属性和AGGREGATE属性。
(4)可选非传递属性:如果BGP路由器不支持此属性,则忽略包含这些属性的UPDATE信息并且不会再传递给其他的BGP对等体。这些属性包括MED属性、ORIGINATOR_ID属性、WEIGHT属性和CLUSTER_LIST属性。
ORIGIN属性是公认必遵属性,它用来表示路由条目的起源,也就是路由条目是如何注入BGP当中的。它有3种类型,分别是IGP,EGP和Incomplete。在其他因素相同的情况下,同一条路由的学习,BGP会优先选择属性值小的路由放入路由表,即IGP优于EGP,EGP优于Incomplete。
AS_PATH属性是公认必遵属性,其主要目的是保证AS之间无环路,因为AS_PATH属性会记录某条路由从始发地到目的地经过的所有AS号。当BGP路由器将路由传递到其他AS时,便会把自己的AS号添加到AS列表的最前端。收到此路由条目的EBGP对等体根据AS_PATH属性就会知道去往目的网络所要经过的AS。AS列表越长,说明距离目的网络越远,因此,当去往目的网络存在多条路径的时候,BGP路由器会比较AS_PATH列表的长短,优先选择AS_PATH短的路由进行数据转发。
NEXT_HOP属性是公认必遵属性,它用来描述去往目的网络的下一跳地址。如果路由发布给EBGP对等体,NEXT_HOP属性填写BGP发言者的IP地址;如果路由发布给IBGP对等体,且路由来自AS内部,则NEXT_HOP属性填写BGP发言者的IP地址;如果路由发布给IBGP对等体,且路由来自AS外部,则NEXT_HOP属性保留原始的AS外部EBGP对等体的IP地址。即NEXT_HOP属性指向路由发布者。
LOCAL_PREF属性是公认可选属性,仅在IBGP对等体之间交换,不会传递给其他AS,除非AS建立联盟。该属性用于判断流量离开本AS时的最佳路由。假设公司网络有两个AS出口,分别连接不同的ISP,一个是中国电信,一个是中国网通,针对某些特定业务,需要控制流量从特定的AS出口转发,那么可以对这两个AS边界路由器应用LOCAL_PREF属性,AS内部的路由器将优先选择LOCAL_PREF属性值高的路由进行数据转发,LOCAL_PREF属性值默认为100。
MED属性是可选非传递属性,只在相邻两个AS之间传递,收到此属性的AS不会再将其传递给其他AS。MED属性相当于内部网关路由协议中使用的度量值(Metric),用于判断流量进入AS时的最佳路由,其用途是告知EBGP邻居进入本AS的最优路径。
BGP路由协议是目前应用最广的EGP路由协议,掌握好BGP协议是每一位高级网络维护人员的必修课。本文简单介绍了BGP的基本原理和特点,望对读者能有所帮助。