Technorati 标签: BGP, CCIE, CCNP, 原理, 基础

BGP博大精深,在学习的时候我们会发现和传统的IGP有很大的区别,以至于我们在学习的时候很多东西都是在颠覆我们传统的概念,而让学习变得更加困难。

学习是一个渐进的过程。所以对于学习BGP这个路由协议来说一定要做好充分的思想准备。

在正式开始学习BGP技术本身以前,最好先在网上查一下BGP这个路由协议产生的背景,为什么人们会需要bgp这个大型的路由技术,他能帮人类解决通讯的什么问题?

为什么传统的IGP不能胜任这些工作。

在用实验验证原理之前,首先会把所有bgp比较重要的原理都整理出来。俗话说磨刀不误砍柴功。

任何技术后面都有他产生的背景,只有了解了背景以后,才能做到举一反三。

我已经做好了思想准备,准备在3个月之内重新将BGP系统的学习一次。

BGP基础:

考虑到BGP用在AS之间,是作为大型网络之间接口的角色存在,对报文传输的稳定性有很高的要求,BGP选择了TCP作为承载协议,使用端口号179。由于TCP提供了稳定可靠的传输,BGP不需要专门的机制来处理复杂的报文分片、重传、确认等细节。

BGP建立邻居是采用的普通的IGP动态发现邻居的 方式呢?还是采用静态手工配置的方式呢?

BGP明确的选择了后者,只要双方指定地址路由可达。那么就可以建立邻居。这样做至少有2个好处:

○可以与对端设备用任何IP地址建立邻居,而不限于某个固定的接口IP。这样,当两台设备采用环回地址而非直连地址建立BGP邻居时,即使主链路中断了,也可以切换到备份链路上,保持邻居不断。这种稳定性正是BGP作为大型网络路由承载的必要特质;

○可以跨越多台设备建立邻居。当一个AS有多个设备运行BGP建立域内全连接时,不必每台设备物理直连,只要用IGP保证建立邻居的地址可达,即可建立全网连接,减少不必要的链路建设。

在同一个AS(自制系统)内,设备之间的邻居叫做IBGP邻居,不同的AS之间,设备之间的邻居叫做EBGP邻居,相互之间成为BGP对等体(BGP peer).

BGP有四类消息:

这里网上得牛人用比较强悍的生活语言来诠释了这四类报文的作用:

OPEN打招呼你好跟我交个朋友吧

KEEPALIVE我还活着呢别不理我

UPDATE有新闻......

NOTIFICATION我不跟你玩了!

下面就来逐一看看详细的报文内容:

OPEN消息

clip_p_w_picpath002

Version: 这个字段是BGP的版本号,如果一个对等体的版本比对方旧,它会拒绝新版本的连接,于是对方降低版本号重新进行协商,直到双方版本达成一致为止再进行协商。

My AS:对等体的AS号,用来决定双方是IBGP邻居,还是EBGP邻居。

hole time: 对等体通过定期发送Keepalive消息通知对端本端还在,用来保持邻居。一般keepalive每60秒发送一次,hold time为180秒.协商的时候,采用open消息中比较小得那个hold time作为双方的holdtime.

BGP identifier:用来表示邻居的IP地址,也是一个标示符。

Optional Parameter: 公布对一些可选功能的支持,如认证,多协议支持等等。

一个BGP邻居的建立过程如下:

clip_p_w_picpath004

当然上面说到的是一个完全顺利的邻居建立过程,如果当邻居检测到OPEN消息有错误的时候,需要中断连接,这个时候BGP就会发送Notification消息通知对端,消息格式如下:

Notification消息:

clip_p_w_picpath006

在Notifacation中就会携带错误代码,需要参考协议标准,这里就不再展开。

其实在bgp的邻居建立过程中,只要我们一看到有notification消息,那么第一反应就是,遭了,邻居一定震荡过或者压根就建立不起来。按这些年的经验,如果配置没有问题,那么就需要抓包或者show logging来查看到底是什么错误代码。一般这类的问题都是兼容性问题。最终是需要研发老师修改IOS才能解决....:)

Update消息:

邻居建立后,bgp采用update消息来发布路由或者撤销路由。

UPdate消息主要由三部分组成:

Unfeaasible Routes:之前发布过的,不再有效地路由。

Path Attributes:路由信息的附件描述,是bgp用以进行控制和决策的重要消息。

NLRI:由一个或者多个IP地址/前缀长度组成.

clip_p_w_picpath008

注意,一个update消息可以携带多个路由信息.

综上我们可以得出BGP四种消息报文的用途OPEN用来建立邻居KEEPALIVE维持邻居UPDATE发布路由信息NOTIFICATION通知对端检测到错误。

下面再看一下BGP的状态机:FSM

clip_p_w_picpath010

IDLE:

BGP协议初始时是出于IDLE状态的.在这个状态时,系统分配不到任何资源,也拒绝所有进入BGP的连接,,只有收到Start Event后,才会分配bgp资源,

Connect:

在该状态下,BGP等待TCP完成连接。如果连接成功,发送OPEN报文给对等体,然后状态改变为open sent,否则的话重置connectRetry计时器,并将状态移到Active状态.

Active:

BGP初始化TCP连接来获得一个对等体,如果连接成功,发送OPEN报文,并转至Opensent状态.

Open Sent:

在 该状态下,BGP等待对等体的open报文,收到报文后进行检查,如果有错误,本地发送Notification给对等体,邻居状态变为IDLE,如果报文正确,BGP发送Keepalive,并转到OpenConfrim状态.

OpenConfirm:

在该状态下,BGP等待keepalive或者notification,如果收到keepalive,那么邻居关系形成,状态最终为Established.如果收到Notification报文,则变为IDLE状态。

Established:

该状态下,BGP可以和其他的对等体交换UPdate(路由信息),Notification, keepalive报文,如果收到了正确的 update或者keepalive,就认为对端处于正常的运行状态。只要收到了Notification,本地转到IDLE状态。如果收到了错误的UPDATE,本地就要发送notification报文通知对端,并改本地状态为IDLE.

其实我总结起来,IDLE-->connect-->Active都是TCP三次握手的过程。
opensent-->openconfirm就是确认OPEN消息和UPdate消息是否有错误。如果没有错误,就道了established状态。这样可能好记忆一点。