BGP协议

基本概述

BGP是一种用于在不同自治系统(AS)之间交换路由信息和可达性信息的路径矢量路由协议。

BGP特征

1、BGP使用TCP作为其传输层协议(监听端口号为179),提高了协议的可靠性不需要专门的机制来确保连接的可控性。BGP进行域间的路由选择,对协议的稳定性要求非常高。因此用TCP协议的高可靠性来保证BGP协议的稳定性。BGP的对等体之间必须在逻辑上连通,并进行TCP连接。目的端口号为179,本地端口号任意。

2、路由更新时,BGP只发送更新的路由,大大减少了BGP传播路由所占用的带宽,适用于在Internet上传播大量的路由信息。

3、BGP从设计上避免了环路的发生。

AS之间:BGP通过携带AS路径信息来标记途经的AS,带有本地AS号的路由将被丢弃,从而避免了域间产生环路。

AS内部:BGP在AS内学到的路由不再通告给AS内的BGP邻居,避免了AS内产生环路。

4、支持无类别域间路由(CIDR)和VLSM

5、BGP提供了丰富的路由策略;提供了防止路由振荡的机制;BGP也易于扩展

6、外部网关协议与OSPF、EIGRP等内部网关协议(IGP) 相对,BGP设计用于在网络之间运行,而非网络内部。

AS区域

AS是指在一个实体管辖下的拥有相同选路策略的IP网络。

AS号(ASN):

范围: 16位(1-65535),现已扩展为32位。

公有ASN: (1-64511) - 用于在互联网上交换路由,需要向地区互联网注册机构(RIR,如APNIC, ARIN)申请。

私有ASN: (64512-65535) - 用于私有网络,例如在MPLS VPN中,不会在公网上传播。

BGP邻居关系

BGP路由器之间必须建立TCP连接才能交换路由信息。建立邻居的过程称为有限状态机(FSM)。

邻居类型

EBGP(外部BGP): 位于不同AS的BGP路由器之间建立的邻居关系。

默认情况下,eBGP邻居的TTL值被设置为1,意味着它们必须直连。可以通过 ebgp-multihop 命令改变此行为。

IBGP(内部BGP): 位于同一AS内的BGP路由器之间建立的邻居关系。

用于在AS内部传播从eBGP学来的路由,保证AS内部所有BGP路由器路由信息的一致性。

iBGP水平分割规则: 从一台iBGP对等体学来的路由,不会传递给其他iBGP对等体。这是为了防止在AS内产生路由环路。

交互角色

Speaker:发送BGP消息的路由器称为BGP发言者,它接收或产生新的路由信息,并发布给其它BGP Speaker。

Peer:相互交换消息的BGP Speaker之间互称对等体(Peer),若干相关的对等体可以构成对等体组(Peer Group)。

消息类型

  • Open消息:负责协商邻居参数是TCP连接建立后发送的第一个消息,用于建立BGP对等体之间的连接关系。对等体在接收到Open消息并协商成功后,将发送Keepalive消息确认并保持连接的有效性。确认后,对等体间可以进行Update、Notification、Keepalive和Route-Refresh消息的交换。
  • Update消息:路由的更新(新增或撤销)信息用于在对等体之间交换路由信息。Update消息可以发布多条属性相同的可达路由信息,也可以撤销多条不可达路由信息。
  • Keepalive消息:维持邻居关系BGP会周期性的向对等体发出Keepalive消息,用来保持连接的有效性。
  • Notification消息:路由的更新(新增或撤销)信息当BGP检测到错误状态时,就向对等体发出Notification消息,之后BGP连接会立即中断。
  • Route-Refresh消息:通过OPEN消息告知BGP peer本地支持路由刷新能力(Route-Refresh capability)。

消息应用

1、通过TCP建立BGP连接时,发送OPEN消息;

2、连接建立后,如果有路由需要发送或路由变化时,发送UPDATE消息通告对端

稳定后要定时发送KEEPALIVE消息以保持BGP连接的有效性;

3、当本地BGP在运行中发现错误时,要发送NOTIFICATION消息通告BGP对等体

ROUTE-REFRESH消息用来通知对等体自己支持路由刷新;

报文格式

BGP通用头部报文

  • Marker(标记 - 16 字节)

作用: 用于同步和对报文进行认证。

填充规则:

如果报文是 OPEN 报文,或者未使用认证,则 Marker 字段必须为 全 1(0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF)。

如果使用了认证机制,则该字段用于认证计算。接收方可以通过验证此字段来确认报文的完整性和真实性。

  • Length(长度 - 2 字节)

作用: 指示整个 BGP 报文(包括头部)的总长度,以字节为单位。

范围: 允许的最小值是 19(16+2+1),最大值是 4096。

  • Type(类型 - 1 字节)

作用: 标识 BGP 报文的类型。有以下 4 种:

1 - OPEN: 建立 BGP 对等体连接。

2 - UPDATE: 交换路由信息(新增或撤销)。

3 - NOTIFICATION: 报告错误并中断 BGP 连接。

4 - KEEPALIVE: 维持 BGP 连接的有效性。

OPEN报文

  • Version(版本 - 1 字节)

BGP 的版本号。当前广泛使用的版本是 4。

  • My Autonomous System(我的自治系统 - 2 字节)

发送方的 AS 号。用于对方确认是 eBGP 还是 iBGP 连接。

  • Hold Time(保持时间 - 2 字节)

对方必须在此时间内收到 KEEPALIVE 或 UPDATE 报文,否则认为连接已失效。

双方会协商使用较小的那个值作为最终的 Hold Time。如果一方提议为 0,则表示不进行保活。

  • BGP Identifier(BGP 标识符 - 4 字节)

发送方的 Router ID,通常是一个 IPv4 地址。在同一个 AS 内必须唯一。

  • Opt Parm Len(可选参数长度 - 1 字节)

指示后面“可选参数”字段的总长度。如果为 0,则表示没有可选参数。

  • Optional Parameters(可选参数 - 变长)

采用 TLV(类型-长度-值)格式。最重要的可选参数是能力协商,用于通告支持的多协议扩展(如 IPv6、VPNv4)、路由刷新能力等。

邻居状态机

BGP有限状态机共有六种状态,分别是Idle、Connect、Active、OpenSent、OpenConfirm和Established

Idle状态

在Idle状态(空闲状态)下,BGP拒绝邻居发送的连接请求。只有在收到本设备的Start事件后,BGP才开始尝试和其它BGP对等体进行TCP连接,并转至Connect状态。

Start事件是由一个操作者配置一个BGP过程,或者重置一个已经存在的过程或者路由器软件重置BGP过程引起的。

任何状态中收到Notification报文或TCP拆除链路通知等Error事件后,BGP都会转至Idle状态。

Connect状态

在Connect状态(连接状态)下,BGP启动连接重传定时器(Connect Retry,缺省为32秒),等待TCP完成连接。

如果TCP连接成功,那么BGP向对等体发送Open报文,并转至OpenSent状态;

如果TCP连接失败,那么BGP转至Active状态;

如果连接重传定时器超时,BGP仍没有收到BGP对等体的响应,那么BGP继续尝试和其它BGP对等体进行TCP连接,停留在Connect状态。

如果发生其他事件(由系统或者操作人员启动的),则退回到Idle状态。

Active状态

在Active状态(活跃状态)下,BGP总是在试图建立TCP连接。

如果TCP连接成功,那么BGP向对等体发送Open报文,关闭连接重传定时器,并转至OpenSent状态;

如果TCP连接失败,那么BGP停留在Active状态;

如果连接重传定时器超时,BGP仍没有收到BGP对等体的响应,那么BGP转至Connect状态。

OpenSent状态

在OpenSent状态(打开报文已发送状态)下,BGP等待对等体的Open报文,并对收到的Open报文中的AS号、版本号、认证码等进行检查。

如果收到的Open报文正确,那么BGP发送Keepalive报文,并转至OpenConfirm状态;

如果发现收到的Open报文有错误,那么BGP发送Notification报文给对等体,并转至Idle状态。

OpenConfirm状态

在OpenConfirm状态(打开确认状态)下,双方 OPEN 报文已成功交换,参数已协商一致,BGP等待Keepalive或Notification报文。

如果收到一个 KEEPALIVE 报文,它认为对等体是存活的,并将状态转移到最终的 Established 状态。它也会启动一个 Keepalive 计时器并发送 KEEPALIVE 报文。

如果收到 NOTIFICATION 报文或 Hold Timer 超时,状态将转回 Idle。

Established状态

在Established状态(已建立状态)下,BGP可以和对等体交换Update、Keepalive、Route-refresh报文和Notification报文。

如果收到正确的Update或Keepalive报文,那么BGP就认为对端处于正常运行状态,将保持BGP连接。

如果收到错误的Update或Keepalive报文,那么BGP发送Notification报文通知对端,并转至Idle状态。

Route-refresh报文不会改变BGP状态。 如果收到Notification报文,那么BGP转至Idle状态。

如果收到TCP拆链通知,那么BGP断开连接,转至Idle状态。

posted @ 2025-10-10 17:16  惠恒博  阅读(28)  评论(0)    收藏  举报