声明: 这篇文章是对网上的这几篇博客的摘录,仅供我自己以后看的时候方便,且不需要再看太多的内容,

如果大家对BGP不是很了解,建议看原博客或者直接看RFC

    BGP只支持基于目的地址的路由,即路由时,我们并不需要知道这个Packet从哪里来,只需要知道它的目的地在哪,

我们便可做出路由决策。因此,一些新型网络体系,即不基于目的地址路由的网络是不支持BGP协议的。

Terminology:

  • BGP Speaker:

    是指配置了BGP协议的路由器,一个AS中可以只有一个BGP Speaker,也可以有多个。
  • BGP Identifier:

    一个4字节的无符号整数,也就是BGP Speaker的IP地址。
  • EBGP,IBGP:

    分别指External BGP和Internal BGP,与本身AS之外的BGP Speaker通信的BGP称为EBGP,IBGP同理。
  • External Peer, Internal Peer:

    其中Peer指的是与一个BGP Speaker通信的对等体,即另一个BGP Speaker,External和Internal也是相当于AS

    而言的。
  • RIB:

    Routing Information Base,路由信息库。
  • Adj-RIB-In:

    本地BGP Speaker收到的RIB信息,表示还未经处理的路由信息。
  • Adj-RIB-Out:

    本地BGP Speaker即将要发出去的RIB信息,表示经过选择要告知邻居的路由信息。
  • Loc-RIB:

    从Adj-RIB-In中选出来供本地路由使用的路由信息。
  • Feasible Route, Unfeasible Route:

    Adj-RIB-In中可用的和不可用的路由。

RIB:

    Adj-RIBs-IN, Loc-RIB, Adj-RIBs-Out三者的关系。

    Adj-RIBs-In包含了被告知的,未经处理的路由信息。经过本地路由策略之后,从这部分路由信息中挑选一部分可用

的作为Loc-RIB。

    虽然在我们看来这三者有较大的区别,需要分别维护。但是在有些BGP实现里只保留一份内存,通过指针来相互区分。

BGP的四种消息:

    正如上文所述,被本地BGP Speaker发出去的路由信息我们称之为Adj-RIB-Out。当BGP连接建立,对端收到初始路由

信息并根据本地策略建立Loc-RIB。BGP不要求某个BGP Speaker定时的公布自己的路由表信息(不像RIP),但是当

本地路由表发生改变时,需要把更新情况告知它的对等体(即其他的BGP Speaker),而这种类型的消息我们定义为

UPDATE消息。


    因为BGP不要求定时地公布路由信息,所以需要额外的方式来确保通信双方依然保持连接,这也是KEEPALIVE消息的

来由。另外当错误发生时,如数据包格式错误,超时等情况发生时,也需要NOTIFICATION消息来传递错误类型。

    因此BGP只有四种消息类型:建立连接的OPEN, 更新连接的UPDATE, 保持连接的KEEPALIVE, 错误信息的

NOTIFICATION.

    BGP限制最大报文长度为4096(包括报文头)

    OPEN消息最小长度为10字节,加上BGP协议头19字节,因此OPEN消息最短为29字节.

    一个KEEPALIVE就等于一个BGP协议头,即19字节.

    下面单独对UPDATE消息进行详细的介绍:

UPDATE消息格式:

    UPDATE消息用来沟通BGP Speaker之间路由变化,它可以告知哪些路由被撤销,或者告知可用路由(那些拥有统一路

径参数的可用路由).

    The UPDATE message always includes the fixed-size BGP header, and also includes the other fields, as shown

below(note, some of the shown fields may not be present in every UPDATE message):

+---------------------------------------------------+
| Withdrawn Routes Length (2 octets) |
+---------------------------------------------------+
| Withdrawn Routes (variable) |
+---------------------------------------------------+
| Total Path Attribute Length (2 octets) |
+---------------------------------------------------+
| Path Attributes (variable) |
+---------------------------------------------------+
| Network Layer Reachability Information (variable) |
+---------------------------------------------------+

    UPDATE消息中各字段含义如下:

  • Withdrawn Routes Length:

    2个字节,撤销路由的长度(以字节为单位), 如果为0,则表示下一个Withdrawn Routes字段为空.下同.
  • Withdrawn Routes:

    可变长度,以形如二元组的形式储存,标识应该撤销的路由.
  • Total Path Attribute Length:

    2个字节,标识Path Attributes长度.
  • Path Attributes:

    可变长度,以形如三元组的形式存储.
  • Network Layer Reachability Information:

    可变长度,且由UPDATE message length - 23 - Total Path Attribute Length - Withdrawn Routes Length

    决定(其中23由19字节的BGP协议头,4字节的Total Path Attribute Length和Withdrawn Routes Length).此

    字段包含了一系列二元组以表示网络可达信息(即路由终点)。

    Reachability information is encoded as one or more 2-tuples of the form <length, prefix>, whose fields are described below:

+---------------------+
| Length (1 octet) |
+---------------------+
| Prefix (variable) |
+---------------------+

The use and the meaning of these fields are as follows:

a) Length:

The Length field indicates the length in bits of the IP address prefix. A length of zero indicates a

prefix that matches all IP addresses (with prefix, itself, of zero octets).

b) Prefix:

The Prefix field contains an IP address prefix, followed by enough trailing bits(the minimum number

of trailing bits needed)to make the end of the field fall on an octet boundary. Note that the

value of the trailing bits is irrelevant.

    而Prefix则表示IP前缀,但是值得注意的是,它必须要在末尾补全0,以满足字节边界。讲个小例子: 比如Length是13,

Prefix至少有13位比特,且满足字节边界,则Prefix应该有16比特,即2字节。下一个二元组则从第三字节开始.以此类推

    对于NLRI有一点说明,因为他们都是以二元组储存了一系列IP前缀,他们表示的是路由的终点。比如说

Withdrawn Route中有个1.1.0.0/13则表示撤销到1.1.0.0/13的路由。以此类推。


    路由信息只存在于UDPATE消息中。何谓路由,即给定某个地址和到这个地址的路径信息的键值对。在BGP的

UPDATE消息中,目的地址被保存在NLRI域中,如果多条路由拥有相同的路径参数,那么只需在同一个UDPATE

的NLRI域中包含多个目的地址前缀,即可完成多条路由的传输


    路由更新分为三种:撤销,修改以及添加(增,删,改)。

    其中添加比较简单,直接添加并告知BGP Speaker对等体即可。修改只需要撤销老路由,添加新路由即可。因此撤销

路由有三种原因:

1.在UDAPTE消息中的WITHDRAWN ROUTES域不为空,则域内的路由需要撤销。

2.拥有相同的目的地址的路由到达,即修改路由时。

3.BGP Speaker连接关闭,则两者之间的所有路由均需要撤销(因为很可能那个路由器坏了,自然无法完成路由功能)。

UPDATE消息中的Path Attributes:

    在BGP UPDATE中,拥有同样的Path Attribute的路由才允许被包含在同一个UPDATE包中。Path Attributes是一个可

变字段,由Total Path Attribute Length指定长度,以三元组形式储存。

    Each path attribute is a triple <attribute type, attribute length, attribute value> of variable length.

  • Attribute Type is a two-octet field that consists of the Attribute Flags octet, followed by the Attribute

    Type Code octet.
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Attr. Flags |Attr. Type Code|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  • Attribute Flags

    Attribute Flag的各个比特位说明如下:

    #Bit 0 :

    0表示well-known,1表示optional;标识了此路径属性是否可选(optional意味着允许BGP不用理解该属性).

    #Bit 1 :

    0表示non-transitive,1表示transitive;标识了此路径属性是否可传递(non-transitive意味着BGP Speaker

    不一定会把该属性传递其他对等体).

    #Bit 2 :

    0表示complete,1表示partial;标识了此路径属性是否只是局部的.

    #Bit 3 :

    0表示Attribute Length占了1字节,1表示占了2个字节;标识了路径属性长度是否可扩展(即占用几个字节).

    #Bit 4-7 :

    未使用
  • Attribute Code

    Attribute Code对应各个Path Attribute,下面罗列对应关系,之后再对每个属性做解释:
    Code 1 : ORIGIN
Code 2 : AS_PATH
Code 3 : NEXT_HOP
Code 4 : MULTI_EXIT_DISC
Code 5 : LOCAL_PREF
Code 6 : ATOMATIC_AGGREGATE
Code 7 : AGGREGATOR
\# **ORIGIN**<br>
ORIGIN参数说明该路由是怎么产生的,有三种原因,按优先级排列分别为IGP,EGP,<br>
IMCOMPLETE。其中最后一种表示来源不明。此参数是由产生该路由的BGP Speaker指定,属于<br>
well-known mandatory,即要求必须被支持且不可或缺。<br>
ORIGIN is a well-know mandatory attribute. **The ORIGIN attribute is generated by the<br>
speaker that originates the associated routing infromatiion. _Its value SHOULD NOT be<br>
changed by any other speaker._**<br>
\# **AS_PATH**<br>
AS_PATH标识了从本地到目的路由所经过的AS,由一系列AS Segments(包括Set,Sequence两种)<br>
组成,属于well-known mandatory。AS_PATH修改分为两种情况:<br>
1.由BGP Speaker自己产生的路由:<br>
若准备向Internal Peer发,即往同一个AS内的BGP Speaker发布,显然此AS_PATH为空.<br>
若准备向External Peer发,则把本身的AS Number包装成AS_SEQUENCE放在AS_PATH第一个<br>
Segment.<br>
2.BGP Speaker收到UPDATE,并转发到其他的BGP Speaker:<br>
若准备向Internal Peer发,显然不需要修改AS_PATH.<br>
**若准备向External Peer发,且AS_PATH里的AS已经以AS_SEQUENCE形式储存,则把本身<br>

的AS放在该AS_SEQUENCE的第一个;若之前以AS_SET储存,则把本身的ASNumber包装成

AS_SEQUENCE,置于AS_PATH最前面**.

有些时候需要在AS_PATH添加不止一个AS Number,这需要在本地进行配置.<br>
\# **NEXT_HOP**<br>
这应该很熟悉的参数吧,属于well-known mandatory即**到某个目的地的下一跳地址,但是和一般的<br>
不一样,这里的NEXT_HOP不一定是邻居路由器的IP地址,即可能不是直接相连的**.<br>
NEXT_HOP的修改分为两种:<br>
1.由BGP Speaker自己产生的路由,并发向自己的邻居:<br>
则把NEXT_HOP改成自己的IP地址(即和对端对应的那个IP地址)。<br>
2.BGP Speaker收到并转发向其他BGP Speaker:<br>
若准备发向Internal Peer,不改变该NEXT_HOP;<br>
若准备发向External Peer则改成自己和对端对应的IP地址.<br> \#**MULTI_EXIT_DISC**<br>
当某个AS和外部某个AS有多条路由时,MULTI_EXIT_DISC用来区分每条路由,以让本地选择哪条<br>
路由为最优。属于optional non-transitive, 即BGP Speaker可以支持也可以不支持该属性,而且不必<br>
向邻居转发该属性。<br>
\#**LOCAL_PREF**<br>
和MULTI_EXIT_DISC类似,不过是用来区分AS内部的路由的.<br>
\#**ATOMIC_AGGREGATE**<br>
当BGP Speaker对路由进行一定的聚合之后,向邻居公布自己的路由时需要加上该属性。<br>
\#**AGGREGATOR**<br>
BGP Speaker在做路由聚合时,需要加上自己的信息,如AS Number和自己的IP地址。<br>

####References:

    [BGP(一) 协议简介](http://www.it165.net/network/html/201303/1010.html)

    [BGP(二) BGP的行为](http://www.it165.net/network/html/201303/1012.html)

    [BGP(三) BGP的消息格式](http://www.it165.net/network/html/201303/1013.html)

    [BGP(四) BGP的路径属性](http://www.it165.net/network/html/201303/1015.html)

05-12 14:32