zoukankan      html  css  js  c++  java
  • BGP报文头基本格式(RFC4271)

    BGP报文头基本格式(RFC4271)

    报文格式

    BGP报文由BGP报文头和具体报文内容两部分组成。(RFC4271)

    BGP的运行是通过消息驱动的,共有5种消息类型,这些消息有相同的报文头。这些消息通过TCP协议进行传播(端口号是179)。消息最长为4096字节,最短为19字节(只包含报文头)。

    BGP报文头包括三的部分,总长19字节。各个部分的格式和功能如下:(RFC4271)

    图1 BGP报文头格式

    • Marker占16字节,用于检查BGP对等体的同步信息是否完整,以及用于BGP验证的计算。不使用验证时所有比特均为1(十六进制则全“FF”)。
    • Length占2个字节(无符号位),BGP消息总长度(包括报文头在内),以字节为单位。长度范围是19~4096。
    • Type占1个字节(无符号位),BGP消息的类型。Type有5个可选值,表示BGP报文头后面所接的5类报文(其中,前四种消息是在RFC4271中定义的,而Type5的消息则是在RFC2918中定义的):

    TYPE

    报文类型

    1

    OPEN

    2

    UPDATE

    3

    NOTIFICATION

    4

    KEEPALIVE

    5

    REFRESH(RFC2918)

    BGP OPEN报文格式

    报文格式

    如果BGP报文头中的TYPE为1,则该报文为OPEN报文。报文头后面所接的报文内容如下,OPEN报文用于建立BGP连接:

    图1 OPEN报文格式

    字段

    长度

    含义

    Version

    1个字节(无符号位)

    表示协议的版本号,现在BGP的版本号为4。

    My Autonomous System

    2个字节(无符号位)

    发送者自己的AS域号

    Hold Time

    2个字节(无符号位)

    发送者自己设定的hold time值(单位:秒),用于协商BGP对等体间保持建立连接关系,发送KEEPALIVE或UPDATE等报文的时间间隔。BGP的状态机必须在收到对等体的OPEN报文后,对发出的OPEN报文和收到的OPEN报文两者的hold time时间作比较,选择较小的时间作为协商结果。Hold Time的值可为零(不发KEEPALIVE报文)或大于等于3,我们系统的默认为180。

    BGP Identifier

    4个字节(无符号位)

    发送者的router id。

    Opt Parm Len

    1个字节(无符号位)

    表示Optional Parameters(可选参数)的长度。如果此值为0,表示没有可选参数。

    Optional Parameters

     

    此值为BGP可选参数列表,每一个可选参数是一个TLV格式的单元(RFC3392)。

    0                   1

    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5

    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-...

    |  Parm. Type   | Parm. Length  |  Parameter Value (variable)

    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-...

    • Parm. Type占1个字节(无符号位),为可选参数类型。我们现在的实现中,只在type值为2时有意义,表示携带的参数为协商能力。
    • Parm. Length占1个字节(无符号位),为Parameter Value的长度。
    • Parameter. Value根据Parm.Type的不同值填写不同的参数内容,在Parm.Type为2表示协商能力时,Parameter.Value是表示所支持的各种协商能力的列表,列表中的每一个单元是如下的一个TLV三元组:
    • +------------------------------+
    • | Capability Code (1 octet)    |
    • +------------------------------+
    • | Capability Length (1 octet)  |
    • +------------------------------+
    • | Capability Value (variable)  |
    • +------------------------------+
    • Capability Code:所支持的能力编号,占1个字节。Code为1时,表示支持的地址族能力;Code为2时,表示支持REFRESH能力。
    • Capability Length:表示Capability Value的长度,占1个字节。
    • Capability Value:根据Code值的不同其内容与长度也不同。

    Capability Code为1:

    Capability Value值是一个TLV三元组,共占4个字节:

    0       7      15      23      31

    +-------+-------+-------+-------+

    |      AFI      | Res.  | SAFI  |

    +-------+-------+-------+-------+

    AFI地址族标识(Address Family Identifier),占2个字节,能力所支持地址族标识信息,用以和SAFI一同确定网络层协议和IP地址间的关系,编码方式与多协议扩展中的规定相同。其值按照RFC1700中ADDRESS FAMILY NUMBERS的定义;

    Res保留位,占1个字节,发送者应将其设置为零,在接受的时候忽略;

    SAFI子地址族标识(Address Family Identifier),占1个字节,能力所支持的子地址族标识信息,用以和AFI一同确定网络层协议和IP地址间的关系,编码方式与多协议扩展中的规定相同。其值按照RFC1700中ADDRESS FAMILY NUMBERS的定义。

    Capability Code为2(RFC2918)

    表示支持路由刷新能力,即Route Refresh Capability。此能力的code为2,length为零,无value部分。

    需要说明的是,只有在能力协商中使能了支持Route Refresh Capability,路由器才能处理REFRESH报文。我们的实现是默认情况下,支持IPv4单播能力与路由刷新能力,其他能力需要另外设定。

    表1 AFI及SAFI编码说明

    AFI编码

    AFI说明

    SAFI编码

    SAFI说明

    说明

    1

    IPv4地址族

    1

    单播

    IPv4单播

    2

    组播

    IPv4组播

    128

    VPN

    IPv4的L3VPN

    2

    IPv6地址族

    1

    单播

    IPv6单播

    2

    组播

    IPv6组播

    128

    VPN

    IPv6的L3VPN

    196

    二层

    128

    VPN

    L2VPN的Kompella方式

               

    BGP UPDATE报文格式

    如果BGP报文头中的TYPE为2,则该报文为UPDATE报文。报文头后面所接的报文内容如下(RFC 4271),UPDATE报文用于通告路由。

    报文格式

    图1 UPDATE报文格式

    字段

    长度

    含义

    Withdrawn Routes Length

    2个字节(无符号位)

    标明Withdrawn Routes部分的长度。其值为零时,表示没有撤销的路由。

    Withdrawn Routes

    变长

    包含要撤销的路由列表,列表中的每个单元包含1字节的Length域和可变长度的Prefix域。

    • Length待撤销路由的掩码。其值为零时,表示匹配所有的路由。
    • Prefix传送的IP地址前缀必须用整字节表示。例如:假定待撤销的路由为200.200.200.200,其编码用16进制表示可如下:

    Mask掩码(十进制) Length Prefix

    32 20 C8 C8 C8 C8

    25 19 C8 C8 C8 80

    20 14 C8 C8 C0

    15 0F C8 C8

    Total Path Attribute Length

    2个字节(无符号位)

    标明Path Attributes部分和Network Layer Reachability Information两部分的长度。其值为零时,表示没有路由及其路由属性要通告。

    Path Attributes

    变长

    包含要更新的路由属性列表,按其类型号从小到大的顺序排序,填写更新的路由的所有属性。每一个属性单元包括属性类型,属性长度,属性值三部分。其编码采用TLV格式。如下所示。

    图2 BGP路径属性TLV格式

    其中,Attr.TYPE占2个字节(无符号位),包括1字节的Flags(无符号位)和1字节的Type Code(无符号位)。

    图3 TLV结构-Type

    Attr.Flags占1个字节(8个bit),表示属性的标记,其每个bit位的意义如下显示:

    O: Optional bit, 属性的可选性。决定属性是否为必携带属性。带可选属性(optional)设为1,公认属性(well-known)设为零。

    T: Transitive bit 属性的可传递性。对于可选属性,是可传递的设为1,非可传递的设为0。对于公认属性必须设为1。

    P: Partial bit 属性的局部性。对于可传递的可选属性是局部的设为1,是完全的设为零。对于非可传递的的可选属性和公认属性,必须设为零。

    E: Extended Length bit 决定该属性的长度的字段(即Attr. Length)是否需要扩展。不需要扩展则设为零,Attr. Length占1个字节;需要扩展则设为1,Attr. Length占2个字节。

    U: Unused bits 低4位没有使用,发送时必须全部设为零,并且在接收时被忽略。

    Attr.Type Code占1个字节(无符号位),表示属性的类型号。设置如下表2。

    Attr.Value根据不同属性的类型填写不同内容。

    Network Layer Reachability Information(NLRI)

    变长

    包含要更新的地址前缀列表,每一个地址前缀单元由一个LV二元组(prefix length, the prefix of the reachable route)组成,其编码填写方法与Withdrawn Routes的填写方法相同。

    表1 路由属性的类型号列表

    属性类型

    属性值

    1:Origin

    IGP

    EGP

    Incomplete

    2:As_Path

    AS_SET

    AS_SEQUENCE

    AS_CONFED_SET

    AS_CONFED_SEQUENCE

    3:Next_Hop

    下一跳的IP地址

    4:Multi_Exit_Disc

    MED用于判断流量进入AS时的最佳路由

    5:Local_Pref

    Local_Pref用于判断流量离开AS时的最佳路由

    6:Atomic_Aggregate

    BGP Speaker选择聚合后的路由,而非具体的路由

    7:Aggregator

    发起聚合的路由器ID和AS号

    8:Community

    团体属性

    9:Originator_ID

    反射路由发起者的Router ID

    10:Cluster_List

    反射路由经过的反射器列表

    14:MP_REACH_NLRI

    多协议可达NLRI

    15:MP_UNREACH_NLRI

    多协议不可达NLRI

    16:Extended Communtities

    扩展团体属性

    BGP的NOTIFICATION报文格式

    如果BGP报文头中的TYPE为3,则该报文为NOTIFICATION报文。报文头后面所接的报文内容如下(RFC 4271),NOTIFICATION报文用于处理BGP进程中的各种错误。

    图1 NOTIFICATION报文格式

    各字段解释如下:

    • Error code占1个字节(无符号位),定义错误的类型,非特定的错误类型用零表示。
    • Error subcode占1个字节(无符号位),指定错误细节编号,非特定的错误细节编号用零表示。
    • Data指定错误数据内容。

    错误码

    错误子码

    1:消息头错误

    1:连接未同步

    2:错误的消息长度

    3:错误的消息类型

    2:Open消息错误

    1:不支持的版本号

    2:错误的对等AS

    3:错误的BGP标识符

    4:不支持的可选参数

    5:认证失败

    6:不可接受的保持时间

    7:不支持的能力

    3:Update消息错误

    1:畸形属性列表

    2:不可识别的公认属性

    3:缺少公认属性

    4:属性标志错误

    5:属性长度错误

    6:无效Origin属性

    7:AS路由环路

    8:无效Next_Hop属性

    9:可选属性错误

    10:无效网络字段

    11:畸形AS_Path

    4:Hold Timer溢出

    0:没有特别的错误子码定义。

    5:有限状态机错误

    0:没有特别的错误子码定义。

    6:终止

    1:前缀超过最大值。

    2:管理关闭

    3:删除邻居

    4:管理重置

    5:连接失败

    6:其他配置改变

    7:连接冲突

    8:资源短缺

    9:BFD断开连接

    Error Code

    Error Subcode

    1: Message header error

    1: connection not synchronized

    2: error message length

    3: error message type

    2: Open message error

    1: unsupported version number

    2: error peer AS

    3: error BGP identifier

    4: unsupported optional parameter

    5: authentication failed

    6: unacceptable Holdtime

    7: unsupported capability

    3: Update message error

    1: malformed attribute list

    2: unrecognized well-known attribute

    3: well-known attribute is missing

    4: attribute flags error

    5: attribute length error

    6: invalid origin attribute

    7: AS routing loop

    8: invalid Next-Hop attribute

    9: error optional attribute

    10: invalid network field

    11: abnormal AS-Path

    4: Hold timer expired

    0: no special definition of the error subcode

    5: Finite state machine error

    0: no special definition of the error subcode

    6: Cease

    1: maximum number of prefixes reached

    2: administrative shutdown

    3: peer de-configured

    4: administrative reset

    5: connection rejected

    6: other configuration change

    7: connection collision resolution

    8: out of resources

    9: BFD session Down

    BGP KEEPALIVE报文格式

    报文格式

    如果BGP报文头中的TYPE为4,则该报文为KEEPALIVE报文。KEEPALIVE报文用于保持BGP连接。

    KEEPALIVE报文只有BGP报文头,没有具体内容,故其报文长度应固定为19个字节。

     

    BGP的REFRESH报文格式

    如果BGP报文头中的TYPE为5,则该报文为REFRESH报文。报文头后面所接的报文内容如下(RFC 2918),REFRESH报文用于动态的请求BGP路由发布者重新发布UPDATE报文,进行路由更新。

    报文格式

    图1 REFRESH报文格式

    Field字段

    Length长度

    Description描述

    AFI

    2字节(无符号位)

    表示地址族id,与UPDATE报文中的定义相同。

    Res.

    1字节(无符号位)

    所有为应全为零,在接收报文时,此位被忽略。

    SAFI

    1字节(无符号位)

    与UPDATE报文中的定义相同。

     
     
     
    来自: https://www.cnblogs.com/guang-li/p/12129440.html
  • 相关阅读:
    Django中前端界面实现级联查询
    二叉树遍历规则
    计算机组成原理面试总结
    用python介绍4种常用的单链表翻转的方法
    跨域资源共享(CORS)
    python中单例模式的四种实现方式
    算法和数据结构
    手写配置文件实现两套配置文件的切换
    CentOS 7 安装教程
    配置管理系统
  • 原文地址:https://www.cnblogs.com/zy09/p/15624922.html
Copyright © 2011-2022 走看看