BGP(Border Gataway Protocol,边界网关协议)是一种用于解决OSPF不适用于超大型或者跨AS的距离矢量协议,能够路由选优、避免环路、高效传递路由(本身不产生路由条目,只传递通告进BGP内的路由)和维护大量路由;
主要内容包括:BGP相关术语、BGP报文、BGP路由属性、路由黑洞的原因、BGP路由反射器和联盟、BGP状态机以及BGP工作原理
IBGP:运行于同一AS区域的BGP路由器之间的关系;从IBGP设备上学习到的路由不会再发给其他IBGP设备(IBGP防环);
EBGP:运行于不同AS区域的BGP路由器之间的关系;当EBGP设备从其他EBGP设备收到路由条目后,会查看路由条目的AS-Path列表,如果发现列表中包含有本地的AS号,就会丢弃该报文(EBGP防环);
Speaking:发送BGP报文的设备,发送BGP报文给其他Speaking设备,网络中每一台BGP设备的都能成为Speaking设备;
Peer:对等体,相互发送报文的Speaking设备之间称为对等体;
BGP路由器ID:唯一标识BGP网络中BGP设备,与OSPF的RID的作用和获取方向相同(手动配置、环回口IP或物理接口IP);一旦选出路由器ID,除非接口地址被删除等事件,否则即使配置了更大的IP地址也不会发生改变;
BGP协议本身不产生路由条目,只会传递通告的路由条目;BGP在传递路由条目时,会使用五种报文建立邻居关系或者断开邻居关系等,这五种报文分别是:Open报文(建立)、Update报文(更新)、Notisifaction报文(通知)、Keepalive报文(保持活跃)和Route-refresh报文(路由刷新);
- Open(建立)报文:TCP连接建立后,发送的第一个BGP报文,包含有本地Speaking信息以及后面建立对等体BGP连接的相关信息,用于建立BGP连接(BGP会话);
- Update(更新)报文:用于对等体间路由信息的交换;
- Notification(通告)报文:用于通告错误状态,如果BGP检测到有错误信息就会发送此状态,使得对等体变为初始状态;
- Keepalive(保持活跃)报文:用于维持BGP对等体连接;
- Route-Refresh(路由刷新)报文:用于改变路由策略后请求对等体重新发送路由信息。只有支持路由刷新功能的路由器才能进行响应(该报文不需要BGP设备发送整个BGP路由表,只需发送发生改变的部分BGP路由表);
Open报文、Update报文、Keepalive报文、Notification报文和Route-Refresh报文采用相同的BGP包头信息,格式如下:
报文字段 | 说明 |
---|---|
Marker | 标记字段,用于标记BGP边界报文,固定值为所有比特均为“1”; |
Length | 长度字段,标识整个报文的字节大小; |
Type | 报文类型字段,标识报文类型,数值为1-5,分别对应Open、Update、Notification、Keepalive和Router-Refresh报文; |
报文字段 | 说明 |
---|---|
Version | 版本字段,标识本地使用的BGP版本号; |
My Autonomous System | 本地AS号字段,标识本地设备所在的AS号,比较两端的AS号可以知道是IBGP(AS号相同)或EBGP(AS号不同); |
Hold Time | 标识BGP对等体间保持连接的时间,单位为秒,在建立对等体关系时两端会将Hold Time同步,在该定时器里没有收到Update或Keepalive报文就会断开连接; |
BGP Identity | BGP路由器ID字段,用来唯一标识BGP设备,与OSPF的RID相同; |
Opt Parm Len | 可选参数长度字段,标识可选参数的长度,有可选参数就为可选参数长度,没有就为“0”; |
Optional Parameters | 可选参数字段,用于多协议扩展等功能,如:BGP认证; |
报文字段 | 说明 |
---|---|
Unfeasible Route Length | 不可达路由长度字段,标识不可达路由的长度,单位为字节,通知对等体需要撤销的不可达路由的长度,如果为0,就没有下列的Withdraw Routes字段(没有要撤销的路由条目); |
Withdraw Routes | 撤销路由字段,长度可变,包含了要从对等体BGP路由表中要撤销的网络地址和前缀; |
Total Path Attribute Length | 整个路径属性长度字段,包含了路由条目的相应路径属性的长度,如果为0,表示就没有下列Path Attribute字段; |
Path Attribute | 路径属性字段,与NLRI相关的所有路径属性,每个路径属性都由TLV(Type-Length-Value)组成,用于避免环路、选路和协议扩展等; |
NLRI(NetworkLayer Reachabinity Information) | 网络层可达路由字段,长度可变,包含了所有要向BGP对等体通告的可达路由条目和前缀; |
报文字段 | 说明 |
---|---|
Error Code | 差错码字段,指定错误类型; |
Error Subcode | 差错子码字段,描述错误类型的详细原因; |
Data | 错误内容字段,用于辅助发现错误原因,内容依赖于差错码和差错子码,记录出错部分的数据 |
Keepalive报文结构:
Keepalive报文是为了维持BGP对等体连接,因此该报文可以不用包含信息,报文格式就是BGP报头,该报文的Type值为4;
报文字段 | 说明 |
---|---|
AFI | 地址族标识字段,用于标识所采用的不同地址类型; |
Res | 保留字段,必须为“0”; |
SAFI | 子地址族标识字段,用于标识不同的地址类型; |
BGP的多扩展协议常使用到两种属性,分别是:扩展协议可达NLRI(MP_REACH_NLRI,属性值为14)和扩展协议不可达NLRI(MP_UNREACH_NLRI,属性值为15)。这两种属性都包含了地址族(Address Fimaly)和子地址族(Sub-Address Family)。
地址族是一种网络层协议的配置模块,也就是说将不同类型的网络进行分类配置,其目的是对于运行在不同网络层协议的网络分别配置,便于不同网络类型的管理;
地址族使用地址族标识符(Address Family Identifier,AFI),子地址族使用子地址族标识符(Subsequent Address Family Identifier,SAFI);
MP-BGP协议族 | AFI | SAFI |
---|---|---|
IPv4 Unicast(IPv4单播) | 1 | 1 |
IPv4 Multicast(IPv4组播) | 1 | 2 |
IPv4 Lable(IPv4 MPLS) | 1 | 4 |
IPv4 VPNv4(IPv4 VPN) | 1 | 128 |
IPv4 MDT(IPv4组播分部树) | 1 | 66 |
IPv6 Unicast(IPv6单播) | 2 | 1 |
IPv6 Multicast(IPv6组播) | 2 | 2 |
L2VPN(二层VPN) | 192 | 128 |
VPSL(虚拟专用局域网服务) | 25 | 65 |
- 公选必遵:所有BGP设备都能识别该属性(公选),该属性必须包含进Update报文里(必须遵守);
- 公选任意:所有BGP设备都能识别该属性(公选),该属性可以不包含进Update报文里(任意);
- 可选过渡:BGP设备可以不识别该属性(可选),如果BGP设备不识别该属性,仍然会接收该属性并通告给其他BGP设备(过渡);
- 可选非过渡:BGP设备可以不识别该属性(可选),如果BGP设备不识别该属性,仍然会接收该属性,但不会通告给其他BGP设备(非过度),仅在本地使用;
属性名 | 属性类型 |
---|---|
Origin(源) Next_Hop(下一跳) AS_Path(AS路径) |
公选必遵 |
Local_Pre(本地优先) | 公选任意 |
Community(团体) | 可选过渡 |
MED(多出口区分) Cluster_ID(集群ID) Originator_ID(始发者ID) |
可选非过渡 |
用于标识从不同的设备上学习到的路由条目,当BGP设备上有多条去往相同目的但是从不同设备上学习的,就会比较Origin属性的优先级(i>e>?);
- IBGP(i):从IBGP对等体设备学习到的路由条目,标记为“i”,优先级最高;
- EBGP(e):从EBGP对等体设备学习到的路由条目,标记为“e”,优先级次之;
- 非BGP设备(?):从非BGP设备学习到的路由条目,标记为“?”,优先级最低;
下一跳,EBGP之间的下一跳是指下一个AS区域而不会路由器;IBGP设备间的传递路由条目的时候是不会发送修改下一跳;
从IBGP设备学习到的路由条目不会再发送给其他的IBGP设备(IBGP防环);
用来标识路由条目经过的AS区域,从IBGP对等体收到的路由条目是没有AS_Path属性的,当EBGP设备从对等体设备收到路由条目后会查看该属性列表中的是否有本地的AS号,如果有就丢弃报文,如果没有就将本地AS添加进AS_Path属性列表(EBGP设备之间的防环);
Local_Pref数值越大,优先级越高,用于判断流量离开时路径的选择,仅在本地AS区域内通告和比较,不发送给其他AS区域(在IBGP对等体之间比较);
当R1想要向R4发送报文时,发现两条路由条目,一条是走R2另一条是走R3的,进一步比较属性值后,R1走R3方向(R3方向的本地优先级属性值更大,默认其他属性都相同);
Community属性是一组有相同特征的BGP路由条目集合,用来简化路由策略的应用和降低维护管理维度,可以为团体中的成员一次性配置相同的参数和路由策略,也可以通过团体属性进行过滤;
Community属性可以分为基本团体属性和扩展团体属性;
基本团体属性的**“Type Code”值为8,属性取值为32位**,其中Ox00000000-0x0000FFFF和0xFFFF0000-0xFFFFFFFF保留(前16位表示路由的源AS号,后16位可以理解为源AS号的子AS号,也可以用来标识路由来自不同的IGP路由类型,或本地优先级,MED值等):
基本属性的常用属性取值有:
- INTERNET:默认情况下,所有的路由都属于该团体属性,会被通告给所有的BGP对等体设备;
- NO_EXPORT(0xFFFFFF01):属于该属性值的路由条目不会将路由条目通告给本地AS之外的设备,但是会通告给联盟的子AS号内;
- NO_EXPORT_SUBCONFED(0xFFFFFF03):属于该属性值的路由条目不会将路由条目通告给本地AS之外的对等体设备,也不会发送给联盟的子AS内;
- NO_ADVERTISE(0xFFFFFF02):具有该属性的路由条目被接收后,不会通告给其他任何BGP对等体;
扩展团体属性是为了解决原有的32位属性值不够用的问题,扩展团体属性的“Type Code”为16,属性取值为64位,并且添加了一个“Type”字段,使得路由策略能够通过“Type”直接对团体属性进行操作;
相当于COST值,数值越小,优先级越高,用于判断流量进入AS区域的路径选择,仅在两个AS区域之间交换;
R4与R2为IBGP邻居。当R1将IP地址(2.1.1.1)通告给R2之后,R2会将其通告给IBGP对等体R4,就会将路由条目发送给R3,但是R3不是BGP路由设备不会把该路由条目添加进路由表中,而是直接将路由条目发送给R4,R4收到后会将路由条目发送给EBGP对等体R5,最终R1、R2、R4和R5学习到了2.1.1.1的路由条目,R3没有该路由条目;
当R5访问R1的2.1.1.1网络时,会将报文发送给R4,R4查找路由条目就会将其发送给R3,但是R3收到去往2.1.1.1的报文后,查看路由表,发现自己并没有去往2.1.1.1的路由条目(传递路由条目的时候,并没有将2.1.1.1的路由加入R3的路由表),就会将报文丢弃,导致通信失败,形成路由黑洞;
为了更简单的解决路由黑洞问题,就产生了几种技术,分别是路由反射器、路由联盟和MPLS(按下不表,以后写关于MPLS VPN的部分会讲解);
解决路由黑洞的方法还有一个是AS区域内的所有路由进行IBGP的全互连,拿上述图形来说,要解决问题就需要 R2、R3和R4都建立IBGP邻居关系,当AS区域内的路由器多了之后,工作量也会急剧增加;
BGP路由反射器解决路由黑洞的方式是打破从IBGP对等体学习到的路由条目不会发送给其他IBGP对等体的更新规则;
RR向邻居IBGP设备发布路由的原则:
- 从非客户机学习到的路由条目,会通告给所有的客户机;
- 从客户机学习到的路由条目,会通告给所有的非客户机和客户机(发起次路由条目的客户机除外);
- 从EBGP对等体上学习到的路由条目,会发布给所有的客户机和非客户机;
注:客户端与非客户端收到BGP路由条目时,会先发送给RR,再由RR按照发布路由原则发送路由条目。
Cluster_ID属性防止集群间环路的机制:
- 每经过一个集群,就会将集群的ID添加进Cluster_ID属性列表里,与AS_Path属性的工作原理类似:
- 当一条路由第一次被RR通告时,会将本地Cluster_ID添加进Cluster_ID属性列表里;
-> 当RR收到一条路由时,会查看Cluster_ID属性列表中是否包含本地Cluster_ID,如果包含就丢弃;如果不包含就将本地Cluster_ID添加进该属性;
Originator_ID属性防止集群内环路的机制:
- Originator_ID是由RR产生的,使用的是始发者的路由器ID(RID);
- 当一条路由第一次被RR通告时,会将本地Originator_ID添加进Originator_ID属性列表里;
- 当IBGP设备收到路由条目后,会查看本地RID是否与路由条目的Originator_ID相同,如果相同,就丢弃(相当于发送此路由条目的IBGP设备,又再次收到了自己发起的路由条目,进而说明集群内产生了环路,为避免环路就将该路由条目丢弃)
BGP联盟就是将一个AS区域划分出多个子AS区域,子AS区域间的BGP设备关系为EBGP对等体,子AS区域内的BGP设备关系为IBGP对等体,并且保留原来的AS号作为联盟ID,这样可以保留原有的IBGP属性,如Local_Pref、MED等,并且联盟相关的属性在传出联盟时,会自动将其删除,无需管理员手动过滤。
BGP的有六种状态机:Idle(空闲)、Connect(连接)、Active(活跃)、OpenSent(Open报文已发送)、OpenConfirm(Open报文已确认)和Establish(连接已建立);
A. Idle为BGP的初始状态,此状态下BGP设备拒绝邻居发起的TCP连接请求,只有设备收到了“Start”事件后,BGP设备才会接收TCP连接请求,并切换至Connect状态;
注:start事件可以是配置一个BGP过程、重启BGP进程等;
B. 在Connect状态,BGP启动连接重传定时器,等待TCP连接成功
- a) 如果TCP连接成功,本地BGP设备就会向对等体设备发送Open报文,并切换至OpenSent状态;
- b) 如果TCP连接失败(BGP对等体设备没有响应),就会切换至Active状态,不断尝试TCP连接,直至连接重传定时器超时后,BGP设备就会停留在Connect状态;
C. 在Active状态,BGP设备会不断的尝试TCP连接;
- a) 如果TCP连接连接成功,本地BGP设备就会向对等体设备发送Open报文,并切换至OpenSent状态;
- b) 如果直到连接重传定时器超时后,仍没连接成功,就会切换并停留在Connect状态;
D. 在OpenSent状态,本地BGP设备等待对等体设备发送的Open报文,并对Open报文中AS号、版本号、认证码等进行检查;
- a) 如果Open报文正确,本地BGP设备就会向对等体设备发送Keepalive报文,并切换至OpenConfirm状态;
- b) 如果Open报文信息有误,本地BGP设备就会向对等体设备发送Notification报文,并切换至Idle状态;
E. 在OpenConfirm状态,本地BGP设备等待对等体设备发送的Keepalive报文或Notification报文;
- a) 如果收到Keepalive报文,本地BGP设备就会向对等体发送Update报文,并切换至Establish状态;
- b) 如果收到Notification报文,本地BGP设备就切换至Idle状态;
F. 在Establish状态,本地BGP设备等待对等体设备发送的Keepalive报文、Notification报文或Update报文;
- a) 如果Keeepalive报文或Update报文(Update报文内容无误),本地BGP设备就会认为对等体上设备处于正常,维持BGP连接状态;
- b) 如果收到Notification报文,本地BGP设备就切换至Idle状态;
注:从EBGP设备学习到的路由条目会发送给所有的EBGP和IBGP对等体;
从IBGP设备学习到的路由条目会发送给EBGP对等体,但不发送给其他IBGP对等体;
所有对等体发布的BGP路由,BGP设备都会接收;
路由更新时(Route-Refresh报文),BGP设备只发送要更新的路由条目,而不是整个路由表;