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消息:
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邻居的建立过程如下:
当然上面说到的是一个完全顺利的邻居建立过程,如果当邻居检测到OPEN消息有错误的时候,需要中断连接,这个时候BGP就会发送Notification消息通知对端,消息格式如下:
○Notification消息:
在Notifacation中就会携带错误代码,需要参考协议标准,这里就不再展开。
其实在bgp的邻居建立过程中,只要我们一看到有notification消息,那么第一反应就是,遭了,邻居一定震荡过或者压根就建立不起来。按这些年的经验,如果配置没有问题,那么就需要抓包或者show logging来查看到底是什么错误代码。一般这类的问题都是兼容性问题。最终是需要研发老师修改IOS才能解决....:)
○Update消息:
邻居建立后,bgp采用update消息来发布路由或者撤销路由。
UPdate消息主要由三部分组成:
Unfeaasible Routes:之前发布过的,不再有效地路由。
Path Attributes:路由信息的附件描述,是bgp用以进行控制和决策的重要消息。
NLRI:由一个或者多个IP地址/前缀长度组成.
注意,一个update消息可以携带多个路由信息.
综上我们可以得出BGP四种消息报文的用途:OPEN用来建立邻居,KEEPALIVE维持邻居,UPDATE发布路由信息,NOTIFICATION通知对端检测到错误。
下面再看一下BGP的状态机:FSM
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状态。这样可能好记忆一点。
转载于:https://blog.51cto.com/361531/701270