BGP Border Gateway Protocol,边界网关协议
AS内部使用IGP来计算和发现路由,如OSPF,ISIS,RIP等。
AS之间使用BGP来传递和控制路由。

如上图所示,BGP可以跨越多跳路由器建立邻居关系。为实现路由按需求进行控制和优选,BGP设计了诸多属性携带在路由中。BGP协议被设计运行在AS之间传递路由,AS之间是广域网链路,数据包在广域网上传递是可能出现不可预测的链路拥塞或丢失等情况,因此BGP使用TCP作为其承载协议来保证可靠性。
BGP使用TCP封装建立邻居关系,端口号为179,TCP采用单播建立连接,因此BGP协议并不像RIP和OSPF一样使用组播发现邻居。单播建立连接也使BGP只能手动指定邻居。

先启动BGP的一端先发起TCP连接,如图所示,RTB先启动BGP协议,RTB使用随机端口号向RTA的179端口发起TCP连接。
如果两台路由器同时启动BGP协议,同时向179端口建立连接,会选择 router id大的路由器建立起的连接。
BGP通过报文的交互完成邻居建立、路由更新等操作,共有Open、Update、Notification、Keepalive和Route-refresh
等
5
种报文类型,如下图所示,
Open报文
:是
TCP
连接建立后发送的第一个报文,用于
建立BGP邻居之间
的连接关系。
BGP
邻居在接收到
Open
报文并协商成功后,将发送
Keepalive
报文确认并保持连接的有效性。确认后,
BGP
邻居间可以进行
Update
、
Notification
、
Keepalive
和
Route-refresh
报文的交换。
Update报文
:用于在
BGP邻居之间交换路由信息
。
Update
报文可以
发布
多条属性相同的可达路由信息,也可以
撤销
多条不可达路由信息。
一条Update
报文可以发布多条具有相同路由属性的可达路由,这些路由可共享一组路由属性。所有包含在一个给定的
Update
报文里的路由属性适用于该
Update
报文中的
NLRI
(
Network Layer Reachability Information
)字段里的所有目的地(用
IP
前缀表示)。
一条Update
报文可以撤销多条不可达路由。每一个路由通过目的地(用
IP
前缀表示),清楚地定义了
BGP
路由器之间先前通告过的路由。
一条Update
报文可以只用于撤销路由,这样就不需要包括路径属性或者
NLRI
。相反,也可以只用于通告可达路由,就不需要携带撤销路由信息了。
Notification
报文:当
BGP
路由器
检测到错误状态
时,就向邻居发出
Notification
报文,之后
BGP
连接会立即中断。
Keepalive
报文:
BGP
路由器会周期性的向邻居发出
Keepalive
报文,用来
保持连接的有效性
。
Route-refresh
报文:
Route-refresh
用于在改变路由策略后请求对等体
重新发送路由信息
。
BGP路由器报文交互过程:
Idle状态
是
BGP
初始状态。在
Idle
状态下,
BGP
路由器
拒绝邻居发送
的连接请求。只有在收到本设备的
Start事件
后,
BGP
路由器才开始
尝试与其邻居进行TCP连接
,并转至
Connect状态
。
在Connect状态下,BGP路由器启动连接重传定时器(Connect Retry),等待TCP完成连接。如果TCP连接成功,那么BGP路由器向邻居发送Open报文,并转至OpenSent状态。 如果TCP连接失败,那么BGP路由器转至Active状态。 如果连接重传定时器超时,BGP路由器仍没有收到邻居的响应,那么BGP路由器继续尝试与其邻居进行TCP连接,停留在Connect状态。在Active状态下,BGP路由器总是在试图建立TCP连接。如果TCP连接成功,那么BGP路由器向邻居发送Open报文,关闭连接重传定时器,并转至OpenSent状态。 如果TCP连接失败,那么BGP路由器停留在Active状态。 如果连接重传定时器超时,BGP路由器仍没有收到邻居的响应,那么BGP路由器转至Connect状态。在OpenSent状态下,BGP路由器等待邻居的Open报文,并对收到的Open报文中的AS号、版本号、认证码等进行检查。如果收到的Open报文正确,那么BGP路由器发送Keepalive报文,并转至OpenConfirm状态。 如果发现收到的Open报文有错误,那么BGP路由器发送Notification报文给邻居,并转至Idle状态。在OpenConfirm状态下,BGP路由器等待Keepalive或Notification报文。如果收到Keepalive报文,则转至Established状态,如果收到Notification报文,则转至Idle状态。
在Established状态下,BGP路由器可以和邻居交换Update、Keepalive、Route-refresh报文和Notification报文。
生成BGP路由的方式有两种:第一种是使用配置命令network,第二种是使用配置命令import。如图所示,RTA上存在100.0.0.0/24与100.0.1.0/24的两个用户网段,RTB上通过静态路由指定去往100.0.0.0/24网段的路由,通过OSPF学到去往100.0.1.0/24的路由。RTB与RTC建立EBGP的邻居关系,RTB通过network命令宣告100.0.0.0/24,100.0.1.0/24与10.1.12.0/24的路由,使对端EBGP邻居RTC学习到RTB路由表里的路由。

通过display命令在RTC上查看是否学到 BGP发布的路由条目。
BGP本身并不会产生新的路由,不会自动去学习到路由,BGP就像一个大卡车,通过network或者是import的方式将IGP产生的路由装载出去,进行传递。
lImport命令是根据运行的路由协议(RIP,OSPF,ISIS等)将路由引入到BGP路由表中,同时import命令还可以引入直连和静态路由。
RTA上存在100.0.0.0/24与100.0.1.0/24的两个用户网段,RTB上通过静态路由指定去往100.0.0.0/24网段的路由,通过OSPF学到去往100.0.1.0/24的路由。RTB与RTC建立EBGP的邻居关系,RTB通过import命令宣告100.0.0.0/24,100.0.1.0/24与10.1.12.0/24的路由,使对端EBGP邻居学习到本AS内的路由。为了防止其他路由被引入到BGP中,需要配置ip-prefix进行精确匹配,调用route-policy在BGP引入路由时进行控制。
BGP通告原则之一 : 仅将自己最优的路由发布给邻居,当存在多条有效路由时,BGP路由器只将自己最优的路由发布给邻居。
BGP通告原则之二 : 通过EBGP获得的最优路由发布给所有BGP邻居
BGP通告原则之三 : 通过IBGP获得的最优路由不会发布给其他的IBGP邻居 ,在某种程度上,有一定的防环作用
BGP通告原则之四 : BGP与IGP同步(华为的设备已经将这个功能关闭了,开启不了)

如上图所示,RTA
上存在一个
100.0.0.0/24
的用户网段,通过
EBGP
发布给
RTB
。
RTB
与
RTD
建立了
IBGP
邻居关系,
RTD
通过
IBGP
学习到该
BGP
路由,并将该路由发布给
EBGP
邻居
RTE
。当RTE
访问
100.0.0.0/24
的路由时,查找路由表,发现到达
100.0.0.0/24
路由的下一跳是
RTD
,
RTE
查找出接口后,将数据包发送给
RTD
;
RTD
收到数据包后,查找路由表,发现到达
100.0.0.0/24
路由的下一跳是
RTB
,出接口是
RTD
上与
RTC
相连的接口,于是将数据包发给
RTC
,
RTC
查找路由表,发现没有到达
100.0.0.0/24
的路由,于是将数据丢弃,形成“路由黑洞”。
BGP
的通告原则:一条从
IBGP
邻居学来的路由在发布给一个
BGP
邻居之前,通过
IGP
必须知道该路由,即
BGP
与
IGP
同步。如图所示,RTD
在收到
RTB
发来的
IBGP
路由之后,如果要发布给
BGP
邻居
RTE
,则在发布之前先检查
IGP
协议(即
OSPF
协议)能否学到该条路由。如果能,则将
IBGP
路由发布给
RTE
。在华为路由器上,默认是将BGP
与
IGP
的同步检查关闭的,原因是为了实现
IBGP
路由的正常通告。但关闭了
BGP
与
IGP
的同步检查后会出现“路由黑洞”的问题。因此,有两种解决方案解决上述问题:将BGP
路由引入到
IGP
,从而保证
IGP
与
BGP
的同步。但是,因为
Internet
上的
BGP
路由数量十分庞大,一旦引入到
IGP
,会给
IGP
路由器带来巨大的处理和存储负担,如果路由器负担过重,则可能瘫痪。
解决方案:IBGP路由器必须是全互联,确保所有的路由器都能学习到通告的路由。这样可以解决关闭同步后导致的“路由黑洞”问题
。
BGP
的丰富属性
公认属性
:所有BGP
路由器都必须识别并支持的属性。
所有厂商都需要支持的属性
公认必遵:
BGP
的
Update
消息中必须包含的属性。
公认任意:不必存在于
BGP
的
Update
消息中,可以根据需求自由选择的属性。
可选属性:不要求所有的BGP路由器都能够识别的属性。
可选过渡:
BGP
不能识别该属性,但可以接收该属性并将其发布给它的邻居的属性。
可选非过渡:BGP可以忽略包含该属性的消息并且不向它的邻居发布。
如图所示,
AS 200
内运行
OSPF
协议,
200.0.0.0/24
网段宣告到
OSPF
中。
RTB
通过
network
方式将
200.0.0.0/24
的路由变为
BGP
路由通告给
RTA
,
RTC
通过
import
方式将
200.0.0.0/24
的路由变为
BGP
路由通告给
RTA
。
BGP
在
AS
之间传递信息,承载大量的路由。如果到达同一目的
IP
有多条路径,且
BGP
学到这些路由通过不同的方式,则
Origin属性是决定最优路径的一个因素,用于标明路由的起源。
Origin
的
3
种属性:
i表明BGP路由通过network命令注入;
e
表明
BGP
路由是从
EGP
学来的,
EGP
协议在现网中很难见到,但可以通过路由策略将路由的
Origin
属性修改为
e
;
? 即Incomplete表明BGP路由通过其它方式学到路由信息,如使用import命令引入的路由。
3
种
Origin
属性的优先级为:
i>e>Incomplete(?)
。
BGP
针对环路以及选择路径的问题
,设计了
AS_Path属性,该属性记录了路由经过的所有AS的编号:
如上图中
RTA
从
RTB
收到
100.0.0.0/24
的路由时,
AS_Path
为(
2
,
4
),
RTA
从
RTC
收到
100.0.0.0/24
的路由时,
AS_Path
为(
3
,
5
,
4
)。规定
AS_Path
越短(记录的
AS
编号越少),路径越优,因此
RTA
会优选从
RTB
收到的
100.0.0.0/24
的路由。
p
以
RTE
为例,通过
BGP
发布
100.0.0.0/24
的路由,路由可能通过
RTE->RTB->RTC->RTD->RTE
形成环路。为了防止环路的产生,
RTE
在收到
RTD
发来的路由时会检查
AS_Path
(该路由携带的)属性,如果发现该路由的
AS_Path
中包含自己的
AS
号,则丢弃该路由。
AS_Path
的
4
种类型:
AS_Sequence(有序的);
AS_Set(无序的);
AS_Confed_Sequence(应用于联盟);
AS_Confed_Set(应用于联盟)。

BGP
路由器将本端始发路由发布给
IBGP
邻居时,会把该路由信息的
Next_hop
设为本端建立邻居关系所使用的接口
IP
。
如上图所示,
RTA
将
100.0.0.0/24
的网段发布给
RTB
时,如果
RTA
与
RTB
使用直连接口建立
IBGP
邻居,则
Next_hop
为
RTA
上与
RTB
直连的接口
IP
;如果
RTA
与
RTB
使用
Loopback
接口建立
IBGP
邻居,则
Next_hop
为
RTA
的
Loopback
接口
IP
。
BGP
路由器在向
EBGP
邻居发布路由时,会把路由信息的
Next_hop
设置为本端与对端建立
BGP
邻居关系的接口
IP
。
如上图所示,
RTB
将
100.0.0.0/24
的网段发布给
RTC
时,
Next_hop
为
RTB
上与
RTC
直连的接口
IP
。
BGP
路由器在向
IBGP
邻居通告从
EBGP
学来的路由时,不改变该路由下一跳属性。
特例:如上图所示,RTA从RTB学到RTC发布的200.0.0.0/24的网段时,Next_hop为RTD的出接口IP,因为RTB与RTD在同一网段,RTC通告给RTB的Next_hop为RTD的出接口IP。
对于上述三种情况的解释:
EBGP
邻居之间一般采用直连接口建立邻居关系,
EBGP
邻居在相互通告路由时会修改
Next_hop
为自己的出接口
IP
;
IBGP
邻居通常采用
Loopback
接口建立邻居,当路由是本路由器起源的,在发送给邻居之后
Next_hop
改为自己的更新源地址,这样即使网络中出现链路故障,只要
Next_hop
可达,同样可以访问目的网段,提高网络稳定性;
相对于
IGP
,如
RIP
在发布路由时,每经过一个路由器都会
修 改
下一跳,发布路由的路由器都宣称自己能够到达目标地址,并采用逐跳传递的方式将数据包发送给目标网络,但网络中的路由器并不知道谁是真正的始发路由器,因此会造成环路。
BGP
在
EBGP
之间传递时才修改
Next_hop
,
IBGP
发送从
EBGP
学来的路由给
IBGP
邻居时并不修改下一跳,在一定程度上起到了
防环作用
。
如果在EBGP环境下,使用环回口(逻辑接口loopback)来建立BGP邻居关系,则需要在通告路由的时候,需要修改下一跳。
Local_Pref属性仅在IBGP邻居之间有效,不通告给其他AS。它表明路由器的BGP优先级,用于判断流量离开AS时的最佳路由。
MED(Multi-Exit-Discriminator)属性仅在相邻两个AS之间传递,收到此属性的AS不会再将其通告给任何其他第三方AS,用于判断流量进入AS时的最佳路由。
BGP的Community属性的两个作用:
1.限定路由的传播范围。
2.打标记,便于对符合相同条件的路由进行统一处理。
Community属性分为两类:一类是公认团体属性,另一类是扩展的团体属性。
公认团体属性分为4类:
Internet:缺省属性,所有路由都属于Internet,此属性的路由可以通告给所有BGP邻居;
No_Export:收到此属性的路由后,不将该路由发布到其他AS。如图,RTB上希望10.1.11.0/24的路由发布给AS 12之后,不再发布给其他AS,则可将10.1.11.0/24的Community属性设置为No_Export;
No_Advertise:收到此属性的路由后,不将该路由通告给任何其他的BGP邻居。如图,RTB上希望只将10.1.11.0/24的路由发布给RTC,并且不再通告给任何其他的BGP邻居,则可将10.1.11.0/24的Community属性设置为No_Advertise;No_Export_Subconfed:在联盟中使用。
扩展的团体属性用一组4字节为单位的列表来表示,路由器中扩展的团体属性格式为aa:nn或团体号:aa:nn中,aa通常为AS编号,nn是管理员定义的团体属性标识;团体号范围为0-4294967295,在RFC1997中,0-65535与4294901760-4294967295为预留值。
BGP路由器将路由通告给邻居后,每个BGP邻居都会进行路由优选,路由选择有三种情况:
该路由是到达目的地的唯一路由,直接优选。
对到达同一目的地的多条路由,优选优先级最高的。
对到达同一目的地且具有相同优先级的多条路由,必须用更细的原则去选择一条最优的。
一般来说,
BGP
计算路由优先级的规则如下:
丢弃下一跳不可达的路由。
优选
Preference_Value值最高
的路由(私有属性,仅本地有效)。
优选
本地优先级(Local_Preference)最高
的路由。
优选
手动聚合>自动聚合>network>import>从对等体
学到的。
优选
AS_Path短
的路由。
起源类型
IGP>EGP>Incomplete
。
对于来自同一
AS
的路由,优选
MED值小
的。
优选从
EBGP
学来的路由(
EBGP>IBGP
)。
优选
AS内部IGP的Metric最小
的路由。
优选
Cluster_List
最短的路由。
优选
Orginator_ID
最小的路由。
优选
Router_ID最小
的路由器发布的路由。
优选具有
较小IP地址
的邻居学来的路由。
使用静态路由配置路由聚合的思路:
使用静态路由将明细路由聚合成
10.1.8.0/22
,下一跳指向
NULL 0
,因为聚合路由并不是具体的地址,发送给
AS 200
时只是明细路由的替代,为了防止路由环路,所以将下一跳指向
Null 0
;
由于使用静态路由,路由表中产生了一条
10.1.8.0/22
的路由,下一跳为
Null 0
。使用
network
命令将
IP
路由表中的
10.1.8.0/22
路由变为
BGP
路由,并通告给对端
BGP
邻居,达到聚合的目的。
自动聚合方式,在bgp的视图下,通过 summary automatic命令进行自动聚合路由信息。
手动聚合方式:在bgp的视图下,通过配置aggregate 10.1.8.0 255.255.252.0 detail-suppressed
detail-suppressed用来抑制明细路由的优先级
BGP路由聚合带来的问题 - 潜在环路 ,如下图所示,被聚合的路由丢失了原来的属性,会有环路的风险,
路由聚合解决了两类问题,一是减轻了设备传输和计算路由所需资源的负担,二是隐藏了具体的路由信息,减少了路由震荡的影响。但是路由聚合后,AS_Path属性丢失,存在产生环路的风险。
为了解决
BGP
路由聚合带来的问题,设置了两个
AS_Path
属性:
Atomic-Aggregate
:公认任意属性,用于警告下游路由器出现了信息丢失,如图所示,
AS 200
内设置了路由聚合的路由器在聚合后发生了路径丢失的现象,此时该路由器通过
Update
报文携带该属性通知自己的邻居发生了路径丢失。
Aggregator
:可选过度属性,该属性包含发起聚合的路由器的
AS
号和
Router-ID
,表明发生聚合的位置。
AS_Path
属性有两种类型:
AS_Sequence
:表示
AS_Path
内的
AS
号是一个有序的列表。
AS_Set
:表示
AS_Path
内的
AS
号是一个无序的列表。
AS_Path
本身是一个有序的列表,因为
AS_Path
每经过一个
AS
都会将
AS
号添加到
AS_Path
中,并且按经过的顺序从左到右排列。
如上图所示,
AS 400
向
AS 300
通告聚合路由时,
AS_Path
属性(大括号的除外)表示该聚合路由依次经过了
AS 200
和
AS 400
。
当发生聚合后,如果需要聚合路由携带所有明细路由经过的
AS
号来防止环路,则在配置聚合的命令后添加
as-set
参数。
如上图所示,
AS 200
内发生了聚合并配置了
as-set
参数,则聚合路由会将明细路由的
AS_Path
信息用一个
AS-Set
集表示(放在中括号里的
AS
号信息,该集合的
AS
号没有先后顺序),携带在聚合路由后用以防止环路。