第四章 BGP协议4.1 BGP 简介BGP(Border Gateway Protocol,边界网关协议)是一种用于AS(Autonomous System,自治系统)之间的动态路由协议。
AS 是拥有同一选路策略,在同一技术管理部门下运行的一组路由器。
早期发布的三个版本分别是BGP-1(RFC 1105)、BGP-2(RFC 1163)和BGP-3(RFC 1267),当前使用的版本是BGP-4(RFC 1771)。
BGP-4 做为事实上的Internet 外部路由协议标准,被广泛应用于ISP(Internet Service Provider,因特网服务提供商)之间。
BGP 特性描述如下:BGP 是一种外部网关协议(Exterior Gateway Protocol,EGP),与OSPF、RIP 等内部网关协议(Interior GatewayProtocol,IGP)不同,其着眼点不在于发现和计算路由,而在于控制路由的传播和选择最佳路由。
BGP 使用TCP 作为其传输层协议(端口号179),提高了协议的可靠性。
BGP 支持CIDR(Classless Inter-Domain Routing,无类别域间路由)。
路由更新时,BGP 只发送更新的路由,大大减少了BGP 传播路由所占用的带宽,适用于在Internet 上传播大量的路由信息。
BGP 路由通过携带AS 路径信息彻底解决路由环路问题。
BGP 提供了丰富的路由策略,能够对路由实现灵活的过滤和选择。
BGP 易于扩展,能够适应网络新的发展。
在Internet 上,BGP 需要通告的路由数目极大,由于TCP 提供了可靠的传送机制,同时TCP 使用滑动窗口机制,使得BGP 可以不断地发送分组,而无需像OSPF 或EIGRP 那样停止发送并等待确认。
发送BGP 消息的路由器称为BGP 发言者(BGP Speaker),它接收或产生新的路由信息,并发布(Advertise)给其它BGP 发言者。
当BGP发言者收到来自其它自治系统的新路由时,如果该路由比当前已知路由更优、或者当前还没有该路由,它就把这条路由发布给自治系统内所有其它BGP 发言者。
相互交换消息的BGP 发言者之间互称对等体(Peer),若干相关的对等体可以构成对等体组(Peer group)。
BGP 在路由器上以下列两种方式运行:IBGP(Internal BGP):当BGP 运行于同一自治系统内部时,被称为IBGP;EBGP(External BGP):当BGP 运行于不同自治系统之间时,称为EBGP。
4.2 BGP 的消息类型4.2.1 消息头格式BGP有5 种消息类型:Open、Update、Notification、Keepalive和Route-refresh。
这些消息有相同的报文头,其格式如图所示。
BGP 消息的报文头格式主要字段的解释如下:Marker:16 字节,用于BGP 验证的计算,不使用验证时所有比特均为“1”。
Length:2 字节,BGP 消息总长度(包括报文头在内),以字节为单位。
Type:1 字节,BGP 消息的类型。
其取值从1 到5,分别表示Open、Update、Notification、Keepalive 和Route-refresh 消息。
其中,前四种消息是在RFC1771 中定义,而Type 为5 的消息则是在RFC 2918 中定义的。
4.2.2 Open消息Open消息是TCP连接建立后发送的第一个消息,用于建立BGP对等体之间的连接关系。
两个邻居都要发送一个Open 消息,每个邻居都用该消息来标示自己,并规定自己的BGP 运行参数。
BGP Open 消息包含的内容包括:1)BGP version它明确了发起者正在运行的BGP 版本号(2,3,4),可以通过neighbor version 修改,缺省版本号为4。
如果版本号不相同,路由器将自动降低版本号重发Open 消息,直到版本一致。
2)AS number发起会话路由器的AS 号,用于确认EBGP 或者IBGP 会话。
3)Hold time路由器必须收到一个keepalive 或者更新消息之前允许经过的最大秒数。
Holdtime 必须是0(在这种情况下,必须是没有发送Keepalive)或者至少3s。
Cisco 默认的holdtime 为180s,如果两个邻居间holdtime 不一致,选较短的那个做为两者可接受的时间。
4)BGP router-ID选取方式和OSPF 相同,使用数值最大的loopback 口地址,没有loopback 则使用物理接口上数值最大的地址。
5)Optional parameters用于一些可选功能的支持,例如鉴别,多协议支持及路由刷新等。
4.2.3 Update消息Update消息用于在对等体之间交换路由信息。
它既可以发布可达路由信息,也可以撤销不可达路由信息,其消息格式如图所示。
BGP Update 消息格式一条Update 报文可以通告一类具有相同路径属性的可达路由,这些路由放在NLRI(Network Layer Reachable Information,网络层可达信息)字段中,Path Attributes字段携带了这些路由的属性,BGP 根据这些属性进行路由的选择;同时Update 报文还可以携带多条不可达路由,被撤销的路由放在Withdrawn Routes 字段中。
BGP Update 消息包含的内容包括:1)Network Layer Reachability Information (NLRI)用来公布IP 地址前缀和前缀长度的字节组,例如<19,198.24.160.0>2)Path Attributes该属性为BGP 提供了选择最短路径,检查到路由环路以及决定路由策略的信息3)Withdrawn Routes用来描述已经变成不可达并正从业务中撤销的目的地址字节组(长度和前缀)注:虽然NLRI 字段可以包含多个前缀,但每一个更新消息只描述一条BGP 路由(因为路径属性只描述一条路径,但该路径可能会到达多个目的地)4.2.4 Notification消息当BGP检测到错误状态时,就向对等体发出Notification消息,之后BGP连接会立即中断。
其消息格式如图所示。
BGP Notification 消息格式主要字段的解释如下:Error Code:差错码,指定错误类型。
Error Subcode:差错子码,错误类型的详细信息。
Data:用于辅助发现错误的原因,它的内容依赖于具体的差错码和差错子码,记录的是出错部分的数据,长度不固定。
4.2.5 Keepalive消息BGP 会周期性地向对等体发出Keepalive 消息,用来保持连接的有效性。
其消息格式中只包含报文头,没有附加其他任何字段。
如果路由器接受了他在邻居的Open 消息中的参数,它就会发送一个应答的Keepalive 消息。
默认情况Keepalive 间隔60s,或者是达成一致的保持时间的1/3。
4.2.6 Route-refresh消息这是一个可选的消息,Route-refresh消息用来要求对等体重新发送指定地址族的路由信息。
其消息格式如图所示。
BGP Route-refresh 消息格式主要的字段解释如下:AFI:Address Family Identifier,地址族标识。
Res.:保留,必须置0。
SAFI:Subsequent Address Family Identifier,子地址族标识。
4.3 BGP邻居协商在BGP说话者可以交换网络层可达性信息(正被通告的网络)前,一个BGP会话必须被建立。
下图表明了在连接完全建立起前B G P邻居协商的过程。
4.4 BGP协议的状态机1) Idle(空闲):初始地,BGP处于Idle状态直到一个操作方引发了一个启动(Start)事件,启动事件通常是由建立或重启BGP会话引起的。
2) Connect(连接):在这个状态下,BGP正等待着传输协议连接的完成。
如果传输协议连接成功了,一open报文被发送给对等的路由器,BGP状态变成了开放发送(opensent)状态。
若连接失败,本地系统变为激活状态,继续监视连接。
3) Active State(行动):在这个状态下,BGP试图通过启动一传输协议连接来获得一个对等体。
若连接成功,一个Open报文被发送给对等路由器。
若连接重试计时器超时,BGP状态变为连接(Connect)状态,并继续监视可能会由远程BGP对等体启动的连接。
4) Open Sent State (开送状态):本状态中,BGP正等待着来自它的对等体的OPEN报文。
当一个OPEN报文被接收后,检查所有域的正确性。
如果检测到错误,本地系统发送出一个NOTIFICATION报文并变回到空闲状态(Idle)。
如果无错, BGP开始向它的对等体发送KeepAlive报文。
5) Open Confirm(开确认):本状态下,BGP 等候KeepAlive 或Notification报文。
若本地系统接收到KeepAlive报文,系统状态变为已建立( establisted )状态。
如果保持计时器(Holol timer)在KeepAlive报文到达前超时,本地系统发送出一Notification报文,状态变回到Idle。
6)Establisted(已建立):这是邻居协商的最后阶段。
在establisted 状态下,BGP对等体可以交换Update , Notification 以及KeepAlive报文。
4.5 BGP 的路由属性4.5.1 路由属性的分类BGP 路由属性是UPDATE报文的路由属性(Path Attributes):此可变长字段包含了与网络层可达性信息字段中前缀相关联的BGP属性的列表,它对特定的路由进行了进一步的描述,路径属性给出了正被通告的前缀的信息,如优先级或者前缀源等,使得BGP 能够对路由进行过滤和选择。
BGP 路由属性都可以分为以下四类:公认必须遵循(Well-known mandatory):所有BGP 路由器都必须能够识别这种属性,且必须存在于Update 消息中。
如果缺少这种属性,路由信息就会出错。
公认可选(Well-known discretionary):所有BGP 路由器都可以识别,但不要求必须存在于Update 消息中,可以根据具体情况来选择。
可选过渡(Optional transitive):在AS 之间具有可传递性的属性。
BGP 路由器可以不支持此属性,但它仍然会接收带有此属性的路由,并通告给其他对等体。
可选非过渡(Optional non-trasitive):如果BGP 路由器不支持此属性,该属性被忽略,且不会通告给其他对等体。