个人认为,理解报文就理解了协议。通过报文中的字段可以理解协议在交互过程中相关传递的信息,更加便于理解协议。

因此本文将在BGP Version4协议上进行介绍,以详细介绍BGP的相关内容。

关于BGP version4相关内容,可参考2006年发布的RFC4271
关于BGP Route-Reflect相关内容,可参考2006年发布的RFC4456
关于BGP Confederations相关内容,可参考2007年发布的RFC5065
关于BGP可通告Capability相关内容,可参考2009年发布的RFC5492
关于4字节AS Number相关内容,可参考2012年发布的RFC6793
关于BGP的Capability Codes详细参数,可参考Capability Codes
关于BGP的其他参数字段的详细内容,可参考Border Gateway Protocol (BGP) Parameters

Border Gateway Protocol自1989年定义以来已经历过4个版本:1989RFC1105的Version1,1990RFC1163的Version2,1991RFC1267的Version3,1994RFC1654的Version4。而V4又历经了几次迭代,到目前比较全面完整的是2006RFC4271。
本文将以RFC4271为参考对BGP进行基础内容的相关介绍。对BGP的扩展协议,EVPN(RFC7432),MP-BGP(RFC4760)等,以及BGP的众多更新RFC暂不做相关介绍。

本文档旨在介绍相关原理,对于不同设备及厂家的实现上不做深究。有意者建议阅读相关设备资料。个人能力有限,如有疑问欢迎留言指导~

目录

BGPv4

  • 目录
  • 1.基础内容
    • 1.1.相关术语和概念
  • 2.BGP报文介绍
    • 2.1.Open报文介绍
    • 2.2.Update报文介绍
    • 2.3.Notification、Keepalive和Route-Reflesh报文介绍
    • 2.4.常用的BGP Path Attributes
  • 3.BGP的程序动作
    • 3.1.FSM Event-有限状态机事件
    • 3.2.BGP FSM-BGP状态机
    • 3.3.Update消息的处理
  • 4.BGP相关特性
    • 4.1.BGP路由选路原则
    • 4.2.BGP Route-Reflect--路由反射
    • 4.3.BGP Confederations--联盟
    • 4.4.正则表达式
    • 4.5.BGP的路由聚合
  • 更新

1.基础内容

Border Gateway Protocol(BGP)是一个自治(Autonomous System)系统间的路由协议。BGP的主要功能是与其他BGP系统交换网络可达性信息。
虽然BGP也可用于生成/宣告路由,但其最主要的功能还是在系统之间传递路由。并且可在传入传出路由时进行相应的修改,也即路由策略。

1.1.相关术语和概念

为便于介绍,在此先介绍一些关于BGP的相关术语
Autonomous System自治系统
单个路由协议管理下的一组路由器,使用内部网关协议(IGP)和通用度量来确定如何在AS内路由数据包。如果一个AS内运行了多个IGP协议,对于其他AS来说也认为其执行了内部一致的路由规则。

三张处理表/库
1@–Adj-RIB-In:邻居入方向的路由信息表/库。用于描述对等体向自己传输的完整路由信息。该路由表未进行入方向的路由策略。
2@–Adj-RIB-Out:邻居出方向的路由信息表/库。用于描述自己向对等体描述的路由信息,或者放置于Update消息报文中的路由信息。该路由表已进行出方向的路由策略。
3@–Loc-RIB:放置已被本地BGP以便进行选择的路由。该路由表已进行入方向的路由策略。

因此有如下的路由处理过程:
简单来说Adj-RIB-In和Adj-RIB-Out是放置于Update报文中的路由信息。

NLRI
Network Layer Reachability Information,网络层可达信息。放置于Update报文中,主要描述了路由相关信息或路由的相关属性。

IBGP/EBGP
Internal和External BGP,简单来说为相同AS的为IGP,相反为EBGP

相关概念
1@:BGP使用TCP的179端口进行相关协议报文的发送和监听。
2@:在建立了完整的BGP对等体关系后,BGP只发送增量更新。而非周期性泛洪或刷新路由表。
因此BGP为了使路由有正确的结果需要周期保活或使用Rout-Refrsh路由刷新

BGP提供了如下三种机制进行路由更改:
1@:发送withdraw类型的Update报文,将该路由进行撤销
2@:发送具有相同NLRI的Update报文,进行更新。通过此种方式可以更改路由的属性。
3@:中断BGP连接

2.BGP报文介绍

BGP基于TCP协议,因此在进行BGP对等体关系建立时,需要进行BGP的三次握手。

并且BGP的加密主要也通过TCP的加密来实现:

BGP协议主要有4种报文:
1@–Open:用于邻居关系的建立
2@–Update:用于传递路由及其属性
3@–Notification:用于传递BGP的差错信息
4@–Keepalive:用于对等体邻居关系的保活
除此之外,RFC2981还定义了Type5 Refresh

BGP报文的底层格式
其中需要注意的是,BGP使用TCP的179作为目的端口进行协议交互。除此之外TTL=255,这是因为建立的是IBGP对等体关系,如果建立的是EBGP则默认TTL=1。

与TTL相关的命令:@用于调整EBGP对等体的TTL,默认为1。
自动换行
@用于使能BGP的GTSM(Generalized TTL Security Mechanism)功能对TTL进行限制。对于TTL不在[255-X+1,255]区间的BGP报文进行GTSM。X为指定的TTL。

BGP的公共头

Marker:标记字段,16字节。检查 BGP 对等体的同步信息是否完整,以及用于 BGP 验证的计算。不使用验证时所有比特均为 1。
Length:长度,2字节。取值19-4096。描述整个BGP报文长度。
Type:类型,1字节。描述BGP报文类型。

2.1.Open报文介绍

Version:版本,1字节。目前为Version 4,固定为4。
My AS:发送者的AS号,2字节。

Q:这里AS Number字段只有2字节,那么怎么实现AS Number的扩展?
A:通过Optional Parameters属性TLV进行携带。
2013年发布的RFC6996有分类:64512-65534以及4200000000 - 4294967294为私有AS,其他为公有AS。

Hold Time:维持时间,2字节。用于决定维护BGP对等体关系的时间。取值为0,或者3-65535s。

BGP Identifier:BGP标识,4字节无符号整数。用于全网唯一标识一台BGP邻居。也即Router-ID。

自动换行
此外,2006年RFC4271的section-6.8规定:当一对BGP邻居建立对等体时,通常建立两条TCP连接。此时保留BGP Identifier或者Router-ID大的一端的主动连接。
@listen-only表示仅建立被动的TCP邻居关系。

Optional Parameters Length:选项参数长,1字节。用于携带可选选项。

Optional Parameters:选项参数。

Parm. Type:Optional Parameters的类型,1字节。在Open报文中必须为2
Parm. Length:Parameter Value的长度,1字节。
Parameter Value (variable):主要有1个或多个<Capability Code, Capability Length, Capability Value>组成。
自动换行
Capability Code1字节。可分为3类:1-63被定义为IETF Review,64-238用于First Come First Served,239-254用于Experimental Use。0和255为Reserved。
Capability Length1字节。描述的是Capability Value长度。
自动换行

Optional Parameters描述了路由器所支持的BGP功能,如果一方收到自己不支持的功能,则应回送错误子码Unsupported Optional Parameter的NOTIFICATION消息。此时需重新建立邻居关系。不可使用两方都未在Open报文中通告的Capabilities。
详细内容可查阅可参考2009年发布的RFC5492可参考2020年发布的RFC8810

4字节AS Number
2012年发布的RFC6793,将AS Number扩充为4字节。并定义了4字节AS Number的表达方式。
并且定义了一个独特的AS Number23456用于衔接网络中既有2字节AS Number又有4字节AS Number时的情况。
此时定义新PATH Attribute:AS4_PATH(Type code=17, Optional Transitive)和AS4_AGGREGATOR(Type code=18, Optional Transitive)

AS4_PATH(Type code=17)具体原理:在途径多个AS时同时携带AS_PATH和AS4_PATH,每经过一个4字节AS Number就填充至AS4_PATH,而在AS_PATH填充23456。从而实现多个AS的记录。
AS4_AGGREGATOR(Type code=18)具体原理:将高位2字节置为0从而兼容AGGREGATOR属性。

情况示例:有AS10.1—AS10—AS20.1—AS20—AS30.1—AS30,则AS30收到来自AS10.1的路由为
携带AS_PATH=[23456,20,23456,10,23456]同时携带AS_PATH=[30.1,20.1,10.1]。

自动换行
注意事项
@AS4_PATH对Confederation联盟无效
@当配置4字节AS Number后,Open报文的My AS字段填充为23456,而在Capability中携带真正的AS Number。
@当AGGREGATOR属性不包含23456的AS_Number,则忽略AS4_PATH和AS4_AGGREGATOR属性;反之则忽略AGGREGATOR属性。
@修改AS Number显示格式

其他可选的Capabilities
4-byte-asroute-refresh功能华为默认使能;
conventiona用于向对等体表明不支持GR等高级功能,用于向前兼容版本较早的路由器;
ORF指将对端的入口策略作为本端的出口策略,对发送的路由进行过滤。关于ORF功能详情,可参考2008年发布的RFC5292

ORF:Outbound Route Filter出方向的路由过滤能力。
配置特点:
@:需要两端都支持该功能/需要两端都进行配置
@:需要指定进行匹配的前缀列表
自动换行
配置示例
ip ip-prefix test index 10 permit 1.1.1.0 28 greater-equal 28 less-equal 32
peer 10.1.2.1 ip-prefix test import
peer 10.1.2.1 capability-advertise orf cisco-compatible ip-prefix send
//send表示只允许本设备发送ORF报文。
报文逻辑

发送Route-Refresh报文(如果此时邻居已建立,会重新建立邻居)携带ORF信息,通知对端进行ORF传递。

点击此处回到目录

2.2.Update报文介绍

Withdrawn Routes Length:撤销路由长,2字节。描述了Withdrawn Routes字段的长度
Withdrawn Routes:撤销路由,不定长。描述了所需撤销路由的信息。该字段为可选字段。
也即前缀长(1字节)和前缀(不定长)。
Total Path Attribute Length:路由的路径属性长,2字节。

值0表示此UPDATE消息中既不存在“网络层可达性信息”字段,也不存在“路径属性”字段。

Path Attributes:路径属性,可选字段可变长。
NLRI:网络层可达信息,可选字段可变长。

用于更新路由的Update报文示例
用于撤销路由的Update报文示例

2.3.Notification、Keepalive和Route-Reflesh报文介绍

Notification报文:Notification报文描述了BGP进程中出现的告警信息
Error Code:1字节。

Error Code Symbolic Name
1 Message Header Error
2 OPEN Message Error
3 UPDATE Message Error
4 Hold Timer Expired
5 Finite State Machine Error
6 Cease

Error SubCode:1字节。

Notification报文示例>

自动换行
Keepalive报文:Keepalive报文仅携带BGP公共头部

自动换行
Route Refresh报文

Route Refresh报文示例

点击此处回到目录

2.4.常用的BGP Path Attributes

在《2.2.Update报文介绍》章节中对Update报文进行了简介。此处对其中的Path Attributes字段进行介绍。
Path Attributes分类
总的来说Path Attributes可分为4种:Well-known mandatory公认必遵,Well-known discretionary公认任意,Optional transitive可选过渡和Optional non-transitive可选非过渡。

自动换行
Path Attributes字段

Flags:Path Attributes的属性,1字节。
high-order bit:Optional-bit。置0表示well-known,置1表示为optional;

second high-order bit:Transitive-bit。置0表示non-transitive,置1表示为transitive;

high-order bit为well-known时,second high-order bit必须置1。

third high-order bit:Partial-bit。置0表示complete,置1表示为partial;

well-known和non-transitive attributes的attributes,其Partial-bit必须置0。

fourth high-order bit:Extended Length-bit。置0表示Attribute Length为1字节,置1表示Attribute Length为2字节。

Type Code:Path类型,1字节。用于描述所携带Path的类型。
Length:Path Attributes的value字段的长度,1字节或2字节。取决于Extended Length-bit。
Value:Path Attributes的value字段,可选项。

常用的Path Attributes:Length都取1字节。
Origin
Type Code 1
属性
Well-known mandatory也即公认必遵
Value
Value=0表示IGP,通过network命令注入的路由;
Value=1表示EGP,通过EGP学习得到的路由;
Value=2表示INCOMPLETE,通过其他方式学习到的路由
Origin描述了路由的引入来源。

@:一般来说Origin值不可被其他BGP Speaker改变。

AS_PATH
Type Code 2
属性
Well-known mandatory也即公认必遵
Value
Value又有SubTLV=Segment
Segment Type:1字节。=1为AS_SET表示无序的AS集合,=2为AS_SEQUENCE表示有序的AS集合
Segment Length:可变长。
Segment Value:2字节*N。
AS_PATH描述了路由所历经的AS。

@:BGP Speaker默认传递有序的AS集合,每经历一个最新的AS放置于Segment Value的列表最前。IBGP传递的路由Segment Value为空。
@:BGP Speaker在向IBGP对等体发布某条路由时,不得修改与路由相关的AS_PATH属性。
@:BGP Speaker在向EBGP对等体发布某条路由时,不管其初始Segment Type总是建立有序的AS集合。
@:BGP Speaker在默认情况下接受有序的AS集合的AS_PATH属性时,只允许自己的AS出现1次。用于防止环路
自动换行
其他AS或AS_PATH相关命令@设置AS_Path属性中AS号的最大个数。默认不做限制,或受报文长度限制。
@设置路由在形成负载分担时不比较路由的AS-Path属性。默认比较
@允许该路由环路一次。@检查EBGP对等体发来的Update消息中AS_Path属性的第一个AS号是否为对等体的AS Number的功能:如果不同则丢弃TCP连接。默认开启。
@以指定的AS Number与对等体建立邻居。仅对EBGP生效。
@发送BGP更新报文时AS_Path属性不携带私有AS号,仅携带公有AS号。
扩展阅读
2013年发布的RFC6996有分类:64512-65534以及4200000000 - 4294967294为私有AS,其他为公有AS。
此外RFC6793定义了AS 23456作为AS_Trans以及RFCRFC7607定义了AS 0的特殊处理。可阅读《2.1.Open报文介绍》章节查看有关RFC6793相关内容。
此外还可应用路由策略对AS_PATH进行修改,将在后文介绍。
AS_SET无序类型的AS_PATH可以用于聚合路由场景携带。

NEXT_HOP
Type Code 3,表示单播IP
属性
Well-known mandatory也即公认必遵
Value
4字节。
NEXT_HOP描述了路由的下一跳。

通常情况下,Next_Hop属性遵循下面的规则:
1@:BGP Speaker在向IBGP对等体发布本地始发路由,会把该路由信息的下一跳属性设置为本地与对端建立BGP邻居关系的接口地址。
2@:BGP Speaker在向IBGP对等体发布从EBGP对等体学来的路由时,并不改变该路由信息的下一跳属性。
@可以通过该命令将规则3更改为建立邻居的地址,仅对IBGP有效。
3@:BGP Speaker在向EBGP对等体发布某条路由时,会把该路由信息的下一跳属性设置为本地与对端建立BGP邻居关系的接口地址。
4@:NEXT_HOP还支持路由迭代,详情可查阅相关资料。
自动换行
其他NEXT_HOP相关命令@BGP Speaker在向对等体发布某条引入路由时,不更改下一跳地址。对EBGP使用时,仅限对VPN路由有效。
此外还存在一个特定场景优化策略:对于广播网上的RA,RB和RC,有如下RA—(IBGP)—RB—(EBGP)—RC组网。
此时RB在向RC传递RA上的路由时不修改下一跳,以防止次优路径。

MULTI_EXIT_DISC:MED(Multi Exit Discriminator)
Type Code 4
属性
optional non-transitive也即可选非过渡
Value
4字节。
MULTI_EXIT_DISC用于区分到相邻自治系统的多个入口点,一般用于影响EBGP邻居对自己的选路。

1@:MED属性如果通过EBGP接收,则可以传播给IBGP
2@:MED属性如果通过IBGP接收,则不可传播给IBGP
3@:如果本地指定删除MED属性,则该程序动作应在进行路由选择之前。
4@始发路由器可以将MED传给任何邻居,可以是IBGP/EBGP,但邻居收到后,不能传出邻居所在的AS(除非修改了MED)。也即只能在相邻AS内传递。
5@非始发路由器传给EBGP邻居,不携带MED。
自动换行
其他MED相关命令@配置允许比较来自不同自治系统中的邻居的路由的MED值
@修改默认MED,默认为0。只对重分发的路由和BGP的聚合路由生效生效,且只在发布给EBGP邻居生效。此命令优先级弱于route-policy。
发布给IBGP邻居时,按本地生效的MED生效。
发布给EBGP邻居时,有非0的default med 传递default med ,否则传递本地生效的MED。
可以理解成传递给EBGP邻居时,不传递med。但是EBGP接受到后,本地为路由生成默认的MED除非采用route-policy。

LOCAL_PREF
Type Code 5
属性
well-known也即公认任意
Value
4字节。默认值100。
LOCAL_PREF用于通知其他IBGP对等体路由的优先级。EBGP无效。

1@:告知如何离开本地的AS,是一个出站策略用于路由策略OUT方向。
2@:只在IBGP peer间进行通告。既不传出AS,又忽略EBGP传入的该属性。
自动换行
其他LOCAL_PREF相关命令
@修改默认LOCAL_PREF,默认为100。

ATOMIC_AGGREGATE
Type Code 6
属性
well-known discretionary也即公认自决
Value
由于Length字段中指定为0,因此实际上没有值。
ATOMIC_AGGREGATE用于路由聚合场景。

BGP发布聚合路由时,需要以知会对等体更精细的路由信息在发布过程中丢失了会附加上ATOMIC-AGGREGATE属性。
自动换行
其他NEXT_HOP相关命令@例如进行如上配置时,会在路由中携带该属性。

AGGREGATOR
Type Code 7
属性
optional transitive也即可选过渡
Value
4字节。
AGGREGATOR用于区分聚合路由的最后一个AS编号。

AGGREGATOR是ATOMIC_AGGREGATE属性的扩展,用于携带路由的精细信息。例如携带AS_SET类型的AS路径。
相关命令将在后续介绍

点击此处回到目录

3.BGP的程序动作

在这一章节将介绍BGP的Finite State MachineFSM,有限状态机)等程序动作。RFC4271指出BGP的数据结构和FSM是概念性的,不必精确地实现,只要实现支持所描述的功能并表现出相同的外部可见行为即可。

3.1.FSM Event-有限状态机事件

BGP FSM由Event事件驱动,Event可以是mandatory必遵也可以是optional可选的。
RFC4271定义了28种Event,此处不做过多介绍。有意者可查阅相关资料。
Automatic Administrative Events
Option 1–AllowAutomaticStart:特定于BGP实现的逻辑控制下进行BGP的自动启动。
Option 1–AllowAutomaticStart-Value:TRUE or FALSE
Option 2–AllowAutomaticStop:允许BGP自动关闭BGP连接
Option 2–AllowAutomaticStop-Value:TRUE or FALSE

对于该Event Option 1参数为True情况下有三个参数用于控制BGP的自动启动:
Option 3–DampPeerOscillations,Option 4–IdleHoldTime和Option 5–IdleHoldTimer。
DampPeerOscillations选项实现用额外的逻辑来阻尼BGP对等体在自动启动和自动停止序列时的振荡。IdleHoldTime指定在允许下一次自动重新启动之前,BGP对等方保持在空闲状态的时间长度。IdleHoldTimer是将对等设备保持在空闲状态的计时器。
自动换行
参考命令@配置BGP邻居震荡抑制功能

Unconfigured Peers
Option 1–AllowAutomaticStart:允许接受来自未预先配置的邻居的BGP对等连接。
Option 1–AllowAutomaticStart-Value:TRUE or FALSE

参考命令
@配置BGP对等体组,可将一组具有相同属性/操作(例如ASN,路由策略等)的对等体加组。

TCP processing
Option 1–PassiveTcpEstablishment:允许被动等待远程BGP对等方建立BGP TCP连接。
Option 1–PassiveTcpEstablishment-Value:TRUE or FALSE
Option 2–TrackTcpState:允许跟踪TCP连接尝试的最终结果或额外交互。
Option 2–TrackTcpState-Value:TRUE or FALSE

参考命令@listen-only表示仅建立被动的TCP邻居关系。
@配置BGP记录指定对等体(组)会话状态和事件信息的功能

BGP Message Processing
Option 1–DelayOpen:允许发送/接收OPEN消息延迟DelayOpenTime(Option 2,value:Time in seconds。由Option 3–DelayOpenTimer触发,value:Time in seconds。)
Option 1–PassiveTcpEstablishment-Value:TRUE or FALSE
Option 4–SendNOTIFICATIONwithoutOPEN:允许对等体发送NOTIFICATION,而无需首先发送OPEN消息。
Option 4–SendNOTIFICATIONwithoutOPEN-Value:TRUE or FALSE
Option 5–CollisionDetectEstablishedState:表示此BGP连接在已建立状态下处理冲突
Option 5–CollisionDetectEstablishedState-Value:TRUE or FALSE

ManualStart
Status:Mandatory,管理员手动启动BGP
Status/Action:PassiveTcpEstablishment强制为False

AutomaticStart
Status:Optional,系统启动BGP
Status/Action:Event发生时,AllowAutomaticStart则强制为True;如果支持PassiveTcpEstablishment则强制为False;Event发生时,如果支持DampPeerOscillations则强制为False。

ConnectRetryTimer_Expires
Definition:ConnectRetryTimer触发
Status:Mandatory。

参考命令此外@如果TCP连接建立不成功,则会在连接ConnectRetryTimer重传定时器超时后再次重新尝试建立连接。Huawei默认32s。

BGPOpen
Definition:收到可用的OPEN message。
Status:Mandatory。
Status/Action:DelayOpen置为False,DelayOpenTimer不运行

KeepAliveMsg
Definition:收到可用的KeepAlive message。
Status:Mandatory。

UpdateMsg
Definition:收到可用的UPDATE message。
Status:Mandatory。

BGP Collision Detection
2006年RFC4271的section-6.8规定:当一对BGP邻居建立对等体时,通常建立两条TCP连接。此时保留BGP Identifier或者Router-ID大的一端的主动连接。

3.2.BGP FSM-BGP状态机

2006年RFC4271的section-8.2.2规定了6种状态机:Idle、Connect、Active、OpenSent、OpenConfirm、Established。在此进行介绍。
此处对RFC4271定义的28种Event及其对应的程序动作不做过多介绍。有意者可查阅相关资料

Idle state:BGP状态机的初始状态。
处于此状态的对等体,BGP拒绝所有入向的连接。并且不分配资源。
@Situation-ManualStart或AutomaticStart Event触发时
对该对等体初始化所有资源;重置ConnectRetryCounter;启动ConnectRetryTimer;启动TCP连接;监听相应TCP连接;过渡到Connect状态。

ConnectRetryTimer是一个本地值,但应足够大以初始化TCP。
其他相关Event,请查阅相关资料。

Connect state:等待TCP连接完成的状态。
@ManualStop Event触发时
丢弃TCP连接;释放所有BGP资源;ConnectRetryCounter为0;停止ConnectRetryTimer并将ConnectRetryTimer设置为0;过渡到Idle状态。

@ConnectRetryTimer_Expires Event触发时
丢弃TCP连接;重启ConnectRetryTimer并将ConnectRetryTimer设置为0;停止DelayOpenTimer并设置为0;初始化TCP连接;继续监听相应TCP连接;维持Connect状态。

@DelayOpenTimer_Expires Event触发时
发送Open消息;设置HoldTimer;过渡到OpenSent状态

@DelayOpen为False
停止ConnectRetryTimer并置为0;完成BGP初始化;发送Open消息;设置HoldTimer;过渡到OpenSent状态

@TCP connection fails Event触发时
如果DelayOpenTimer在运行:重启ConnectRetryTimer并将ConnectRetryTimer设置为0;停止DelayOpenTimer并设置为0;继续监听相应TCP连接;过渡到Active状态。
如果DelayOpenTimer未运行:重启ConnectRetryTimer并将ConnectRetryTimer设置为0;丢弃TCP连接;释放所有BGP资源;过渡到Idle状态。

过渡到OpenSent状态时,设置的HoldTimer建议取4min。
其他相关Event,请查阅相关资料。

Active state:BGP试图通过侦听并接受TCP连接来建立对等体关系的状态。
@ConnectRetryTimer_Expires Event触发时
重启ConnectRetryTimer并将ConnectRetryTimer设置为初始值;初始化TCP连接;继续监听相应TCP连接;过渡到Connect状态。

@DelayOpenTimer_Expires Event触发时
将ConnectRetryTimer设置为0;停止DelayOpenTimer并设置为0;完成BGP初始化;发送Open消息;设置HoldTimer;过渡到OpenSent状态。

过渡到OpenSent状态时,设置的HoldTimer建议取4min。
其他相关Event,请查阅相关资料。

OpenSent state:等待来自对等体open报文的状态。
@HoldTimer_Expires Event触发时
发送相应的NOTIFICATION;将ConnectRetryTimer设置为0;释放所有BGP资源;丢弃相应TCP连接;过渡到Idle状态。

@TcpConnectionFails Event触发时
关闭BGP连接;重启ConnectRetryTimer;继续监听相应TCP连接;过渡到Active状态。

收到来自对等体且正确的Open报文时
重置DelayOpenTimer为0;设置ConnectRetryTimer为0;发送KEEPALIVE报文;设置KeepaliveTimer;设置HoldTimer;过渡到OpenConfirm状态。

在这一阶段协商HoldTimer,取两者较小的值。
其他相关Event,请查阅相关资料。

OpenConfirm state:等待来自对等体Keepalive报文的状态。
@在收到Keepalive报文前HoldTimer_Expires Event触发时
发送相应的NOTIFICATION;将ConnectRetryTimer设置为0;释放所有BGP资源;丢弃相应TCP连接;ConnectRetryCounter增加1;过渡到Idle状态。

@KeepaliveTimer_Expires Event触发时
发送Keepalive报文;设置KeepaliveTimer;维持OpenConfirm状态。

@BGPOpen Event触发。TCP连接由于冲突检测而关闭时
发送相应的NOTIFICATION;将ConnectRetryTimer设置为0;释放所有BGP资源;丢弃相应TCP连接;ConnectRetryCounter增加1;过渡到Idle状态。

@收到Keepalive报文时
重启HoldTimer;过渡到Established状态。

Established state:与对等体交互UPDATE,NOTIFICATION和KEEPALIVE messages的状态。
@HoldTimer_Expires Event触发
发送相应的NOTIFICATION;将ConnectRetryTimer设置为0;释放所有BGP资源;丢弃相应TCP连接;ConnectRetryCounter增加1;过渡到Idle状态。

@收到Keepalive报文
重启HoldTimer;维持Established状态。

@收到UPDATE报文
处理UPDATE报文;重启HoldTimer;维持Established状态。

本地BGP进程每次发送Keepalive或Update报文时,都会重启KeepaliveTimer;+
其他相关Event,请查阅相关资料。
KeepaliveTimer取1/3 Holdtimer,60s。

点击此处回到目录

3.3.Update消息的处理

UPDATE消息仅在Established状态下被接收。
并回忆下三张处理表/库
1@–Adj-RIB-In:邻居入方向的路由信息表/库。用于描述对等体向自己传输的完整路由信息。该路由表未进行入方向的路由策略。
2@–Adj-RIB-Out:邻居出方向的路由信息表/库。用于描述自己向对等体描述的路由信息,或者放置于Update消息报文中的路由信息。该路由表已进行出方向的路由策略。
3@–Loc-RIB:放置已被本地BGP以便进行选择的路由。该路由表已进行入方向的路由策略。

因此有如下的路由处理过程:
简单来说Adj-RIB-In和Adj-RIB-Out是放置于Update报文中的路由信息。

Update消息的接收

2006年RFC4271的section-9将这一过程分成了3个阶段:
Calculation of Degree of Preference、Route Selection和Route Dissemination。

Phase 1–Calculation of Degree of Preference:主要基于LOCAL_PREF属性或路由策略对IBGP路由进行确定。

Phase 2–Route Selection:主要考虑Adj-RIBs-in中符合条件的所有可用路由进行路由选择。这里的不可用包括NEXT_HOP不可用,AS_PATH包含循环AS路径等。

RFC4271对路由竞选做出了如下建议,同时说明BGP可以使用任何产生与此结果相同的实现算法。
a@:选择AS_PATH属性中AS最短的。但对于无序排列的AS集合,也即AS_SER型,取长度为1;
b@:选择Origin属性中最低Origin Value的。
c@:在相邻的AS(通过AS_PATH确定),比较MED选择MED值小的。没有MED属性则认为其具有最低的MED值。该比较原则较为复杂,有意者可查阅相关资料。
d@:EBGP路由优于IBGP
e@:优选到NEXT_HOP的metric小的路由
f@:优选BGP Identifier/Router-ID小的路由
g@:优选peer address小的路由
由于RFC更新调整及各厂家实现上的区别,其他比较原则不在此处做更新。

Phase 3–Route Dissemination:主要基于配置的策略,将Loc RIB中的所有路由处理为Adj-RIB-Out。

@限制接收BGP路由的数量

Update消息的发送:RFC4271规定了如下原则:
@:从IBGP接收的路由不得转发给IBGP邻居,除非你该BGP Speaker为Route-Reflect(RR,路由反射器)
@:为了避免过多的路由消息影响链路带宽应当对协议报文发送进行限制。

MinRouteAdvertisementIntervalTimer:发送或撤销特定路由的最短间隔。并且处于快速收敛的需要,IBGP邻居的该参数应短于EBGP。建议分别取5s和30s。
MinASOriginationIntervalTimer:在AS内部通告Update报文的最短时间。

@:为了提高路由信息的传递效率,BGP也支持路由聚合等方式。

聚合有如下原则
@MULTI_EXIT_DISC属性不同的路由,不可聚合。
@NEXT_HOP属性不同的路由,聚合时取自身接口地址。
@如果聚合路由中至少有一条ORIGIN值为INCOMPLETE路由,则聚合路由ORIGIN属性值必须为INCOMPLETE。如果聚合路由中至少有一条ORIGIN值为EGP,则聚合路由ORIGIN属性值必须为EGP值。在所有其他情况下,聚合路由的ORIGIN属性的值为IGP。
@AS_PATH属性相同的路由,聚合时取该AS_PATH。
@被聚合路由中的任何AGGREGATOR属性都不得包含在聚合路由中。

点击此处回到目录

4.BGP相关特性

目前来说BGP有如下特性:
1@:BGP路由限制及震荡。

@限制接收BGP路由的数量@对BGP路由进行阻尼或震荡惩罚。Half-life–惩罚值减少一半的时间,默认15min;reuse–路由重新启用阈值,默认750;Suppress–惩罚阈值,默认2000;Ceiling:惩罚值上限;默认每次震荡惩罚值增加1000。

2@:BGP保留BGP Identification/Router-id大的一方发起的TCP会话
3@:IBGP邻居报文的TTL默认255,EBGP邻居报文的TTL默认1。

与TTL相关的命令:@用于调整EBGP对等体的TTL,默认为1。
自动换行
@用于使能BGP的GTSM(Generalized TTL Security Mechanism)功能对TTL进行限制。对于TTL不在[255-X+1,255]区间的BGP报文进行GTSM。X为指定的TTL。

4@:BGP的Keepalive报文发送间隔<=Open报文中Holdtime字段值/3。并且Keepalive发送间隔是一个本地参数,仅在本地有效。


5@:只发送更新或变化的路由;或者手动触发更新,发送全量路由。
6@:从IBGP对等体获得的路由,只发布给EBGP对等体。

在对等体本身不是Route-Reflect(RR,路由反射器)时,不发送给IBGP邻居。
同时BGP有一个古老的的同步功能:如果一条路由没有从IGP学习到,即使其有效也不传递给邻居。
同步功能:AR1–(EBGP)–AR2–(IBGP)–AR3–(IBGP)–AR4–(EBGP)–AR5
AR4传递AR1传递过来的路由,必须要在IGP内部可达。否则不会进行同步传送给AR5/否则不下放入路由表并且不传递给EBGP邻居。

7@:从EBGP对等体获得的路由,发布给所有EBGP和IBGP对等体。且传递给IBGP路由时,认为该路由可靠因此不改变路由的下一跳。EBGP默认使用peer地址更改下一跳。

@仅对IBGP生效,将自身建立邻居的地址作为下一跳进行发送给IBGP。

8@:只将BGP的最优路由发布给对等体。

@BGP的最优路由也不一定下放至IP路由表,active-route-advertise用于额外设置在IP表中有效的才发布给对等体。
此外还有:
@禁止将最优BGP路由下放至IP路由表,但是传递路由不受影响。可以用于防止某些情况下的次优路径。

9@:BGP不传递无效路由。

4.1.BGP路由选路原则

RFC4271对路由竞选做出了如建议,(可查看《3.3.Update消息的处理》),同时说明BGP可以使用任何产生与此结果相同的实现算法。
不同厂家对BGP协议的选路原则可能略有差别,有意者可查阅相关资料
1@:比较Weight/Preferred-value,越大越优。

@Weight为CISCO私有属性,并且仅本地有效不可传递。并且这是一个入站策略,因此如果使用路由策略只能在in的方向。本地始发路由默认值32768,但对于其他路由默认值0。
@Preferred-value为Huawei私有属性。仅本地有效不可传递。所有路由默认为0。
并且

2@:比较LOCAL_PREF,越大越优

只在IBGP peer间进行通告,是一个出站策略用于路由策略OUT方向。默认值100。

3@:优选本地作为下一跳,也即始发路由。

Huawei始发路由中:手动汇总路由>自动汇总路由>network路由>引入路由。
CISCO始发路由中:network>redistribute>aggregate

4@:比较AS_PATH属性,优选经过AS Number少的。

前边提到AS_PATH可分为AS_SET无序集合和AS_SEQUENCE。对于无序的AS集合部分,认为其长度为1;联盟也认为其为1。
@忽略AS_PATH作为优选路径的条件。

5@:比较Origin属性,优选Value值小的。

Value=0表示IGP,通过network命令注入的路由;Value=1表示EGP,通过EGP学习得到的路由;Value=2表示INCOMPLETE,通过其他方式学习到的路由。
也可表示为i>e>?。

6@:比较MED属性,优选Value值小的。
7@:比较对等体类型,EBGP优于IBGP。
8@:比较到NEXT_HOP的开销,优选开销小的。
如果以上规则无法优选,且此时配置了ECMP则允许ECMP。

要求AS_Path属性完全相同。–长度及内容一致。
@允许AS_PATH内容不同的路由进行负载。
负载情况适用于接收路由场景,在传路由时必须要选出最优那一条路由进行传递。

Huawei在此之上定义了
9@:比较cluster list,优选短的。
10@:比较BGP Identification/Router-ID,优选小的。如果包含RR属性用originator-id进行比较,优选小的。
11@:比较对等体地址,优选建立邻居地址小的。
@华为支持规则9和规则10的倒换。

CISCO在此之上定义了
9@:从EBGP收到的路由,BGP优先使用最先收到的路由条目(最老的路径)。这能最小化路由抖动。
10@:比较BGP Identification/Router-ID,优选小的。如果包含RR属性用originator-id进行比较,优选小的。
11@:比较cluster list,优选短的。
12@:比较对等体地址,优选建立邻居地址小的。
13@:比较cost communityID属性,先比cost number后比较cost communityID,都是越低越优先。cost communityID属性原则应用于选路原则的第8条之后,这个属性传递给邻居时要有send-community命令。

4.2.BGP Route-Reflect–路由反射

为了在同一个AS内部进行路由传递,可以通过Route-Reflect(RR,路由反射)方式进行传递。
通过这种方式,允许将从IBGP邻居学习到的路由发送给特定IBGP邻居,打破了IBGP邻居关系全互联的需求,减少IBGP会话数量。

在同一个AS Number中,IBGP邻居不会将路由发布给其他IBGP邻居,本地始发路由除外,这称为BGP的水平分割。
路由反射只存在IBGP对等体关系中。
通过Confederations联盟或Full Mesh全互联也可以实现相似的效果。

RR场景中对等体角色
RR:路由反射,用于向Client反射路由。反射规则后续介绍。
Client:RR的客户机,接收RR反射而来的路由。
Non-Client:RR的非客户机。

@RR是一个本地概念/相对概念,每台设备只能知晓自己的角色以及对等体角色
@指定自己为RR角色,某邻居的作为自己的Client。默认所有IBGP邻居间都是Non-Client关系
@此外,还有Clust集群和备份RR的概念:
类似于Backup-DR。备份RR与RR之间互为Non-Client角色,并在同一个Clust中。
@路由反射器和它的客户机组成一个集群(Cluster),使用AS内唯一的Cluster ID作为标识

RR路由反射规则
1@:RR之间需要建立IBGP的全互联。用于接收其他IBGP传递的始发路由。
2@:RR只与Client和Non-Client建立IBGP邻居。建立星形拓扑。
3@:从EBGP接受到的路由,被RR传递给Client和Non-Client
4@:从Non-Client接受到的路由,被RR传递给Client和RR
5@:从Client接受到的路由,被RR传递给Client

RR防环机制

利用2006年RFC4456定义Originator_ID属性和Cluster_List属性进行防环。
传给EBGP时,Originator_ID和Cluster_List取消
Flag:1字节。
Type Code:1字节。
Length:1字节。

Originator_ID:用于簇内防环
1@:由RR产生,携带本地AS内始发路由器的Router-id。
2@:在RR反射路由出去时或在发送Update报文时,添加Origintor_ID属性
3@:接收到携带Originator_ID属性的路由并将其反射时,Originator_ID属性不变。
4@:RR/Client/Non-Client会将收到Originator_ID属性中包含自己BGP Identification/Router-ID的路由丢弃。

Cluster_List:用于簇间防环
1@:每经过一个RR,就将RR的Cluster-id添加到Cluster_List第一位(与AS_PATH类似)
2@:同一个Cluster的RR和备份RR一般配置相同Cluster-id
3@:RR/Client/Non-Client会将收到Cluster_List属性中包含自己BGP Identification/Router-ID的路由丢弃。

@指定Cluster-id。只能在路由反射器上配置集群ID不能和客户机的Router ID相同。

RR的路由策略只能应用在IN方向,OUT方向无效。也即对于反射的路由,只能在入方向进行配置

RR在IBGP邻居路由器之间,只是用来简单的打破水平分割,当做一个转接点,将IBGP的路由没有任何变化的传递给自己的其他IBGP邻居;只是用来简单的转发,仅此而已。
同级反射和分级反射也只是RR上的逻辑区分,此处不做详细区分。

点击此处回到目录

4.3.BGP Confederations–联盟

为了在同一个AS内部进行路由传递,可以通过部署Confederations联盟
联盟:将一个AS又划分为多个成员AS。总体对外呈现一个AS Number。联盟内部用于成员AS进行区分。

一般建议成员AS Number使用私有AS Number。
2013年发布的RFC6996有分类:64512-65534以及4200000000 - 4294967294为私有AS,其他为公有AS。
此外RFC6793定义了AS 23456作为AS_Trans以及RFCRFC7607定义了AS 0的特殊处理。可阅读《2.1.Open报文介绍》章节查看有关RFC6793相关内容。

联盟配置步骤:由于联盟实现方式与RR有显著差别,需对配置进行说明
1@:全局下配置BGP实例/进程,作为成员AS Number。
2@:指定联盟AS Number,作为对外整体AS Number。
3@:指定联盟中的其他成员AS Number,用于建立联盟内部的EBGP邻居。

1@
2@
3@

联盟防环原则:主要还是AS_PATH来防环
1@:从联盟EBGP得到路由,还是当从IBGP邻居传来路由等同对待。

因此,@从联盟EBGP邻居得到的路由传递给联盟EBGP邻居/联盟IBGP邻居)时,无法使用next-hop-locol修改路由的下一跳属性。
@从IBGP邻居得到路由传递给成员EBGP邻居,无法使用next-hop-local修改路由的下一跳属性。
@从联盟EBGP邻居得到的路由传递给IBGP邻居时,无法使用next-hop-local修改路由的下一跳属性。

2@:从联盟EBGP邻居传来的路由在整个联盟内部,next-hop属性不变。
3@:从联盟外EBGP邻居得到的路由传递给成员EBGP邻居时,可以使用next-hop-local修改路由的下一跳属性。其他情况不允许修改下一跳。

联盟的AS_PATH
1@:从联盟向联盟外的EBGP邻居传递路由,(如果可传递的话),会以Confederation ID(联盟AS Number)替换在联盟内部历经的AS Number。
2@:在联盟内AS传出会用()包含,(也即从联盟的内EBGP邻居传出),并且()中无论有多少个AS都将该AS_PATH长视为0。
3@:在联盟内修改AS-PATH只对联盟内AS-PATH属性生效,即小括号内的AS-PATH修改。
4@:来自联盟外的EBGP邻居传递路由,不接受出现Confederation ID(联盟AS Number)的路由但接收成员AS Number的路由。
5@:来自联盟内的EBGP邻居传递路由,不接受出现成员AS Number的路由但接收包含Confederation ID(联盟AS Number)的路由。

联盟某种程度上是一个本地概念或本AS内的概念,因为联盟场景不在报文上做明显的区分。

4.4.正则表达式

正则表示式,主要是借用了程序语言的字符串概念。主要用于匹配具有某些特征的字符串。
BGP可以用于匹配AS_PATH等属性做相应的路由策略。主要原理是将AS_PATH作为字符串进行正则表达式匹配。

正则表示式由直接量和元字符组成:直接量为文本信息,元字符为运算信息。可以理解为直接量是数字等符号,元字符是加减乘除等运行符。

字符 匹配结果 实例
. 匹配任意单个字符,包括空格
* 匹配*前单个字符,包括0次或多次
+ 匹配+前单个字符,至少1次
? 匹配?前单个字符,包括0次或多次
^ 匹配字符串开始 ^345=匹配345打头的字符串
$ 匹配字符串结束 345$=匹配345结束的字符串
_ 匹配单个符号 ^345_=匹配345打头,且之后为空格的字符串
() 匹配一整个变化或独立的匹配
| 逻辑或 (1|2)=匹配1或2
[] 一组字符的集合 1[23]4=匹配124和134
当[]中第一个字符为^表示补集
- 连接符 1-4=匹配 1至4
\ 转义字符

@定义一个名为test动作permit的AS_PATH原则的正则表达式。
@在对等体的IN方向调用正则表达式test进行AS_PATH过滤。

4.5.BGP的路由聚合

Huaiwei的BGP支持自动聚合和手动聚合。
@自动聚合路由。只可对BGP引入的路由进行聚合,但自身network和邻居学习到的无法自动聚合,且只能将其聚合为ABC类路由。同时抑制明细路由的发布。

@手动聚合。BGP路由表中至少存在一条属于聚合路由的子网路由,否则聚合不会生效。并且可以通过指定参数进行汇总。
as-set=指定生成具有AS_PATH为AS-SET的路由。
attribute-policy=指定设置聚合后路由的属性策略名称。
detail-suppressed=指定仅通告聚合路由,但该聚合路由带Atomic-aggregate属性,并且不能携带原具体路由的团体属性。
origin-policy=指定允许生成聚合路由的策略名称,也即仅在匹配路由策略时才生成聚合路由
suppress-policy=指定抑制指定路由通告的策略名称

点击此处回到目录

更新

BGPv4-原理介绍+报文分析+配置示例相关推荐

  1. 组播IGMP-原理介绍+报文分析+配置示例

    个人认为,理解报文就理解了协议.通过报文中的字段可以理解协议在交互过程中相关传递的信息,更加便于理解协议. 因此本文将在IGMPv2协议报文的基础上进行介绍,以详细介绍主机-路由器IGMP组播协议.I ...

  2. 组播MSDP-原理介绍+报文分析+配置示例

    个人认为,理解报文就理解了协议.通过报文中的字段可以理解协议在交互过程中相关传递的信息,更加便于理解协议. 因此本文将在MSDP协议(Multicast Source Discovery Protoc ...

  3. IPv6/ICMPv6-原理介绍+报文分析+配置示例

    个人认为,理解报文就理解了协议.通过报文中的字段可以理解协议在交互过程中相关传递的信息,更加便于理解协议. 因此本文将以IPv6的常用协议上进行介绍,以详细介绍IPv6的相关内容. 关于ICMPv6相 ...

  4. SRv6(BE)-原理介绍+报文解析+配置示例

    个人认为,理解报文就理解了协议.通过报文中的字段可以理解协议在交互过程中相关传递的信息,更加便于理解协议. 因此本文将以SRv6 BE场景下报文交互过程为例,以详细介绍SRv6. 有关于SR-MPLS ...

  5. 组播PIM-原理介绍+报文分析+配置示例

    个人认为,理解报文就理解了协议.通过报文中的字段可以理解协议在交互过程中相关传递的信息,更加便于理解协议. 因此本文将在PIMv2协议报文的基础上进行介绍,以详细介绍组播协议PIM. 这里需要说明的是 ...

  6. Anycast功能原理OSPF报文分析-上手必看

    系列文章目录 Anycast介绍及应用场景 OSPF报文分析 BFD与OSPF联动 OSPF-常见问题 文章目录 系列文章目录 Anycast介绍及应用场景 OSPF报文分析 BFD与OSPF联动 O ...

  7. 大数据Hadoop之——Kafka Streams原理介绍与简单应用示例

    文章目录 一.Kafka Streams概述 1)Kafka Streams是什么 2)流式计算与批量计算区别 3)Kafka Streams特点 二.Kafka Streams流处理拓扑 1)相关概 ...

  8. 华为——OSPF单区域实验配置,实验抓包分析,五种报文分析,六种LSA介绍,以及如何建立邻接关系的七种状态

    华为--OSPF单区域实验配置,实验抓包分析,五种报文分析,六种LSA介绍,以及如何建立邻接关系的七种状态 前言 一:OSPF简介 1.1:工作原理 1.1.1:架构介绍 1.1.2:信息传递 1.1 ...

  9. H3C交换机MAC VLAN原理及配置示例

    对于不是很常用的MAC VLAN,许多读者都感到很陌生,读者QQ群中也经常见到有读者提到这方面的问题,希望我给予解答.现从笔者编著,目前在全国热销的<Cisco/H3C交换机配置与管理完全手册& ...

最新文章

  1. 博威特瞄准数据备份市场
  2. 每天一个linux命令(61):vi命令 /企业常用的linux命令清单
  3. 调用webservice或wcf时,提示:无法加载协定为的终结点配置部分,因为找到了该协定的多个终结点配置。请按名称指示首选的终结点配置部分。
  4. java实现数据库内容修改_数据库更改到Java环境中实现可持续和平
  5. 第一章 计算机系统概述 1.1 计算机发展史 [计算机组成原理笔记]
  6. windows7、windows8、windows10、xp系统下载安装包及教程(U盘制作、直接安装)
  7. 黑莓手机用desktop manager安装了一些软件后重启出现erro523无法进入桌面
  8. Error: label vector and instance matrix must be double的解决方法
  9. 牛客 送分啦-QAQ
  10. 大型医院叫号管理系统源码
  11. 电视厂商渐进式占领“高清奥运”
  12. CCTalk:为什么你做了很多无效的自动化?
  13. 组件‘mscomctl.ocx‘或它的一个依赖项没有正确注册:一个文件丢失或无效
  14. 《卓有成效的管理者》——学习心得(一)
  15. houdini 摄像机使用
  16. Android Framework添加自定义服务和接口
  17. vivo图像算法工程师双非研究生可以吗_双非材料专业小硕秋招春招找工作历程,希望对大家有帮助,劝退警告!!!...
  18. Android Studio Canvas 实现鼠标贝塞尔曲线拖尾特效(富文本编辑器)
  19. 东北大学继续教育学院计算机辅助数控编程,计算机辅助数控编程B卷李虎.doc离线.doc...
  20. 视频教程-【无废话课程】Maya软件初级教学UV拆分基础入门【字幕版】-Maya

热门文章

  1. 【java面试】6万字最全Java知识体系梳理,还在找面试题?看这篇就够啦
  2. XMing + XShell 打开Linux服务器网页界面
  3. centos7中安装pip
  4. OSGI框架------HelloWorld程序
  5. java数值运算divide_Java常用的计算机数字运算函数
  6. 微信 html 压缩,微信视频过大如何发送 微信视频过大怎么压缩 微信怎样发送超过20M的视频...
  7. [内附完整源码和文档] 基于JAVA的网吧机房管理系统
  8. 孙素丹老师 银行数字化场景营销专家
  9. Matlab plot()自定义线宽及保存高清大图
  10. Python循环语句简单练习题及答案解析