text: 边界网关协议（BGP）是运行于 TCP 上的一种自治系统的路由协议。 BGP 是唯一一个用来处理像因特网大小的网络的协议，也是唯一能够妥善处理好不相关路由域间的多路连接的协议。 BGP 构建在 EGP 的经验之上。 BGP 系统的主要功能是和其他的 BGP 系统交换网络可达信息。网络可达信息包括列出的自治系统（AS）的信息。这些信息有效地构造了 AS 互联的拓扑图并由此清除了路由环路，同时在 AS 级别上可实施策略决策。
  边界网关协议释义
  （BGP/BGP4：Border Gateway Protocol，边界网关协议）
  BGP-4 提供了一套新的机制以支持无类域间路由。这些机制包括支持网络前缀的通告、取消 BGP 网络中 “ 类 ” 的概念。 BGP-4 也引入机制支持路由聚合，包括 AS 路径的集合。这些改变为提议的超网方案提供了支持。BGP-4 采用了路由向量路由协议，在配置BGP时，每一个自治系统的管理员要选择至少一个路由器作为该自治系统的“BGP发言人”。
  1989年发布了主要的外部网关协议：边界路由协议（BGP），新版本BGP-4 是在1995年发布的。
  BGP路由选择协议执行中使用4种分组：打开分组（open）、更新分组（update）、存活分组（keepalive）、通告分组（notification）。
  边界网关协议简介
  BGP用于在不同的自治系统（AS）之间交换路由信息。当两个AS需要交换路由信息时，每个AS都必须指定一个运行BGP的节点，来代表AS与其他的AS交换路由信息。这个节点可以是一个主机。但通常是路由器来执行BGP。两个AS中利用BGP交换信息的路由器也被称为边界网关（Border Gateway）或边界路由器（Border Router）。
  由于可能与不同的AS相连，在一个AS内部可能存在多个运行BGP的边界路由器。同一个自治系统(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。
  BGP属于外部网关路由协议，可以实现自治系统间无环路的域间路由。BGP是沟通Internet广域网的主用路由协议，例如不同省份、不同国家之间的路由大多要依靠BGP协议。BGP可分为IBGP（Internal BGP）和EBGP（External BGP）。BGP的邻居关系（或称通信对端/对等实体）是通过人工配置实现的，对等实体之间通过TCP（端口179)会话交互数据。BGP路由器会周期地发送19字节的保持存活keep-alive消息来维护连接（默认周期为30秒）。在路由协议中，只有BGP使用TCP作为传输层协议。
  IETF先后为BGP制定了多个建议，分别为：
  RFC 4271：当前正使用的BGP协议版本，称之为BGP4。
  RFC 1654：BGP4协议的第一个规范。
  RFC 1105、RFC 1163、RFC 1267、RFC1771：BGP4之前的BGP版本。
  BGP属于外部或域间路由协议。BGP的主要目标是为处于不同AS中的路由器之间进行路由信息通信提供保障。BGP既不是纯粹的矢量距离协议，也不是纯粹的链路状态协议，通常被称为通路向量路由协议。这是因为BGP在发布到一个目的网络的可达性的同时，包含了在IP分组到达目的网络过程中所必须经过的AS的列表。通路向量信息时十分有用的，因为只要简单地查找一下BGP路由更新的AS编号就能有效地避免环路的出现。BGP对网络拓扑结构没有限制，其特点包括：
  （1）实现自治系统间通信，传播网络的可达信息。BGP 是一个外部网关协议，允许一个AS与另一个AS进行通信。BGP允许一个AS向其他AS通告其内部的网络的可达性信息，或者是通过该AS可达的其他网络的路由信息。同时，AS也能够从另一个AS中了解这些信息。与距离向量选路协议类似，BGP为每个目的网络提供的是下一跳（next-hop）结点的信息。
  （2）多个BGP路由器之间的协调。如果在一个自治系统内部有多个路由器分别使用BGP与其他自治系统中对等路由器进行通信，BGP可以协调者一系列路由器，使这些路由器保持路由信息的一致性。
  （3）BGP支持基于策略的选路（policy-base routing）。一般的距离向量选路协议确切通告本地选路中的路由。而BGP则可以实现由本地管理员选择的策略。BGP路由器可以为域内和域间的网络可达性配置不同的策略。
  （4）可靠的传输。BGP路由信息的传输采用了可靠地TCP协议。
  （5）路径信息。在BGP通告目的网络的可达性信息时，处理指定目的网络的下一跳信息之外，通告中还包括了通路向量（path vector），即去往该目的网络时需要经过的AS的列表，使接受者能够了解去往目的网络的通路信息。
  （6）增量更新。BGP不需要再所有路由更新报文中传送完整的路由数据库信息，只需要在启动时交换一次完整信息。后续的路由更新报文只通告网络的变化信息。这种网络变化的信息称为增量（delta）。
  （7）BGP支持无类型编制（CIDR）及VLSM方式。通告的所有网络都以网络前缀加子网掩码的方式表示。
  （8）路由聚集。BGP允许发送方把路由信息聚集在一起，用一个条目来表示多个相关的目的网络，以节约网络带宽。
  （9）BGP还允许接收方对报文进行鉴别和认证，以验证发送方的身份。
  边界网关协议BGP消息类型及状态转换
  BGP使用如下四种消息类型：
  BGP邻居建立中的状态和过程如下：
  边界网关协议BGP路由通告原则
  BGP在进行路由通告的时候，需要遵循以下原则：
  边界网关协议BGP属性
  路由器发送关于目标网络的BGP更新消息，更新的度量值被称为路径属性。属性可以是公认的或可选的、强制的或自由决定的、传递的或非传递的。属性也可以是部分的。并非组织的和有组合的都是合法的，路径属性分为4类：公认必遵、公认自决、可选过渡、可选非过渡。
  公认属性：
  可选属性：
  （1）公认必遵（Well-Known Mandatory）
  ORIGIN（起源）：这个属性说明了源路由是怎样放到BGP表中的。有三个可能的源IGP,EGP,以及INCOMPLETE.路由器在多个路由选择的处理中使用这个信息。路由器选择具有最低ORIGIN类型的路径。
  AS_PATH（AS路径）：指出包含在UPDATE报文中的路由信息所经过的自治系统的序列。
  Next_HOP(下一跳)声明路由器所获得的BGP路由的下一跳，对EBGP会话来说，下一跳就是通告该路由的邻居路由器的源地址。
  （2）公认自决（Well-Known Discretionary）
  LOCAL_PREF(本地优先级)：本地优先级属性是用于告诉自治系统内的路由器在有多条路径的时候，怎样离开自治系统。本地优先级越高，路由优先级越高。
  ATOMIC_AGGREGATE(原子聚合)：原子聚合属性指出已被丢失了的信息。
  （3）可选过渡（Optional Transitive）
  AGGREGATOR(聚合者)：此属性标明了实施路由聚合的BGP路由器ID和聚合路由的路由器的AS号。
  COMMUNITY(团体)：此属性指共享一个公共属性的一组路由器。
  （4）可选非过渡（Optional Nontransitive）
  MED(多出口区分)：该属性通知AS以外的路由器采用哪一条路径到达AS,它也被认为是路由的外部度量，低MED值表示高的优先级。
  ORIGINATOR_ID(起源ID)：路由反射器会附加到这个属性上，它携带本AS路由器的路由器ID，用以防止环路。
  CLUSTER_LIST(簇列表)：此属性显示了采用的反射路径。
  边界网关协议协议结构
  Marker （16 bytes） Length （2 bytes） Type （1 byte）
  Marker – 信息包含信息接收端可预测值。
  Length – 包含协议头的信息长度。
  Type –信息类型。信息可能是：Open、Update、Notification、Keepalive。
  打开（Open）分组，用来与相邻的另一个BGP发言人建立联系
  更新（Update）分组，用来发送某一路由的信息，以及列出多条要撤销的路由
  保活（Keepalive）分组，用来确认打开分组和周期性地证实邻站关系
  通知（Notification）分组，用来发送检测到的差错
  在传输协议连接建立之后，各端发送的第一个信息是 OPEN 信息。如果 OPEN 信息可以接收，会返回发送确认 OPEN 信息的 KEEPALIVE 信息。一旦 OPEN 信息获得确认，UPDATE、KEEPALIVE 和 NOTIFICATION 信息进行相互交换。
  BGP的报文结构如下所示
  16字节 2字节 1字节
  BGP的报文分成报文与报文数据两部分，其中，BGP报文数据根据不同的报文类型有所不同，报文头由以下3个字段构成：
  （1）标记（Marker）字段。标记字段由16个字节构成。标记字段的值是一个通信双方（对等路由器） 都可认可的字节串，双方都统一使用改制来标识一个合法的BGP报文的开始。通常，标记字段用于承载鉴别信息。对于通信双方，在任何情况下标记的值都必须保持一致。标记字段用于报文接收的同步。由于BGP报文用过TCP来简化，而TCP 协议是一个无结构的流（stream）传输协议。在TCP协议上部位高层提供数据流的结构识别，因此也无法为BGP标识两个报文之间的边界。由于传输协议不指定报文边界，因此，为了确保发送方和接收方的报文边界准确保持同步，BGO要求在每个报文的开头放置了一个双方已知的序列，接收方通过该序列来检验报文头的正确性。
  （2）报文长度，16比特，制定了以字节为单位计算的报文总长度。最小的报文为19i节，最大允许报文长度为4096字节。
  （3）报文类型，1字节，指出报文所属的类型。
  BGP的路由更新消息一BGP报文形式在路由器间交换，BGP为了实现其功能定义了4种报文类型。
  （1）打开（OPEN）报文
  当两个BGP对等路由器之间建立以一个TCP连接以后，就分别发送一个打开报文，声明各自的自治系统号，并确定其他操作参数。
  路由器接受到来自对等路由器的OPEN 报文时，BGP将发送一个KEEPALIVE报文。在路由器之间交换选路信息之前，通信双方都必须发送一个OPEN报文，并接受一个KEEPALIVE报文。KEEPALIVE报文可以用作对OPEN报文的确认。
  （2）更新（UPDATE）报文
  对等的BGP路由器之间创建了TCP连接，并成功接收到对OPEN报文的KEEPALIVE确定报文，对等路由器之间就可以使用路由更新消息报文来通告网络的可达性信息。通告的的内容可以是新的可达的目的网络，也可以是通告撤销原来的某些目的网络的可达性。
  （3）保持激活（KEEPALIVE）报文
  保持激活报文用于在两个BGP对等路由器之间定期测试网络连接性，并证实对等路由器的正常工作。由于TCP协议本身没有提供自动的连接状态的通知机制，对等路由器之间定制交换KEEPALIVE报文可以使BGP实体能够检测TCP连接是否工作正常。保持激活报文仅包含标准的BGP报文头（类型4），报文长度为19字节。
  （4）通知（NOTIFICATION）报文
  BGP在发现错误时（或需要进行控制时），可以利用通知报文来通知对等路由器。一旦通知报文，路由器检测来检查到了出现的错误，BGP就会向对等路由器发送一个通知报文，然后关闭TCP连接终止通信。
  边界网关协议BGP MCE
  MCE 功能是Multi-CE 的简称，具有MCE 功能的网络设备可以在BGP/MPLS VPN 组网应用中承担多个VPN 实例的CE 功能，减少用户网络设备的投入。
  BGP/MPLS VPN以隧道的方式解决了在公网中传送私网数据的问题，但传统的BGP/MPLS VPN架构要求每个VPN实例单独使用一个CE与PE相连，如图 所示。
  随着用户业务的不断细化和安全需求的提高，很多情况下一个私有网络内的用户需要划分成多个VPN，不同VPN 用户间的业务需要完全隔离。此时，为每个VPN 单独配置一台CE 将加大用户的设备开支和维护成本；而多个VPN 共用一台CE，使用同一个路由表项，又无法保证数据的安全性。使用MCE 功能，可以有效解决多VPN 网络带来的用户数据安全与网络成本之间的矛盾，它使用CE 设备本身的VLAN 接口编号与网络内的VPN 进行绑定，并为每个VPN 创建和维护独立的路由转发表（Multi-VRF）。这样不但能够隔离私网内不同VPN 的报文转发路径，而且通过与PE 间的配合，也能够将每个VPN 的路由正确发布至对端PE，保证VPN报文在公网内的传输。
  下面举例介绍MCE对多个VPN的路由表项进行维护，并与PE交互VPN路由的过程：
  如右图所示，左侧私网内有两个VPN站点：VPN1 和VPN2，分别通过MCE设备接入MPLS骨干网，其中VPN1 和VPN2 的用户，需要分别与远端VPN1用户和VPN2 用户建立VPN隧道。通过配置MCE 功能，可以在MCE 设备上为VPN1 和VPN2 创建各自的路由转发表，并使用VLAN 2 接口与VPN1 进行绑定、VLAN 3 与VPN2 进行绑定。在接收路由信息时，MCE 设备根据接收接口的编号，即可判断该路由信息的来源，并将其维护到对应VPN 的路由转发表中。同时，在PE1 上也需要将连接MCE 的接口与VPN 进行绑定，绑定的方式与MCE 设备一致。MCE与PE1 之间通过Trunk 链路连接，并允许VLAN 2 和VLAN 3 的报文携带VLAN Tag 传输，从而使PE1 在接收时可以根据报文所属VLAN 判别该报文属于哪一个VPN，将报文在指定的隧道内传输。
  MCE 设备是如何将多个VPN 实例的私网路由信息准确传播到PE 设备？这包括两部分：MCE与VPN站点的路由信息交换，MCE与PE之间的路由信息交换。这些路由信息的交换都有很多种方法，如静态路由、RIP、OSPF、ISIS、BGP路由协议。如果使用BGP路由协议来实现路由信息交换，则就是使用BGP MCE功能，因此BGP MCE功能就是BGP协议支持VRF，能够实现VRF下BGP路由信息的交换。需要在MCE 上为每个VRF 实例配置BGP 对等体，并引入相应VPN 内的IGP 路由信息。由于各个VPN 间正常情况下是处在不同的AS 内，因此使用EBGP 进行路由的传播。