一、BGP概述

BGP是一种用于自治系统AS之间的动态路由协议,早期发布的版本BGP1/BGP2/BGP3,目前使用的版本是BGP4。在早期的3个版本中,BGP交互主要用于交换AS之间的可达路由信息,构建AS域间传播路径,防止路由环路产生,并在AS级别应用一些路由策略。BGP-4版本支持无类别域间路由CIDR。

注意这里的交换词语,BGP就是农夫山泉,它呢不生产水,它只是大自然的搬运工。但是人家搬得好啊。

在举个例子加深下,你可以理解BGP就是微信,然后你在微信上传输各种文件。所以,你能说微信它产生文件吗?
你(OSPF)---------微信(BGP)----------你朋友(OSPF),BGP就是你俩的中间人,负责替你把文件传输OK。

——————————————————————————————————————————————————

二、BGP特点

BGP协议具有以下特点:

1、BGP是一种外部网关协议(EGP),与OSPF、RIP等内部网关协议(IGP)不同,不在于发现和计算路由了,而是在AS之间控制路由传播和选择最佳路由。
2、BGP使用TCP作为传输层协议(端口号179),提高了协议可靠性。
3、BGP进行域间路由选择,对协议稳定性要求非常高,因此可用TCP协议的高可靠来保证BGPP协议的稳定性。
4、在BGP对等体之间必须逻辑上连通,并且进行TCP连接。目的端口号为179,本地端口号任意。
5、BGP支持无类别域间路由CIDR。
6、路由更新时,BGP只发送更新路由,大大减少BGP传播路由所占用的带宽。

BGP是一种距离矢量路由协议,从设计上避免了环路发生。

1、AS之间:通过携带AS路径信息来标记途径的AS,带有本地AS号的路由将被丢弃,从而避免了环路。
2、AS内部:在AS内学到的路由不会在AS中转发,避免了在AS内产生环路。

BGP提供了丰富的路由策略,能够对路由实现灵活的过滤和选择。
BGP提供了防止路由震荡的机制。

1、BGP只在AS之间控制路由传播及选择最佳路径。2、使用TCP协议的179号端口。3、支持无类别CIDR。4、路由更新只发送更新路由。5、设计上防止了环路。6、提供路由策略特性。

——————————————————————————————————————————————————

二、BGP基本术语

——————————————————————————————————————————————————

2.1.BGP发言者(BGP Speaker)

发送BGP消息的路由器就叫BGP发言者,接收或产生新的路由信息并发布给其他BGP发言者。当BGP发言者收到来自其他自治系统的新路由时,如果该路由比当前已知的更优或当前还没有该路由,它就把这条路由发布给自治系统内所有其他BGP发言者。

可以理解运行了BGP协议的路由器,就是BGP发言者。

图中,当R1、R2、R3、R5都运行了BGP协议,他们都发送BGP消息,这些路由器就是BGP发言者。
在这里插入图片描述
——————————————————————————————————————————————————

2.2.Router ID(RID)

和OSPF一样,也是用来在AS中唯一标识一台路由器,如果要运行BGP必须存在RID,RID可以手动指定或协议自动选举,可以和OSPF使用同一RID。

和OSPF一回事,网络标识自己

——————————————————————————————————————————————————

2.3.BGP对等体(BGP Peer)

互相交换消息的BGP 发言者之间互称对等体,若干相关的对等体可以形成对等体组(Peer Group),BGP传输层协议TCP,所以在BGP对等体建立前,首先进行TCP连接,也表明对等体之间首先路由可达。也有人叫BGP邻居。

不用多说,两个BGP发言者通过TCP建立邻居成功,就叫BGP对等体。

如图:AR1和AR2之间、AR2和AR3之间、AR3和AR5之间均是BGP对等体。
在这里插入图片描述
——————————————————————————————————————————————————

2.3.IBGP对等体(Internal BGP Peer)

如果BGP对等体处于同一自治系统内,称为IBGP对等体。如上图,AR2和AR3都处于AS200内,所以它们之间是IBGP对等体。

如果BGP路由器都在一个AS里,就叫IBGP对等体。

——————————————————————————————————————————————————

2.4.EBGP对等体(External BGP Peer)

当BGP对等体处于不同自治系统时,称为EBGP对等体。如上图:AR1和AR2、AR3和AR5,它们之间是EBGP对等体。对于EBGP对等体,尽管BGP连接是基于TCP的,通常则可以配置BGP以允许它们之间经过物理多跳而建立EBGP对等体。

如果BGP路由器处在两个AS间,就叫EBGP对等体。

如图:AR1和AR2、AR3和AR5它们之间都是EBGP对等体,都是有物理直连链路,如果在AR1和AR5上建立EBGP连接,则必须手工在AR1和AR2的路由器上设置多跳,允许它们经过多跳物理链路建立EBGP连接。
在这里插入图片描述
BGP发言者从EBGP对等体获得路由后,会向所有的BGP对等体(包括EBGP和IBGP)通告这些路由。为了防止环路,它不会将学习到的路由再向原发布者发布。

这里记住的就是EBGP对等体(域间)获得路由后,会向所有BGP对等体通告路由。如从A从B学习的,不会在给B通告了。

如图:AR2从EBGP对等体获得路由192.168.1.0/24后,会把此路由信息发送给它的IBGP对等体AR3,同理,AR3也会把这条路由信息发送给它的EBGP对等体AR5,这样的话,192.168.1.0/24就能再AS间传递。但是AR2不能再将这条路由发布给AR1。
在这里插入图片描述
处于同一个AS的BGP对等体为IBGP对等体,也称为IBGP邻居,如下图:IBGP对等体不一定是物理直连,但是一定TCP可达,也就是建立IBGP对等体的路由必须要IGP协议互通。

IBGP邻居:只要网通,不一定非要物理直连。

在这里插入图片描述
为了防止环路,BGP规定,BGP发言者从IBGP获得的路由不向它的IBGP对等体发布。为了防止产生的路由黑洞,BGP发言者从IBGP获得的路由是否发布给它的EBGP对等体与是否同步相关。在上图,AR9从其IBGP对等体获得的路由信息不向AR11、AR8、AR10发布。

——————————————————————————————————————————————————

2.5.IBGP全连接及部分连接

TCP的可靠传输机制和滑动窗口机制可以确保BGP能够可靠传递路由,但是TCP连接是以点到点的单播方式来传输。因此BGP连接只能基于点到点连接。同时BGP是一种距离矢量路由协议,为了避免环路,规定BGP发言者从IBGP对等体获得的路由不能再向其他的IBGP对等体发布。在运行了BGP协议的AS内,确保所有的BGP路由器的路由信息相同,则需要使所有的IBGP路由器保持全连接。

这里这么理解,AR12获得的路由只给它的邻居发,不会给除了它的邻居以外的发布。所以AR15收不到。意思就是大家都运行BGP,都建立邻居就是全连接。

在下图中,IBGP部分连接中,AR12从AR14收到路由信息后,不会将这些路由信息发布给另一个IBGP对等体AR15,这样AR12和AR15之间就无法相互学习到路由。而全连接方式下。AR9和AR10之间有IBGP连接,所以可以相互学习路由。
在这里插入图片描述

——————————————————————————————————————————————————

2.6.BGP的同步

如下图:(可以忽略无视AR21和AR22路由器)路由器之间运行BGP协议并建立了IBGP和EBGP连接,路由器AR19将路由10.1.1.0/24通过EBGP连接发布到AR17。按照BGP发布路由策略,AR17收到后再通过IBGP连接将此路由发送到AR18,AR18再将这条路由发送到AR20。这样AR20的路由表中就有了这条路由,其下一跳指向AR18。此时,如果AR20要转发目的地址是10.1.1.0/24的报文,会通过如下步骤:
在这里插入图片描述
步骤1:AR20将目的地址为10.1.1.0/24的报文发送给AR18。

步骤2:AR18收到此报文后,查找路由表。虽然AR18是从AR17学习到的10.1.1.0/24路由,毕竟他们之间的连接是基于TCP的逻辑连接,去往AR17的实际下一跳为AR16,于是将报文转发给AR16。

步骤3:AR16收到此报文,查找路由表,但是AR16并没有运行BGP协议,无法学习到10.1.1.0/24网段的路由,将报文丢弃。

这个例子举得不太恰当我觉得吧 有漏洞呢。。。。理解就行了哈~~~这里说的其实就是没有全连接造成的问题。就是回程的时候,AR17和AR18是逻辑链路,它要转发还必须得过AR16,结果AR16没运行BGP,所以没路由就丢弃了。。以后就会明白,看网络的规划了,其实也没必要内部都运行BGP。

——————————————————————————————————————————————————

导致以上这种转发黑洞的出现原因是,AR16没有运行BGP协议,学习不到自治系统外的路由。想要避免这种情况,可以在AR17和AR18之间通过一条物理链路来建立IBGP连接。也可以通过路由引入方式,将自制系统外的路由引入到IGP中,使AR16能够通过IGP将报文转发给AR17。上面方法是通过合理的网络规划来避免转发黑洞。除此BGP协议本身还提供避免机制。就是BGP同步功能。

BGP同步是指IBGP和IGP之间的同步,目的是为了防止在某种情况下转发黑洞出现,当开启BGP同步,BGP发言者接收到IBGP邻居发布的路由后,查找路由是否在IGP路由表中。只有当IGP路由表中也有这条路由时,BGP路由表才会将这条路由设置为有效并发布。如果IGP路由表中没有该路由,则设置无效,并不像对等体发布。

如图:如果在AR18上开启了BGP路由同步,当AR18从AR17收到10.1.1.0/24路由后,首先检查自己的IGP路由表中有没有此路由,没有就设置为无效,也不会向AR20通告,也就避免了转发黑洞。
在这里插入图片描述
虽然开启BGP同步可以避免转发黑洞,但是如果能够确保报文转发路径上有相应的IGP路由,则没有必要开启BGP同步功能。

当AS内所有的路由器之间都建立了IBGP全连接时,所有的路由器都有物理连接,不会产生个别路由器缺少某些BGP路由的情况,这时可以不配置BGP同步。另外当这个自治系统为一个末梢自治系统时,也可不配置BGP同步功能。

在华为路由器中,默认是关闭BGP同步功能的。

——————————————————————————————————————————————————

2.6.BGP消息

在BGP对等体建立之前,首先进行TCP连接。邻居间通过Open消息协商相关参数,建立起BGP对等体关系。BGP邻居之间交换整个BGP路由表。BGP协议不会定期更新路由表,当BGP路由发生变化时,会通过Update消息及时更新路由表。BGP会发送Keepalive消息来维持邻居之间的BGP连接。当BGP检测到网络中的错误状态时,BGP会发送Notification消息进行报错,连接随即中断。

先通过Open消息建立TCP连接形成对等体关系,维持关系是Keepalive消息。发生路由变化是Update消息更新路由表。出现错误了发送Notification进行报错。

——————————————————————————————————————————————————

2.6.1.报文头格式

BGP运行是通过消息驱动的,共5种消息类型。通过TCP协议传播端口号179,消息最长为4096字节,最短19字节。这些消息都有相同点:报文头+报文体的形式。报文头长度为19字节。

5种消息,每个消息都携带这个固定头部加上消息本身格式。

在这里插入图片描述

1、Marker(标识):检查BGP对等体的同步信息是否完整,以及验证的计算。共16字节,不使用验证所有比特均为1。
2、Length(长度):BGP消息总长度(包括报文头在内),19~4096字节。
3、Type BGP:消息类型,1-5,分别表示Open、Update、Notification、Keepalive和Route-refresh消息。

——————————————————————————————————————————————————

2.6.2.Open消息格式

在这里插入图片描述

1、Version:BGP版本号。值为4。
2、My Autonomous System:本地AS编号。通过比较两端AS编号,可确定是EBGP还是IBGP连接。
3、Hold Time:建立对等体两端要协商Hold Time,保持一致。如时间不同,则以最小值作为协商结果,如未收到对端发来的Keepalive消息,则认为BGP连接中断。
4、BGP Identifier:BGP路由器的Router ID。
5、opt Parm Len:可选参数,如果为0,则没有可选参数。
6、optional Parameters:用于BGP验证或多协议扩展等功能的可选参数。

对等体在接收到Open消息后,将发送Keepalive消息来确认并保持连接有效性。确认后,对等体之间可以进行Update、Notification、Keepalive和Route-refresh消息的交换。

Open消息一看就是建立对等体关系,形成邻居用的。

两台随便弄个邻居,看看这个Open消息。
在这里插入图片描述
在这里插入图片描述
确实用的TCP协议嘛。看下Open消息。
Marker,不验证~~。
长度45。
消息类型1,Open消息。
版本4。
AS:100
保持时间180S。
BGP的Router ID。
可选参数长度。

在这里插入图片描述
多协议扩展功能参数。
路由刷新功能。
支持4-octet AS编号能力。

在这里插入图片描述

这里说的是Open消息发送完后,接着发送Keepalive消息。那么继续看看Keepalive消息结构吧。。Keepalive消息在2.6.5。
——————————————————————————————————————————————————

2.6.3.Update消息格式

此消息用于在对等体之间交换路由信息。Update消息可以发布多条属性相同的可达路由信息,也可以撤销多条不可达的路由信息。
在这里插入图片描述

1、Unfeasible Routes Length:不可达路由字段长度,如果为0,则没有Withdrawn Routes字段。
2、Withdrawn Routes:不可达路由的列表。每个列表包含一个IP地址前缀二元组。
~Length表示IP地址前缀长度,单位为比特。如果为0,则说明该前缀匹配所有IP地址。
~Prefix包含被撤销的IP地址前缀,后面则是填充比特,用于保证字段结尾负荷字节边界,填充比特的值无意义。
3、Total Path Attribute Length:路径属性字段的长度。如果为0,则说明没有网络可达信息,即没有Path Attributes和NLRI字段
4、Path Attributes:与NLRI相关的所有路径属性列表,每个路径属于一个TLV三元组构成。(关于TLV三元组自行百度)
5、NLRI:可达路由的前缀和前缀长度二元组。

一条Update消息可以发布多条具有相同路由属性的可达路由,这些路由可共享一组路由属性。所有包含在一个给定的Update消息里的路由属性,都适用于该Update消息中的NLRI字段里的所有目的地用IP前缀表示。
一条Update消息可以撤销多条不可达路由。每一个路由通过目的地用IP前缀表示,清楚定义了BGP Speaker之间先前通告过的路由。
一条Update消息可以只用于撤销路由,这样就不需要包括路径属性或者网络可达信息,相反,也可以只用于通告可达路由,则不需要携带Withdrawn Routes。

在Open建立关系后,待Keepalive消息确认后。使用Update消息发布可达路由属性。

在这里插入图片描述
捕捉下吧~~~~来了来了,本来没多长的一个消息,硬是让Path Attributes弄的。。。。。
在这里插入图片描述
Withdrawn Routes Length:0,说明没有Withdrawn Routes字段,说明没有不可达路由列表~
Total Path Attribute Length:路径属性字段长度,如果这里是0,就说明没有网络可达。。。
Path Attributes:所有路径属性列表。

在这里插入图片描述
Path Attributes:所有路径属性列表。----这里的属性,说的就是BGP进行决策和控制的重要手段,后面会详细说。

第一个属性,ORIGIN:起点属性。0代表IGP,1代表EGP。
第二个属性:AS的路径属性,经过的所有AS序列。
——————————————————————————————————————————————
Optional:0,Not,Set。没有配置啊,0定义为公认属性。所有运行BGP协议必须识别和支持的属性。
Transitive:Set,配置了1,0是不转发,1转发。定义的公认属性是转发的。对于公认属性这个值必须为1。
oartial:Not set。没有配置,在公认属性和可选非过度属性,必须为0。比特是否完整。0就是完整,反之。
Extended-Length:Not,Set:没配置。扩展长度。0:属性1字节,1:就是2字节。只有超过255字节,E这个选项才可用。

**—————————————————————————————————————————————
第三个属性:NEXT_HOP:下一跳属性。参照上面的参数。
第四个属性:Multi_Exit_Disc:MED属性可选非过渡属性,仅在两个相邻AS之间传递。0:MED用于判断流量进入AS时的最佳路由。

这里了解就OK。不必深究。知道意义就行了。

在这里插入图片描述

——————————————————————————————————————————————————

2.6.4.Notification消息格式

当BGP检测到错误状态时,就向对等体发出Notification消息,之后BGP连接立即终端。

在这里插入图片描述

1、Error Code:错误码,指定错误类型。
2、Error Subcode:错误子码,描述错误的详细信息。
3、Data:用来诊断错误原因,长度不固定。

Notification消息中错误代码和错误子码代码表:

1、消息头错误。1:连接未同步,2:错误的消息长度。3:错误的消息类型。
2、Open消息错误。1:不支持的版本号,2:错误的对等AS。3:错误的BGP标识符。4:不支持的可选参数。5:认证失败。6:不可接受的保持时间。
3、Update消息错误。1:畸形属性列表,2:不可识别的公认属性。3:缺少公认属性。4:属性标志错误。5:属性长度错误。6:无效Origin属性。7:AS路由环路。8:无效Next_Hop属性。9:可选属性错误。10:无效网络字段。11:畸形AS_Path。
4、Hold Timer溢出:0
5、有限状态机错误:0
6、终止:0
如果没有特别的错误子码定义,就在错误子码字段填充0。

有错误就会检测到,顺便就发送Notification消息了。

在这里插入图片描述
消息头,3,错误的消息类型。
重大的消息错误6。刚把接口shutdown了。
次要的错误代码6。配置变更。~

——————————————————————————————————————————————————

2.6.5.Keepalive消息格式

BGP周期性的向对等体发出Keepalive消息,用来保持连接有效性。消息格式只包含报文头,没有附加任何字段。

这玩意可以忽略了,看看就好。~~~~~这个确认后,就开始进行Update了,返回返回~ ~~ ~~。
在这里插入图片描述

——————————————————————————————————————————————————

2.6.6.Route-refresh消息格式

用来通知对等体自己支持路由刷新功能,消息格式如下:

在这里插入图片描述

AFI(Address Family Identifier):地址族标识符,16比特。
Res(Reserved Field):保留区域(8bit),发送方应将其设置为0,接收方应当忽略该区域信息。
SAFI(Subsequent Address Family Identifier):子地址族标识符(8bit)。

在所有BGP路由器使能route-refresh能力情况下,如果BGP的入口路由策略发生了变化,则本地BGP路由器会向对等体发布Route-refresh消息,收到此消息的对等体会将其路由信息重新发给本地BGP路由器,这样可以在不中断BGP连接的情况下,对BGP路由表进行动态刷新,并应用新的路由策略。

触发下这个消息吧,设备默认未开启刷新功能,这个和设备也有关系吧。具体的设备具体的开关吧。。。在ensp上查询了下,是开启的。dis bgp peer verbose,我也没配置什么,显示是开启的。。

在这里插入图片描述
说的是BGP入口的策略发生变化,会向对等体发布Route-refresh消息。收到消息了,就把路由信息重新给发回来,不中断BGP连接就刷新路由表了。Route-refresh一句话:通知对等体自己支持路由刷新能力。。。。
还是之前的图,重启BGP引入的OSPF。refresh bgp all import。多个BGP的话,就把进程号写上。

在这里插入图片描述

在这里插入图片描述
AFI:地址族标识。。。IPV4么。。
Subtype:发送方应该设为0,接收方忽略该区域信息。正常路由刷新请求,依照RFC2918规定。
SAFI:子地址族标识。

——————————————————————————————————————————————————

2.6.7.BGP消息的应用

BGP使用TCP建立连接,本地监听端口179。和TCP一样BGP同样要进行一系列捂手。TCP握手协商,通告其端口参数,BGP握手协商的参数有:BGP版本,BGP连接保持时间,本地路由器RID,授权信息等。这些都在open消息中体现。

BGP使用TCP179端口建立连接,完了后在open消息协商各种参数。

BGP连接建立后,如果有路由需要发送则发送Update消息,通告对端路由信息。Update消息主要用来通告路由信息,包括:失效(撤销)路由。当通过Update消息发布路由时,还要指定此路由的路由属性,用以帮助对端BGP协议选择最佳路由。

BGP的Update消息主要就是通告路由信息。选择最佳路由。这里要思考的还有一个点,就是这个Update和route-refresh,通知对等体刷新路由,通告路由信息还是由Update来进行。而不是route-refresh发送消息过去通知刷新,这个消息就携带了路由信息。

当本地BGP路由发生变化时候,也是用Update消息修正对端BGP的路由表。

经过一段时间的路由信息交换后,本地BGP和对端BGP都无新的路由通告,趋于稳定。此时要定时发送Keepalive消息以保持BGP连接的有效性。对于本地BGP,如果在超过保持时间间隔内未收到任何对端BGP消息,就认为此BGP连接已无效,并将此BGP连接断开。

稳定后会定期发送Keepalive消息保持连接,和OSPF的HELLO一回事。

当本地BGP在运行中发现错误时,要发送Notification消息通告BGP对端。例如对端BGP版本本地不支持,本地BGP收到了结构非法的Update消息等。本地BGP退出BGP连接时也要发送Notification消息。BGP收到Notification消息后,做相应处理。

——————————————————————————————————————————————————

2.7.BGP状态机

BGP共有六种状态机。分别是Idle、Connect、Active、OpenSent、OpenConfirm和Established。它们之间的转换过程示意了BGP邻居关系建立的过程。

1、首先是Idle状态,BGP协议一旦Start,状态机就会进入Connect状态。
初始状态一旦运行BGP,进入连接状态。

2、在Connect状态,如果Connect-Retry定时器超时,则BGP状态机会停留在Connect状态。同时BGP试图建立TCP连接,如果连接失败,则BGP状态进入Active状态。如果连接成功,则进入OpenSent状态。

如果定时器超时,则停留连接状态,试图建立TCP连接,如失败进入活跃状态。

3、在Active状态,如果TCP连接依然不能建立起来,那么就一直停留在Active状态,直到建立成功,才进入OpenSent状态。

活跃状态如成功,则进入打开消息已发送状态。

4、在OpenSent状态,BGP一旦收到一个正确的Open报文,就会进入OpenConfirm状态。

打开消息已发送状态,一旦接收一个Open报文就进入打开消息确认状态。

5、在OpenConfirm状态,当KeepAlive定时器超时,BGP状态机就会停留在OpenConfirm状态,直到收到KeepAlive报文,BGP才进入Established状态,这时才算连接建立起来。

当定时器超时,就会停留在打开消息确认状态,直到收到定时器报文,就进入连接已建立状态。

另外在除Idle状态以外的其他5个状态出现任何Error的时候,BGP状态机就会退回到Idle状态。

Idie(空闲):是第一个状态,在空闲状态,BGP在等待一个启动事件,启动出现后,BGP初始化资源,复位连接重试计时器Connect-Retry,发起一条TP连接,同时转入Connect状态。

Connect(连接):在连接状态,BGP发起一个TCP连接,如果连接重试计时器超时,就重新发起TCP连接,保持在连接状态。如连接成功,就转入打开消息已发送状态,如失败则转入活动状态。

Active(活跃):在活跃状态,BGP总是试图建立TCP连接,如连接计时器超时,退回到连接状态,如TCP连接成功,就转入打开消息已发送状态。如果失败,就继续保持活跃状态,并继续发起TCP连接。

OpenSent(打开消息已发送):在打开消息已发送状态,TCP连接已经建立,BGP并且发送了一个Open报文,然后等待对等体发送Open报文,对收到的报文进行正确检查,如有错误,发送一条出错通知消息,退回到空闲状态。如没有错误,BGP就开始发送Keepalive报文,并复位报文计时器,开始计时,同时转入打开消息确认状态。

OpenConfirm(打开消息确认):在打开消息确认状态,BGP等待一个Keepalive报文,同时复位保持计时器,如果收到了Keeppalive报文,就转入连接已建立状态,BGP邻居关系就建立起来了。如果TCP中断,则回退到空闲状态。

Established(连接已建立):在连接已建立状态,BGP邻居关系已建立。这时BGP将和它的邻居们交换Updae报文,同时复位保持计时器。

在BGP对等体建立过程中,通常见到的3个状态:idie、active、Established。当BGP邻居是活动状态,邻居之间还不能通告路由,主要是TCP的连接还没有建立起来,建立邻居关系的地址之间IGP路由不通。当是连接已建立状态,表明IBGP对等体之间可以通告IBGP路由信息了。

——————————————————————————————————————————————————————————

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐