BGP报文
BGP Packet 存在5种类型的报文,不同类型的报文拥有相同的头部(header)
报文名称 | 作用 | 出现时刻 |
---|
Open(建立) | 用于协商参数(BGP版本、AS号)+建立邻居 | BGP TCP建立成功之后的第一个消息 | Update(更新) | 更新报文交换路由信息,发送+撤销 | BGP对等体关系建立之后有路由需要发送或路由变化时 | Notification(通知) | 差错报文,用于中断BGP连接 | 当BGP在运行中发现错误时 | Keepalive(保持活跃) | 确定邻居关系+维持邻居(刷新TCP连接,不让TCP连接断开) | 1、BGP路由器收到对端发送的Keepalive报文 | 2、对等体状态置为已建立,同时后续定期发送保持连接 | | | router-refresh(路由刷新) | 用于在改变路由策略后请求对等体重新发送路由信息 | | 前提是bgp路由器支持要支持路由刷新功能 | 当路由策略发生变化时 | |
BGP报文具体应用
- BGP使用TCP建立连接,本地监听端口为179。和TCP连接建立相同,BGP连接的建立也要经过一系列的对话和握手。TCP通过握手协商通告其端口等参数,BGP的握手协商的参数有:BGP版本、BGP连接保持时间、本地的路由器标识(Router ID)、授权信息等。这些信息都在Open消息中携带。
- BGP连接建立后,如果有路由需要发送,则发送Update消息通告对端。Update消息发布路由时,还要携带此路由的路由属性,用以帮助对端BGP协议选择最优路由。在本地BGP路由变化时,要通过Update消息来通告BGP对等体。
- 经过一段时间的路由信息交换后,本地BGP和对端BGP都无新路由通告,趋于稳定状态。此时要定时发送Keepalive消息以保持BGP连接的有效性。对于本地BGP,如果在保持时间内,未收到任何对端发来的BGP消息,就认为此BGP连接已经中断,将断开此BGP连接,并删除所有从该对等体学来的BGP路由。
- 当本地BGP在运行中发现错误时(如对端BGP版本本地不支持、本地BGP收到了结构非法的Update消息等),要发送Notification消息通告BGP对等体。本地BGP退出BGP连接时,也需发送Notification报文。
BGP报文头部
Marker(标记):16Byte,该标记字段用于检测BGP对等体之间的同步丢失情况,并且在支持验证功能的情况下进行消息验证。如果消息类型为Open或Open消息中未包含验证消息,标志字段将被设置为全1,否则,标志字段值通过某些计算得到(作为验证进程的一部分) Length(长度):2Byte无符号整数,指定了消息的全长,包括头部,BGP报文总长度在19~4096Byte之间。整个BGP报文的长度,Header+Message+Data。 Type(类型):1Byte,标识BGP的报文类型,有以下几种消息类型。
1-Open;2-Update;3-Notification;4-Keeplive;5-Route-refresh
OPEN Message
Open消息:是TCP连接建立后发送的第一个消息,用于建立BGP对等体之间的连接关系。对等体在接收到Open消息并协商成功后,将发送Keepalive消息确认并保持连接的有效性。确认后,对等体间可以进行Update、Notification、Keepalive和Route-refresh消息的交换。 Version(版本):1Byte,标识BGP的对等体在使用的版本,缺省版本都为BGP-4,如果邻居运行的是较早的版本,那么它将会拒绝Version4的消息,于是路由器的版本将改为Version3并且再发送一个Open消息,直到两边的邻居协商一致。 My Autonomous System(本地自治系统):2Byte,BGP路由器的AS号,它用来决定该BGP会话是EBGP还是IBGP,范围从165535(目前也有4Byte的AS号,范围从14294967295)。 Hold Time(保持时间):2Byte,对等体之间相互协商的最大保持时间,一般为Keepalive时间的3倍,缺省情况下保持时间为180s。保持时间是一个计数器,从0一直增加到该值,等待接收Keeplive(每隔60s发送一次)或者Update报文,收到后将保持时间清零,如果保持时间内没有收到则认为邻居失效。如果BGP对等体之间协商的保持时间不一致,将会采取较短的时间作为保持时间。最小可以为0,这种情况下BGP连接被认为永远是UP,对等体之间不会发送Keeplive报文来检测邻居是否失效。 BGP Identifier(BGP标识):4Byte,BGP路由器的Router ID,以IP地址的形式表示,用来识别BGP路由器。在VRP5.30系统中,如果没有通过命令router id进行配置,则按照如下规则进行选择:优选Loopback接口地址中最大的地址作为Router ID,如果没有Loopback接口配置了IP地址,则从配置了IP地址的物理接口中选择一个最大的IP地址作为Router ID。 Opt Parm Len(Optional Parameters Length):1Byte,可选参数的长度。如果为0则表示该消息中没有可选参数 Optional Parameters:可变长的字段,用于BGP邻居会话协商过程中所使用的可选参数列表。每一个参数为一个(参数类型,参数长度,参数值)三元组,这个字段用于公布一些可选功能的支持,如多协议拓展功能,路由刷新能力,四字节AS号等功能。
UPDATE Message
Update消息被用作在BGP对等体之间传递路由信息。多条可达路由信息可以被通告到相应的对等体上,或者多条不可达路由信息被撤销。Update消息由以下五部分组成: Withdrawn Routes Length(撤销路由长度):(2字节无符号整数)不可达路由长度,表示Withdrawn Routes字段的数据长度。如果Withdrawn Routes Length字段数值为0,则表示Withdrawn Routes字段没有任何数据,在Update消息中不会被显示。 Withdrawn Routes(撤销路由):(可变长)撤销路由。该字段包括一系列的IP地址前缀信息,以<length,prefix>的格式来表示,比如<19,198.18.160.0>表示一个198.18.160.0 255.255.224.0的网络。 Path Attribute Length(路径属性长度):(2字节无符号整数)路由属性长度,表示Path Attribute字段的数据长度。如果Path Attribute数值为0,则表示Path Attribute字段没有任何数据,在Update消息中不会被显示 Path Attributes(路径属性):(可变长字段)路径属性。每个路径属性都是由可变长的三元组所组成:<attribute type属性类型,attribute length属性长度,attribute value属性值>,为BGP提供选择最短路径,检查路由环路以及决定路由策略的信息,属性类型是一个2Byte的长度,包括1Byte的属性标记,1Byte的属性类型代码字段。
NOTIFICATION Message
Notification报文主要在发生错误或对等体连接被关闭的情况下使用,该消息携带各种错误码(如定时器超时等),以及错误子码和错误信息。 Errorcode:错误子码。1Byte长度,提供了与错误种类有关的具体信息。 Data:依赖于不同的错误码和错误子码,用于标识错误原因。是一个可变长的字段,被Notification用作诊断错误的原因。注:Data字段的长度可以由以下公式来决定:消息长度=21+Data长度(Notification消息最小长度为21个字节,其中一家包括消息头。) ** 消息头错误子码: a连接非同步 b错误的消息长度 c错误的消息类型 ** Open消息错误子码: a不支持的版本号 b错误的对等体AS号 c错误的BGP ID d不支持的可选参数 eRFC1771里被定义为认证失败,RFC4271里则对此表示反对。 f不可接受的保持时间(Hold Time) ** Update消息错误子码: a畸形的属性列表 b无法识别的公认属性 c缺少的公认属性 d属性标志位错误 e属性长度错误 f无效的Origin属性 gRFC1771里被定义为AS路由环路,RFC4271里对此表示反对。 h无效的下一跳属性 i可选属性错误 j无效的网络字段 k畸形的AS_Path ** 保持时间超时:0 状态机错误:0 终止:0
KEEPALIVE Message
- Keepalive报文主要用于对等体路由器间的运行状态以及链路的可用性确认。
- Keepalive报文的组成只包括一个BGP数据报头。
- Keepalive消息在对等体之间的交换频率以保证对方保持定时器不超时为限
- 当一台路由器与其邻居建立BGP连接之后,将以Keepalive-Interval设定的时间间隔周期性地向对等体发送Keepalive报文,表明该连接是否还可保持。
- 缺省情况下,发送Keepalive的时间间隔为60秒,Hold Time是180秒。每次从邻居处接收到Keepalive报文将重置Hold Time定时器,在发送消息的时间间隔内,如果BGP发送过Update消息,就会抑制Keepalive消息的发送。如果Hold Time定时器超时,就认为对等体Down掉。
REFRESH Message
主要字段的解释如下: AFI(Address Family Identifier):地址族标识符(2字节)。比如IPv4,IPv6,VPNv4,VPNv6等。 Res(Reserved Field):保留区域(1字节),发送方应将其设置为0,接收方应当忽略该区域的信息。 SAFI(Subsequent Address Family Identifier):子地址族标识符(8字节)。比如,单播,组播。 在所有BGP路由器使能Route-refresh能力的情况下,如果BGP的入口路由策略发生了变化,本地BGP路由器会向对等体发布Route-refresh消息,收到此消息的对等体会将其路由信息重新发给本地BGP路由器。这样,可以在不中断BGP连接的情况下,对BGP路由表进行动态刷新,并应用新的路由策略。 使用refresh bgp peer_address import即可以触发该报文的发送,对等体收到该报文后,就会发送Update报文,发送完整路由消息。 如果使用命令refresh bgp peer_address export,则会在该路由器上直接发送Update完整路由信息,此时就不需要route refresh报文了。
|