1、BGP 介绍
1.1 相关术语
1.2 BGP协议特点
当前使用的版本是BGP-4。
BGP作为事实上的Internet外部路由协议标准,被广泛应用于ISP(Internet Service Provider)之间。
BGP协议具有如下特点:
- BGP是一种外部网关协议(EGP),与OSPF、RIP等内部网关协议(IGP)不同,其着眼点不在于发现和计算路由,而在于在AS之间选择最佳路由和控制路由的传播。
- BGP使用TCP作为其传输层协议,提高了协议的可靠性。
- BGP进行域间的路由选择,对协议的稳定性要求非常高。因此用TCP协议的高可靠性来保证BGP协议的稳定性。
- BGP的对等体之间必须在逻辑上连通,并进行TCP连接。目的端口号为179,本地端口号任意。
- BGP支持无类别域间路由CIDR(Classless Inter-Domain Routing)。
路由更新时,BGP只发送更新的路由,大大减少了BGP传播路由所占用的带宽,适用于在Internet上传播大量的路由信息。 - BGP是一种距离矢量(Distance-Vector)路由协议。 BGP从设计上避免了环路的发生。
AS之间:BGP通过携带AS路径信息来标记途经的AS,带有本地AS号的路由将被丢弃,从而避免了域间产生环路。
AS内部:BGP在AS内学到的路由不再通告给AS内的BGP邻居,避免了AS内产生环路。 - BGP提供了丰富的路由策略,能够对路由实现灵活的过滤和选择。 BGP提供了防止路由振荡的机制,有效提高了Internet网络的稳定性。
- BGP易于扩展,能够适应网络新的发展。
1.3 BGP4+定义
BGP4+是一种用于自治系统AS(Autonomous System)之间的动态路由协议,它是对BGP的扩展。
传统的BGP4只能管理IPv4的路由信息,对于使用其它网络层协议(如IPv6等)的应用,在跨自治系统传播路由信息时就受到一定限制。
为了实现对IPv6协议的支持,BGP4需要将IPv6协议的信息反映到NLRI(Network Layer Reachable Information)属性及Next_Hop属性中。
BGP4+中引入的两个NLRI属性分别是:
MP_REACH_NLRI:Multiprotocol Reachable NLRI,多协议可达NLRI。用于发布可达路由及下一跳信息。
MP_UNREACH_NLRI:Multiprotocol Unreachable NLRI,多协议不可达NLRI。用于撤销不可达路由。
BGP4+中的Next_Hop属性用IPv6地址来表示,可以是IPv6全球单播地址或者下一跳的链路本地地址。
BGP4+是利用BGP的多协议扩展属性,来达到在IPv6网络中应用的目的,BGP协议原有的消息机制和路由机制并没有改变。
2 BGP基本原理
2.1 运行方式
BGP在设备上以下列两种方式运行:
IBGP(Internal BGP):当BGP运行于同一AS内部时,被称为IBGP。
EBGP(External BGP):当BGP运行于不同AS之间时,称为EBGP。
2.2 消息的角色
Speaker:发送BGP消息的设备称为BGP发言者(Speaker),它接收或产生新的路由信息,并发布(Advertise)给其它BGP Speaker。当BGP Speaker收到来自其它AS的新路由时,如果该路由比当前已知路由更优、或者当前还没有该路由,它就把这条路由发布给所有其他BGP Speaker(发布该路由的BGP Speaker除外)。
Peer:相互交换消息的BGP Speaker之间互称对等体(Peer)。
2.3 BGP 消息
BGP的运行是通过消息驱动的,共有Open、Update、Notification、Keepalive和Route-refresh5种消息类型。
- Open消息:是TCP连接建立后发送的第一个消息,用于建立BGP对等体之间的连接关系。对等体在接收到Open消息并协商成功后,将发送Keepalive消息确认并保持连接的有效性。确认后,对等体间可以进行Update、Notification、Keepalive和Route-refresh消息的交换。
- Update消息:用于在对等体之间交换路由信息。Update消息可以发布多条属性相同的可达路由信息,也可以撤销多条不可达路由信息。
一条Update消息可以发布多条具有相同路由属性的可达路由,这些路由可共享一组路由属性。所有包含在一个给定的Update消息里的路由属性适用于该Update消息中的NLRI(Network Layer Reachability Information)字段里的所有目的地(用IP前缀表示)。
一条Update消息可以撤销多条不可达路由。每一个路由通过目的地(用IP前缀表示),清楚的定义了BGP Speaker之间先前通告过的路由。
一条Update消息可以只用于撤销路由,这样就不需要包括路径属性或者NLRI。相反,也可以只用于通告可达路由,就不需要携带撤销路由信息了。 - Notification消息:当BGP检测到错误状态时,就向对等体发出Notification消息,之后BGP连接会立即中断。
- Keepalive消息:BGP会周期性的向对等体发出Keepalive消息,用来保持连接的有效性。
- Route-refresh消息:Route-refresh消息用来请求对等体重新发送所有的可达路由信息。
在所有BGP设备使能Route-refresh能力的情况下,如果BGP的入口路由策略发生了变化,本地BGP设备会向对等体发布Route-refresh消息,收到此消息的对等体会将其路由信息重新发给本地BGP设备。这样,可以在不中断BGP连接的情况下,对BGP路由表进行动态刷新,并应用新的路由策略。
2.4 BGP有限状态机
BGP有限状态机共有六种状态,分别是Idle、Connect、Active、OpenSent、OpenConfirm和Established。
在BGP对等体建立的过程中,通常可见的三个状态是:Idle、Active、Established。
Established状态下,BGP对等体间可以交换Update报文、Route-refresh报文、Keepalive报文和Notification报文。
1、Idle
BGP协议初始时是处于Idle状态。在这个状态时,系统不分配任何资源,也拒绝所有进入的BGP连接。只有收到Start Event时,才分配BGP资源,启动ConnectRetry计时器,启动对其它BGP对等体的传输层连接,同时也侦听是否有来自其它对等体的连接请求。
2、Connect
这个状态下,BGP等待TCP完成连接。若连接成功,本地清空ConnectRetry计时器,并向对等体发送OPEN报文,然后状态改变为OpenSent状态;否则,本地重置ConnectRetry计时器,侦听是否有对等体启动连接,并移至Active状态。
3、Active
这个状态下,BGP初始化TCP连接来获得一个对等体。如果连接成功,本地清空ConnectRetry计时器,并向对等体发送OPEN报文,并转至OpenSent状态。
4、OpenSent
这个状态下,BGP等待对等体的OPEN报文。收到报文后对报文进行检查,如果发现错误,本地发送NOTIFICATION报文给对等体,并改变状态为IDLE。如果报文正确,BGP发送KEEPALIVE报文,并转至OpenConfirm状态。
5、OpenConfirm
这个状态下,BGP等待KEEPALIVE或NOTIFICATION报文。如果收到KEEPALIVE报文,则进入Established状态,如果收到NOTIFICATION报文,则变为Idle状态。
6、Established
这个状态下, BGP可以和其他对等体交换UPDATE,NOTIFICATION,KEEPALIVE报文。如果收到了正确的UPDATE或KEEPALIVE报文,就认为对端处于正常运行状态,本地重置Hold Timer。如果收到NOTIFICATION报文,本地转到Idle状态。如果收到错误的UPDATE报文,本地发送NOTIFICATION报文通知对端,并改变本地状态为Idle。如果收到了TCP拆链通知,本地关闭BGP连接,并回到Idle状态。
综上,我们可以画出BGP的有限状态机如图4所示:
2.5 BGP处理过程
因为BGP的传输层协议是TCP协议,所以在BGP对等体建立之前,对等体之间首先进行TCP连接。BGP邻居间会通过Open消息协商相关参数,建立起BGP对等体关系。
建立连接后,BGP邻居之间交换整个BGP路由表。BGP协议不会定期更新路由表,但当BGP路由发生变化时,会通过Update消息增量地更新路由表。
BGP会发送Keepalive消息来维持邻居间的BGP连接。
当BGP检测到网络中的错误状态时(例如收到错误报文时),BGP会发送Notification消息进行报错,BGP连接会随即中断。
3、抓包看bgp链接过程
###3.1 BGP tcp 链接建立
BGP协议默认使用端口号179,下图是TCP 三次握手的流程,每个包显示了2次。连接建立后进入Active会发送一个Open消息bgp进入openSent状态。
发送一个open消息发送
3.2 OpenSent状态等待对端回复BGP open 消息
收到对端恢复BGP open消息后,如果检查正确,就会发keeplive报文,状态切换到OPenConfirm状态,
3.3 OPENconfirm状态收到对端keeplive报文后,切换成Established
参考资料:
1、华为守则:https://support.huawei.com/enterprise/zh/doc/EDOC1100092829/d5eaaee8