1、定义
边界网关协议( 英文:BGP, Border Gateway Protocol)是互联网上一个核心的去中心化自治路由协议。它通过维护IP路由表或‘前缀’表来实现自治系统(AS)之间的可达性,属于矢量路由协议。 BGP不使用传统的内部网关协议(IGP)的指标,而使用基于路径、网络策略或规则集来决定路由。因此,它更适合被称为矢量性协议,而不是路由协议。
BGP是为了取代外部网关协议(EGP)协议而创建的,允许运行一个完全分散的路由系统,从ARPANET模型的核心路由系统过渡到包括NSFNET骨干网及其相关区域网络的分散系统。这使得互联网成为一个真正的分权制度。自1994年以来,第四版本的BGP在互联网上使用,所有以前的版本现在已经过时不可用。在第4版主要的增强功能是通过支持无类别域间路由和路由聚合来减少路由表的大小。第4版是在早期的RFC 1771第4版的基础上编纂,通过20多个草案修改,最终在2006年1月通过形成RFC 4271。RFC 4271版本纠正了一些错误,澄清模糊之处,带来了更接近工业级应用标准的RFC行业惯例。
大多数互联网服务提供商(ISP)必须使用BGP来与其他ISP建立路由连接(尤其是当它们采取多宿主连接时)。因此,即使大多数互联网用户不直接使用它,但是与7号信令系统(SS7)相比,即通过PSTN的跨供应商核心响应设置协议,BGP仍然是互联网最重要的协议之一。特大型的私有IP网络也可以使用BGP。例如当需要将若干个大型的开放最短路径优先(OSPF)网络进行合并,而开放最短路径优先协议本身又无法提供这种可扩展性时。使用BGP的另一个原因是其能为多宿主的单个ISP(RFC 1998)或多个ISP网络提供更好的冗余网络。

 
2、 操作

 
2.1 BGP router connectivity and learning routes

BGP的邻居关系(或称通信对端/对等实体)是通过人工配置实现的,对等实体之间通过TCP(端口179)会话交互数据。BGP路由器会周期地发送19字节的保持存活keep-alive消息来维护连接(默认周期为30秒)。在路由协议中,只有BGP使用TCP作为传输层协议。
同一个AS自治系统中的两个或多个对等实体之间运行的BGP 被称为 IBGP(Internal/Interior BGP)。归属不同的AS的对等实体之间运行的BGP称为EBGP (External/Exterior BGP)。在AS边界上与其他AS交换信息的路由器被称作边界路由器(border/edge router)。在Cisco IOS中,iBGP通告的路由的距离为200,优先级比eBGP和任何内部网关协议(IGP)通告的路由都低。其他的路由器实现中,优先级顺序也是eBGP高于IGP,而IGP又高于IBGP。

 
同一AS内 如果有多个路由器参与BGP路由,则它们之间必须配置成全连通的mesh网格结构:任意两个路由器之间都必须配置成对等实体。这样做会带来扩展方面的问题,因为所需要的(TCP)连接数是(BGP)路由器数量的平方。为缓减这个问题,BGP支持两种选项:route reflectors (RFC 4456) 和 confederations (RFC 5065)。 下面讨论了在全连通的IBGP网格中的基本更新处理(UPDATE)。

 
2.2 Basic update processing

 
NLRI(Network Layer Reachability Information 网络层可达信息)。
一个BGP路由器可以从多个邻居接收 NLRI 更新信息,并且将(自己拥有的)NLRI信息 通告给自己的邻居们(与 收到NLRI更新消息的邻居 可以不一致)。 BGP维护自己的“master routing table”路由表,称为Loc-RIB (Local Routing Information Base), 注意与路由器的 "main routing table"的区别。针对每一个邻居,当前BGP的进程(可以理解成 本地BGP实体)维护一个Adj-RIB-In (Adjacetn Routing Information Base, Incoming),记录从该邻居收到的NLRI消息;还要维护一个Adj-RIB-Out (Outgoing),记录从本地BGP实体发送给该邻居的NLRI信息。
在上一段中提到的Loc-RIB, Adj-RIB-In和Adj-RIB-Out的具体实现(这些RIB的物理存储和结构)都由不同的厂商在实现BGP时自行决定。虽然本地路由器上往往通过管理指令查询这些RIB,但BGP路由器并不关心其他BGP路由器是如何实现这些RIB的。具体实现方法可以不同,大家往往把两个Adj-RIBs和loc-RIB存在同一个数据结构中,依靠每个RIB表项后附加的额外信息来区分。BGP进程可以从附加信息中得知很多信息,例如 哪些表项是属于为某个特定邻居准备的Adj-RIBs,Loc-RIB表项是否有资格被递交给 本地路由器的路由表管理进程,whether the per-neighbor route selection process made received policies eligible for the Loc-RIB。
如果Loc-RIB 表项有资格被提交给本地路由器的路由表管理进程,BGP会把自认为最优的多条路由递交给main routing table 进程。所递交的BGP路由是否被选用,则是完全由上述进程的具体实现决定的。例如,如果从路由器的本地端口获知某一前缀与本路由器直接相连,则通常会选择直接转发的路由。只要直连的端口还在正常工作,去向该目的前缀的BGP路由 就不会被真正 纳入路由表(main routing table)。如果直连端口无法正常工作,并且不存在优先级较高的路由,则Loc-RIB路由表项就会被 载入 main routing table。之前有一个常见的误解,认为BGP传送各种策略。实际上BGP只传送信息,基于这些信息,BGP进程可以做决策。有些信息显然是用于决策的,例如communities和multi-exit discriminators (MED).

 

2.3 Route selection

在选择合适的NLRI 加入loc-RIB时,BGP标准规定了很多决策准则。评价NLRI的第一个准则就是判断它的下一跳属性next-hop attribute 必须是可达 (reachable or resolvable)。下一跳可达 还可以做如下解释:在本路由器的main routing table中,有一条active可用的路由,指向next-hop address所在的前缀。 或则话说,必须有一条active可用的路由去向 next-hop
其次, 针对每个邻居,本地BGP进程 可以采用不同的标准和厂商自定的原则 决定 哪些路由可以加入该邻居对应的Adj-RIB-in。 邻居可以把去向某个目的地的多条路由发给你,but the first level of preference is at the neighbor level. 对于某个目的地,只有一条路由会被加入所谓的Adj-RIB-In (注:在本地,针对每个邻居都有一个Adj-RIB-In)。如果邻居撤销了任何路由,该BGP进程还要负责从Adj-RIB-In中删除对应的条目(如果有)。
如果某个Adj-RIB-In发生变化, 本地的main BGP进程将判断 对应的邻居通告的新路由 是否比Loc-RIB中现有路由更好。如是,将进行替换。如果某个路由被邻居撤销,而且没有别的路由指向相应的目的地,则需要从Loc-RIB中删除相应的路由表项,并且BGP不再将该表项递交给main routing table manager。 如果OSPF或其他非BGP协议也没能为本路由器找到一条指向该目的地的路由,则相应的路由表项将从main routing table中删除。

2.4 Per-neighbor decisions

如果某条路由信息(NLRI)来自一个本域内的对等实体(IBGP),BGP标准规定的第一条准则就是检查 LOCAL_PREFERENCE(以下简称LOCAL_PREF)属性。如果来自邻居(同一AS域)的多条IBGP路由指向同一目的前缀,则选择具有最高LOCAL_PREF的那条路由。如果恰巧有多条路由都具有相同的最高LOCAL_PREF,则执行下一条准则。标准中规定LOCAL_PREF为第一准则,一旦确定了NEXT_HOP可达,Cisco和其他几个厂商首先考虑了本地路由器定义的WEIGHT值(该属性仅在本地路由器有效,不会通过BGP扩散),即选择具有最大WEIGHT的路由。
可以通过本地配置或控制软件能够操纵manupulate LOCAL_PREF、WEIGHT以及其他的准则。标准中并未定义这样的操纵,但在实际产品中广泛存在。例如,BGP选择进程(selection process)并不直接使用COMMUNITY属性(见下面)。但BGP邻居进程(neighbor process)可以根据手动配置的规则 来设置LOCAL_PREF或别的factor的属性值。例如,当COMMUNITY属性值满足某种模式匹配准则(或者说具有某种模式)时,BGP邻居进程就可以修改LOCAL_PREF的值。如果某条路由是从相邻AS的某个对等实体(BGP)获知的,per-neighbor BGP process会根据本地的策略规则计算该路由的LOCAL_PREF,并且与来自同一邻居的其他路由的LOCAL_PREF比较大小。
如果不考虑厂商自己对规则的修改,在BGP协议中, per-neighbor level 上依次执行下面的准则,直至选出唯一的一条路由:
1) 选择具有最短AS_PATH的路径。AS_PATH是由到达通告中的目的地所必须经过的AS号组成。AS1-AS2-AS3比 AS4-AS5-AS6-AS7短。
2) (如果多条路由具有相同的AS_PATH长度) 选择具有最小ORIGIN值的路由,
3) (如果多条路由具有相同的ORIGIN) 选择具有最小MED值的路由