BGP协议基本原理(转)

1. BGP协议特性

  • BGP是自治系统外部路由协议,用来在AS之间传递路由信息
  • 路径矢量路由协议,从设计上避免了环路的发生
      其路由信息中携带了所经过的全部AS路径列表。这样,接收该路由信息的BGP路由器可以明确的知道此路由信息是否源于自己的AS。如果是源于自己的AS,BGP就会丢弃此条路由,这样就根本的解决了AS之间产生环路的可能。
  • TCP承载,默认端口号是179
      天然的可靠传输机制,重传、排序等机制来保证BGP协议信息交换的可靠性。
  • 支持CIDR和路由聚合
      可以将一些连续的子网聚合成较大的子网(突破了自然分类的限制),从而可以在一定程度上控制路由表的快速增长,并降低了路由查找的复杂度。
  • 路由附带丰富的属性
  • 只发送增量路由更新
      在邻居关系建立后,BGP路由会将自己的全部路由信息通告给邻居,此后如果路由表发生了变化,则只将增量部分发送给邻居。这样可以大大减少BGP传播路由所占用的带宽,以利于在Internet上传播大量的路由信息,并降低路由器CPU与内存的消耗。
  • 路由过滤和路由策略
      与IGP不同的是,BGP最重要的特性是丰富的路由属性以及强大的路由过滤和路由策略。通过路由策略等方法,来更改路由属性,或者是根据路由更新信息中的属性来实现路由过滤和路由策略,从而使BGP的使用者可以非常灵活地对路由进行选路和控制。

2. BGP的基本术语

  • BGP发言者(BGP Speaker):发送BGP消息的路由器称为BGP发言者,它接收或者产生新的路由信息,并发布给其他BGP发言者。

  • Router ID(RID):Router ID是一个32位比特无符号的整数,用来在自治系统中唯一标识一台路由器。路由器如果运行BGP协议,则必须存在Router ID。Router ID可以是手工配置或这是路由协议自动选举。

  • BGP对等体/邻居(BGP Peer):相互交换消息的BGP发言者之间互称对等体(Peer)。

  • IBGP对等体/邻居(Internal BGP Peer):如果BGP对等体处于同一自治系统内,被称为IBGP对等体。

    • 处于同一个AS的BGP对等体为IBGP对等体(或者是IBGP邻居)
      IBGP对等体不一定是物理直连,但是一定要TCP可达。
    • 从IBGP对等体获得的路由不向它的IBGP对等体发布
      为了防止环路,BGP协议规定BGP发言者从IBGP获得的路由不向它的IBGP对等体发布。
    • 从IBGP对等体获得的路由是否发布给它的EBGP对等体与BGP是否同步相关。
      另外为了防止路由黑洞的产生,协议还规定BGP发言者从IBGP获得的路由是否发布给它的EBGP对等体与BGP是否同步相关。
  • EBGP对等体/邻居(External BGP Peer):BGP对等体处于不同自治系统时,被称为EBGP对等体。

    • 处于不同AS的BGP对等体为EBGP对等体,通常情况下EBGP对等体是物理上直连
    • BGP Speaker从EBGP对等体获得的路由会向它所有BGP对等体通告(包括EBGP和IBGP);同时为了防止环路,他不会将学习到的路由再向原发布者发布。
  • IBGP的全连接

    • BGP会话是基于TCP的点到点的单播链接
      TCP的可靠传输机制和滑动窗口机制可以确保承载与TCP之上的BGP可以可靠传递大量路由。但是TCP链接是点到点的单播方式来进行报文传输的,因此BGP链接只能是基于点到点的链接。同时BGP是一种距离矢量路由协议,为了防止产生路由环路,协议规定BGP发言者从IBGP对等体获得的路由不能向其他的IBGP对等体发布。这样,在运行了BGP协议的AS内,为了确保所有BGP路由器的路由信息向,则需要使所有的IBGP路由器保持全连接。
    • BGP发言者从IBGP对等体获得的路由不向其他的IBGP对等体发布

3. BGP消息及状态机

3.1. BGP消息种类

消息类型 消息作用的描述
Open 用于建立BGP对等体之间的链接关系
Keepalive 周期性的向BGP对等体发出KeepAlive消息,来保持链接的有效性
Update 携带的是路由更新(删减、增加)信息
Notification 当BGP检测到错误状态时,就向对等体发出Notification消息,之后BGP连接会立即被关闭
Route-refresh 要求对等体重新发送指定地址族的路由信息

BGP所有的消息格式都是“消息头+消息体”的形式,消息头的长度为19个字节。

  • Open消息:Open消息是TCP连接建立后发送的第一个消息,用于建立BGP对等体之间的链接关系并进行参数协商。内容包括使用的BGP版本号、自己所属的AS号、路由器ID、Hold Time值、认证信息等信息。
  • Keepalive消息:BGP会周期性的向对等体发出Keepalive消息,主要作用就是让BGP邻居知道自己的存在,保持邻居关系的稳定;另外一个作用就是对收到的Open消息的回应。消息格式中只包含消息头,没有附件任何字段。长度为19字节,消息只有标记、长度、类型,不包括数据域。
    超时,就认为对等体Down掉。
  • UPdate消息:主要用于在对等体之间交换路由信息。它既可以发布可达路由信息,也可以发布不可达路由消息;一条Update消息可以通过一类具有相同路径属性的可达路由,同时还可以携带多条不可达路由。
  • Notification消息:Notification的作用就是错误通知。BGP发言者如果检测到对方发过来的消息有错误或者主动断开BGP链接,都会发出Notification消息来通知BGP邻居,并关闭链接回到idle状态;如果收到邻居发来的 Notification消息,也会将链接状态变为idle。Notification消息的内容包括错误代码和错误子代码及错误数据等信息。
  • Route-refresh消息:Route-refresh用来要求对等体重新发送指定地址族的路由信息。

3.2. BGP协议状态机

BGP协议状态机包含6个状态,他们之间的转换过程实际上描述了BGP对等体关系建立的过程:

  • Idle状态(空闲状态):是初始状态,不接受任何BGP连接,等待start启动的产生。如果有start事件产生则系统开启ConnectRetry定时器,向邻居发起TCP连接,将状态变为Connect。
  • Connect状态(连接状态):在Connect状态,系统会等待TCP连接建立完成。
    如果TCP状态为Established,则拆除ConnectRetry定时器,并发送OPEN消息,将状态变为Opensent状态;
    如果TCP连接失败则重置ConnectRetry定时器,并发送OPEN消息,将状态变为Active;
    如果ConnectRetry timer expired(重传定时器)超时,则重新连接,仍处于Connect状态
  • Active状态(活跃状态):如果有启动事件但是TCP连接未完成则处于Active状态,在Active状态系统会响应ConnectRetry timer expired事件,重新进行TCP连接,同时重置ConnectRetry定时器,变为Connect状态;
    如果与对方的TCP连接成功建立则会发送OPEN消息,将状态变为OpenSend,并清除ConnectRetry定时器,重置HoldTime定时器。
  • Openset状态(OPEN消息已发送):此状态表明系统已经发出Open消息,在等待BGP邻居发给自己的OPEN消息。如果收到BGP邻居发来的OPEN消息,并且没有错误的话,则转向Openconfirm状态,同时将HoldTime定时器的值置为协商值,发送Keepalive消息并置Keepalive定时器;
    如果有错误则发送Notification消息并断开链接。
  • OpenConfirm状态(OPEN消息确认):此状态表明系统已经发出Keepalive消息,并等待BGP邻居的Keepalive消息。
    如果收到邻居的Keepalive消息则转向Established状态并重置HoldTime定时器;
    如果KeepAlive定时器超时则重置并发送KeepAlive消息;
    如果收到Notification消息,则断开链接。
  • Established状态(连接建立):如果处于Established状态,则说明BGP链接建立完成,可以发送Update消息交换路由信息;
    如果KeepAlive定时器超时则重置KeepAlive定时器并发送KeepAlive消息;
    如果收到KeepAlive消息则重置HoldTime定时器:
    如果检测到错误或者收到Notification消息则断开链接。

注意:
除了IDLE状态以外的其他五个状态出现任何错误的时候,BGP状态就会退回到Idle状态。

3.3. BGP的路由属性分类

公认必遵属性:ORIGIN、AS-PATH、NEXT_HOP
公认可选属性:LOCAL_PREF、ATOMIC_AGGREGATE、
可选传递属性:COMMUNITY、AGGREGATOR
可选费传递属性:MED、CLUSTER_LIST、ORIGINATOR_ID

  • AS-PATH属性:

是路由到达一个目的地所经过的一系列自制系统号码的有序列表,主要作用就是保证AS之间无环路。本地AS 号添加在AS_PATH列表的最前面。离本地AS最近的相邻AS号排在前面,其他AS号按顺序依次排列。
1、AS_PATH属性保证无环路:当边界路由收到一个路由更新时,发现这个AS号码在路由的AS属性中已经存在,边界路由就会丢弃这个路由。
2、AS_PATH属性也可用于路由的选择和过滤:在其他因素相同的情况下,BGP会优先选择AS_PATH最短的路由(选择路径最短的路由)。
3、BGP发言者在向EBGP邻居发送路由更新时修改AS_PATH属性,向IGP邻居发送时不修改该属性。

  • NEXT_HOP属性:BGP发言者指示去往目的地的下一跳。
    BGP的下一跳属性和IGP的不同,不一定就是邻居路由器的IP地址。
    1、BGP发言者把自己产生的路由发给所有邻居时,将把该路由信息的下一跳属性设置为自己与对端链接的接口地址;
    2、BGP发言者把从EBGP邻居得到的路由发给IBGP邻居时。并不法币该路由信息的下一跳属性,将从EBGP得到的路由的NEXT-HOP直接传递给IBGP对等体。
    3、BGP发言者把收到的路由发给EBGP对等体时,将把该路由信息的下一跳属性设置为本地与对端连接的接口地址。
    4、对于可以多路访问的网络(以太网或者帧中继),如果通告路由器和源路由器接口处于同一网段,则BGP会向邻居通告路由的实际来源。

  • ORIGIN属性:
    它只是该条路由信息的来源,也就是这条路由是通过何种方式注入到BGP中的。一般有三种类型:
    1、IGP:优先级最高,说明路由产生于AS内部
    2、EGP:优先级次之,说明路由是通过EGP学到的
    3、Incomplete:优先级最低,它并不是说路由不可达,而是标识路由的来源无法确定。比如引入的是其他路由协议的路由信息。

一般情况下路由注入BGP有三种途径:
1、BGP通过network命令指定注入到BGP中的路由,此种途径下的路由的ORIGIN属性设置为IGP
2、BGP把通过EGP注入BGP中的路由,此种途径下的路由的ORIGIN属性设置为EGP
3、BGP把由IGP协议引入到BGP中的路由,此种途径下的路由的ORIGIN属性设置为Incomplete。

BGP在其路由判断过程中会考虑ORIGIN属性来判断多条路由之间的优先级,具体来说就是在其他因素相同的情况下,BGP优先选用具有最小ORIGIN属性值的路由,也就是:IGP——EGP——Incomplete。

  • LOCAL_PREF属性:公认可选属性
    用于AS内IBGP邻居选择离开本地AS时的最佳路由,表明的是BGP路由的优先级。也就是在一个AS内有多个出口的情况下,判断流量离开AS时的最佳路由。当BGP路由通过IBGP对等体得到目的地址相同但是下一跳不同的多条路由时,将优先选择LOCAL_PREF属性值较高的路由。
    在配置了LOCAL_PREF属性的BGP发言者或收到带有LOCAL_PREF属性的路由信息的BGP发言者只将该属性传给IBGP邻居,所以该 属性只在AS内部传播,不传递到AS外, 也就是说仅仅在IGBP对等体之间交换,不传递或通告给其他EBGP对等体。

注意:
LOCAL_PREF的属性值仅仅会影响离开该AS的流量,不会影响进入该AS的流量。

  • MED(MULTI_EXIT_DISC)属性:是可选非传递属性
    1、相当于IGP协议使用的metric,当一个AS有多个入口点时,用于判断流量进入AS时的最优路径。也就是说当EBGP邻居有多条路径到达本AS 的时候,用于高速EBGP邻居进入本AS的较优路径。
    当一个运行BGP的路由器通过不同的EBGP对等体得到目的地址相同但下一跳不同的多条路由时,在其他条件相同的情况下,将会优先选择 MED 值较小者为最佳路由。
    MED属性仅在相邻两个AS之间传递,收到此属性的AS不会再将其通告给任何第三方AS
    注意:

通常情况下,BGP只会比较来自同一个AS的路由MED属性值,不比较来自不同AS的MED值。若一定要比较,则需要进行特别的配置。

  • Preferred-value属性: 是私有BGP属性
    为从对等体接收的路由分配首选值,从而影响选路
    只在本地有效,不随路由信息传播
    首选值(Preferred-value)为私有BGP属性。通过为从不同对等体接收的路由分配不同的Preferred-value值,可以改变从指定对等体学到的路由的优先级。
    系统会给所有从不同EBGO对等体学来的路由分配一个初始Preferred-value值0.,如果为从某些对等体接收到的路由配置了不同的Preferred-value值,那么在不同邻居学来的相同目的地址/掩码的多条路由中,拥有 最高Preferred-value值的路由将被选座到达指定网络的路由。
    Preferred-value属性只在本地有效,不随路由信息传播。

4. BGP的选路规则

4.1. BGP协议对路由的处理流程

对于一个BGP路由器来说,其路由的来源有两种:从对等体接收和从IGP引入。

  • BGP发言者从对等接收到BGP路由后,其基本的操作过程为:

接收路由过滤与属性设置——>路由聚合——>路由优选——>路由安装——>发布策略——>发布路由属性与属性设置

接收路由过滤与属性设置是BGP发言者从对等体接收到路由后的第一步工作。BGP接收到路由后,根据配置的接收策略对接收到的BGP路由进行匹配与过滤(根据路由携带的属性),病对其设置相关的属性。
完成了接收策略的匹配后,如果需要的话,BGP发言者将对路由进行聚合,合并其中的具体路由,一次减少路由表的规模。
完成了具体路由合并后,BGP将对接收到的路由进行优选。对于到达同一个目的地址的多条BGP路由,BGP发言者只选择最佳的路由给自己使用,并将此最佳路由安装到IP路由表,成为有效路由。
在向BGP对等体发布路由的时候,BGP发言者需要依据一定的发布策略,对已经安装到自己IP路由表的部分有效路由进行发布
同时,BGP路由器需要执行发布路由过滤与属性设置,然后将通过过滤的BGP路由发送给自己的BGP对等体。

  • 对于IGP路由,则需要先经过引入策略的过滤和属性设置,将IGP路由表中的有效路由引入到BGP路由表中,然后才能进行发布路由过滤与属性设置,并将过滤后的路由发送给自己的BGP对等体

4.2. BGP的路由优选

  1. 在MSR上,BGP会丢弃下一跳不可达的路由。如果到相同目的地的有多条路由,BGP会按照以下顺序选择最优路由:首先丢弃下一跳(NEXT_HOP)不可达的路由:
  2. 优选Preferred_value值最大的路由;
  3. 优选本地优先级(LOCAL_PREF)最大的路由;
  4. 依次选择network命令生成的路由、import-route命令引入的路由、聚合路由;
  5. 优选AS路径(AS_PATH)最短的路由;
  6. 依次选择ORIGIN属性为IGP、EGP、Incomplete的路由;
  7. 优选MED值最低的路由;
  8. 依次选择从EBGP、联盟EBGP、联盟IBGP、IBGP学来的路由;
  9. 优选下一跳度量值(Metric)最低的路由;
  10. 优选CLUSTER_LIST长度最短的路由;
  11. 优选ORIGINATOR_ID最小的路由;
  12. 优选Router ID最小的路由器发布的路由;
  13. 优选IP地址最小的对等体发布的路由;

4.3. 应用BGP负载分担时的选路

  依据BGP选择路由的策略可以得知,BGP协议本身一定能够选出唯一一条到达目的网段最优路由,那么要实现负载分担,就需要在路由器配置允许BGP进行负载分担。
BGP的负载分担与IGP的负载分担有所不同:

  1. IGP通过协议定义的路由算法,对到达同一目的地址的不同路由,根据计算结果,将度量值(metric)相等的(如RIP、OSPF)路由进行负载分担。
  2. BGP本身没有路由计算的算法,只是一个选路的路由协议,因此,不能根据一个明确的度量值决定是否对路由进行负载分担,但是BGP有丰富的选路规则,可以在对路由进行一定的选择后,有条件的进行负载分担,也就是将负载分担加入到BGP的选路规则中去。
      另外,在BGP中,由于协议本身的特殊性,它产生的路由的下一跳地址可能不是当前路由器直接相连的邻居。常见的一个原因就是,IBGP之间发布路由信息时不改变下一跳。这种情况下,为了能够将报文正确转发出去,路由器必须先找到一个直接可达的地址(查找IGP建立的路由表项),通过这个地址到达路由表中指示的下一跳。在上述转发过程中,去往直接可达地址的路由被称为依赖路由。BGP路由依赖于这些路由指导报文转发,根据下一跳地址找到以来路由的过程就是路由迭代(recursion)。路由器支持基于迭代的BGP分担,即如果以来路由本身负载分担的(假设有三个下一跳地址),则BGP也会生成相同数量的下一跳地址来指导报文转发,需要说明的是,基于迭代的BGP负载分担比不需要命令的配置,这一特性在系统上始终启用。

4.4. BGP路由的发布策略

  • 存在多条有效路由时,BGP发言者只将最优路由发布给对等体。如果配置了adversite-rib-active命令,则BGP发布IP路由表中的最优路由;否则,发布BGP路由表中的最优路由
  • BGP发言者只将自己使用的路由发布给对等体
  • BGP发言者从EBGP获得的路由会向它所有BGP对等体发布(包括EBGP对等体和IBGP对等体)
  • BGP发言者从IBGP获得的路由不向它的IBGP对等体发布
  • BGP发言者从IBGP获得的路由会发布给它的EBGP对等体
  • BGP链接一旦建立,BGP发言者将把满足上述条件的所有BGP路由发布给新的对等体,之后,BGP发言者只在路由发生变化时,向对等体发布更新路由。

5. 时间间隔

  • 宣告时间间隔:定义此计时器的命令是neighbor X.X.X.X advertisment-interval XX。对于eBGP,默认值为30秒,对于iBGP / eiBGP会话(AS内),默认值为5秒。该计时器真正作用于“Down-Up”或“Up-Down”收敛过程,因为任何快速的拍打变化都会延迟advertisement-interval的时间。这对于AS间路由传播尤为重要,其中默认advertisement-interval间隔为30秒
# For rapid convergence
neighbor 192.168.1.0 advertisement-interval 1
  • 心跳保活时间

  • BGP会话维持时间hold-time:会话维持时间,超过则断开连接.通常是keepalive-time心跳时间的3倍;

  • BGP会话保活时间keepalive-interval:秒级时间间隔,用于维持邻居连接的心跳包时间频率;

keepalive-interval保活检查周期1min查询邻居关系是否存在;实际保活TCP会话;缺省情况下,发送KeepAlive 的时间间隔为 60秒,Hold Time是180秒。每次从邻居处接收到KeepAlive 报文将重置Hold Time定时器,如果Hold Time定时器超时,就认为对等体Down掉。

  • 断开重连时间间隔connect-retry: Time interval in seconds between attempts to establish a session with the peer.秒级
    为了防止差错的持续出现造成BGP邻居的摆动,connectRetry计时器会呈现级数级的增加第一次60s,下一次的为前一 次的2倍120s,再下次240s。。。可重点关注Idel报文。

原文链接:BGP协议基本原理

发表评论

邮箱地址不会被公开。 必填项已用*标注