背景:

  在20世纪80年代早期,站点以及站点之间路由协议的管理性对于快速增长的Internet是十分重要的。最初的解决方案是使用外部网关协议(EGP),但是EGP不能有效的防止环路,不能高效的选择路径,需要大量的时间来进行路由的聚合,且没有相关的工作来支持路由策略。

  一开始科研人员尝试改进EGP,但是最后提出一个新的域间协议(BGP)。BGPv1在1989年被第一次提出,BGPv2在1990年被提出,1991年BGP再一次升级为BGPv3。1993年提出无类域间路由(CIDR)。而现在使用的BGP版本为4,是1995年被提及。BGPv4与其他版本最大的区别是无类的(CIDR),其他版本都是有类的,而这种改动从根本上改变了外部网关协议的可管理性和可靠性,BGPv4的出现就是为了支持CIDR。

*CIDR:将网络进行汇总时不需要按照主类网络的掩码规划。

概念:

BGP(border gateway protocol)边界网关协议,是基于路径矢量算法的EGP协议。用于AS间的网络互联,主要功能为AS间的路由传递与控制。基于TCP 179的路由协议,可靠性强。在建立邻居之前需要建立可靠的TCP三次握手;TCP可以为BGP提供确认重传、排序等可靠性的功能。

*AS:自治系统,由一个机构管理使用相同的选路规则的一组网络设备的集合就是一个AS(比如一个园区、一个数据中心、一个国家骨干都可以属于一个AS)。AS之间通过编号进行区分,其中AS编号分为2 byte AS 和4 byte AS。AS分为公网AS和私网AS,在公网需要申请公网AS号。公网AS为1-64511;私网为64512-65534。

报文类型:

1. open报文:通过该报文协商两段的参数建立BGP邻居。(状态机中具体解释了open报文的内容)

a) 

使用ripng建立BGP bgp建立时间_TCP

b) 存在多个Capability,用于协商邻居之间的能力信息。

2. keepalive报文:周期60s发送,保持BGP邻居活跃度。该报文180s失效。

a) 

使用ripng建立BGP bgp建立时间_p2p_02

b) 由于keepalive就是周期发送保证邻居活跃度,所以该报文只有BGP的报文头部。

3. updata报文:路由更新报文,触发更新。

a) 

使用ripng建立BGP bgp建立时间_使用ripng建立BGP_03

b) 报文中的Withdrawn routes  //用于撤销路由,会将撤销的路由放入该字段

c) 报文中的Path attributes    //BGP的路由属性,会包括AS-path、Origin、next-hop等

d) 报文中的Network layer reachability information(NLRI) //网络层可达信息,携带路由信息

4. Route-refresh报文:路由刷新报文,当收到该报文会响应updata报文

a) 

b) 当路由器的入方向策略发生的变更,就会向邻居发送router-refresh报文请求邻居重新更新路由,邻居收到后就会将路由通过updata重新发送,这样本端路由器就可以将新的路由重新经过策略。

5. notification报文:差错通知报文,在BGP中出现任何差错都会发送该报文

a) 

使用ripng建立BGP bgp建立时间_网络_04

b) 路由器发送或接收该报文都会导致邻居关系和TCP失效,需要重新建立

状态机:

peer:对等体,就是BGP邻居关系

speaker:发言人,发送BGP报文的路由器

Router-ID:用于在BGP内部唯一标识一台BGP路由器,可以手工配置

使用ripng建立BGP bgp建立时间_TCP_05

 

Idle:初始状态,BGP路由器初始状态,当BGP start后会进入connect状态。

Connect状态:在该状态会尝试进行TCP连接,如果连接成功进入Opensent,如果失败则进入active状态。

*active:在本状态会重新建立TCP连接,如果成功就进入opensent,如果失败,则等待TCP连接超时后返回connect状态。

如果设备长时间停留在avtive状态,那么可能会出现tcp连接无法建立的情况,可能的原因为:

TCP不可达(二层不可达(链路故障、三层不可达(路由无法获取、端口不可达(一些过滤策略禁止了BGP的端口)

opensent:两端会互相发送open报文,在报文中携带自身参数用于邻居协商,协商成功则进入openconfirm状态。

open报文参数协商:可以对照上述open报文的内容

MY AS号:在open报文携带自身所在AS号,对端收到后会将配置的AS和open报文携带的my as进行比较,如果一直则可以建立邻居。

Hold time:协商使用两端较小的一端的hold time。只协商hold time可以灵活的配置keepalive时间,可以两端使用不同的keepalive时间,在协商时要求hold time必须是keepalive时间的三倍以上,如果本地keepalive时间大于协商后的hold time,那么会将本地的keepalive时间改为hold time的1/3。

BGP的RID:两端必须不一致。

BGP能力属性:两端需要协商成一致的。

openconfirm:当收到了对端的open报文并协商成功,就会发送keepalive进行确认并进入established状态。

established:当收到对端的keepalive标识对端对本端的open进行确认,就会进入established。在本状态下会周期发送keepalive来维持TCP的活跃度,并且会向邻居发送updata报文更新路由。

Notification:在任意状态都有可能发送,只要收到或者发送就会进入Idle状态,重新建立邻居关系。

邻居种类

1. EBGP邻居关系

a) AS间建立的邻居关系,一般在AS之间没有IGP,所以可以通过直连接口建立EBGP

使用ripng建立BGP bgp建立时间_p2p_06

使用ripng建立BGP bgp建立时间_p2p_07

使用ripng建立BGP bgp建立时间_java_08

 

b) 如果使用环回口或者建立EBGP邻居的路由器跨越了3层网络,此时需要指定更新源,且由于EBGP默认建立邻居的跳数为1,所以需要指定EBGP建立邻居的跳数要满足

2. IBGP邻居关系

a) AS内部建立的邻居关系,一般在AS内都是IGP,所以IBGP可以使用环回口建立邻居更加稳定

b) 在建立时需要考虑更新源的问题,需要将环回口指定为建立邻居关系的接口

问题:BGP建立邻居的过程是邻居双方都会发起TCP连接,但是需要使用的只是其中的一个,那么使用华为设备建立BGP邻居会使用哪一个TCP链接呢?

使用ripng建立BGP bgp建立时间_java_09

回答:华为设备建立BGP邻居双方都会发起TCP连接,先发起的一方TCP会话会建立成功,发送OPEN报文后会被对方发送TCP(FIN置位),先发起的一方回复TCP(ACK置位)断开TCP会话,然后后发起方开始建立新的TCP连接。

总结:BGP邻居的双方TCP连接只会使用后发起的TCP连接。