外部网关协议BGP

1989年,公布了新的外部网关协议BGP(边界网关协议),我们目前使用最多的版本是BGP-4(但仍然是起草方案[RFC 4271]),简写为BGP。

在不同的自治系统AS中之间的路由选择为什么不选择前面讨论的内部网关协议,如RIP或者OSPF?我们知道,内部网关协议(如RIP或RSPF)主要是设法使数据报在一个AS当中尽可能从源站发送到目的站。然而BGP使用的环境却不同,这主要有以下两种原因:

  1. 互联网的规模太大,使得自治系统AS之间路由选择非常困难。连接在互联网主干上的路由器,必须对任何有效的IP地址都能在路由表中找到匹配的目的网络。目前在互联网的路由器中,一个路由表的数目早已超过5万个网络前缀。如果使用链路状态协议,则每一个路由器必须维持一个很大的链路状态数据路,对于这么大的主干网,迪杰斯特拉算法计算最短路径时花费的时间也太长。另外,不同的AS自治系统运行着自己选择特定的内部路由选择协议,并使用本AS指明的路径长度。比较合理的做法是在自治区系统之间交换可达性信息(即“可到达”或者“不可到达”),例如,告诉相邻路由器:“到达目的网络N可以经过自治系统ASx”。

  2. 自治系统AS之间的路由选择必须考虑有关策略。由于相互连接的网络的性能相差很大,根据最短路径(即最小跳数)找出来的路径,可能并不合适。还有一种情况,如自治系统AS1要发送的数据报给自治系统AS2,本来是最好经过AS3,但AS3并不愿意让这些数据报通过本自治区的网络,因为“这是他们的事,和我们没有关系”。因此,自治系统之间的路由选择应当允许使用多种路由选择策略。使用这些策略是为了找出更好的路径而不是最佳的路径。

由于上述情况,边界网关协议BGP只能时力求寻找一条能够到达目的网络且比较好的的路由(不能兜圈子),而并非要找一条最佳路由,BGP采用了路径向量(path vector)路由选择协议,它与距离向量协议(如RIP)和链路状态协议(如OSPF)都有很大的区别。

在配置BGP的时候,每一个自治系统的管理员要选择至少一个路由器作为该自治系统的BGP发言人。一般来说,两个BGP发言人都是通过一个共享网络连接在一起的,而BGP发言人往往就是BGP边界路由器,但也可以不是BGP边界路由器。

一个BGP发言人与其他AS的BGP发言人要交换路由信息,就要先建立起TCP连接(端口号为179),然后在此连接上交换BGP报文以建立BGP会话(session),利用BGP会话交换路由信息,如增加了新的路由,或撤销过时的路由,以及报告出差错情况等等。使用TCP连接能提供可靠的服务,也简化了路由选择协议。使用TCP连接路由信息的两个BGP发言人,彼此成为对方的邻站(neighbor)或对等站(peer)。

图4-38表示BGP发言人和自治系统AS之间的关系示意图。在图中画出了三个自治系统中的5个BGP发言人,每个BGP发言人除了必须运行BGP协议模块外,还必须要运行该自治系统内部的内部网关协议,例如OSPF协议或者RIP协议。

边界网关协议BGP所交换的网络可达性的信息就是要到达某个网络(用网络前缀表达式)所要经过的一系列自治系统。当BGP发言人互相交换了网络可达的信息后,各BGP发言人就根据所采用的策略从收到的路由器信息找到到达各自治系统较好的路由,图4-39表示了从图4-38的AS1上的一个BGP发言人构造出的自治系统连通图,它是树形结构,不存在回路。

在如下图4-40中,给出了一个BGP发言人交换路径向量的例子。自治系统AS2的BGP发言人通过主干网的BGP发言人:”要到达网络N1,N2,N3,N4和N5可以经过AS2“。主干网在收到这个通知后,就发出通知:”要到达网络N1,N2,N3和N4可经过AS2可沿着路经(AS1和AS2)“。同理,主干网还可以发出通知:”要经过网络N5,N6,N7可沿路径(AS1和AS3)“。

从上面可以看出:BGP协议交换路由信息的结点数量级是自治系统个数,这要比这些自治系统中的网络个数少很多,每一个自治系统中BGP发言人(路由器)的数目是很少的,这样就使得自治系统之间的路由选择并不过分复杂。

BGP支无分类持域间路由选择协议CIDR,因此BGP的路由表也就包括目的网络前缀信息,下一跳路由器,以及要到达目的网络所要经过的自治系统序列,由于使用了路径向量信息,就可以很容易的避免”兜圈子”。

在BGP协议刚刚运行的时候,BGP的邻站是交换整个BGP路由表,但以后只需要在发生变化时更新有变化的部分。这样做对节省网络带宽和减少路由器的处理开销都有好处。在RFC 4271中规定了BGP-4种报文:

  • OPEN(打开)报文:用来和相邻的另一个BGP发言人建立关系,初始化通信。
  • UPDATE(更新)报文:用来通告某一个路由的信息,以及列出要撤出的路由。
  • KEEPALIVE(保活)报文:用来周期性证实邻站的连通性。
  • NOTIFICATION(通知报文):用来发送检测到的差错。

若两个邻站属于不同AS,而其中一个邻站打算要定期和另一个邻站交换路由信息,一开始就应该发送一个OPEN报文,如果邻站接受邻站的关系,就用KEEPALIVE报文(一般每隔30s)。KEEPALIVE报文只有19字节长(只用BGP报文的通用首部),因此不会造成网络上太大的开销。

UPDATE报文是BGP协议的核心,BGP发言人可以使用UPDATE报文撤销它以前通知过的路由,也可以宣布增加新的路由,撤销路由可以一次性撤销许多条,但是新增路由,每个UPDATE报文只能添加一条。BGP可以很容易地解决距离向量路由选择算法中的“坏消息传播得慢“这一问题。当某个路由器或者链路出现故障的时候,由于BGP发言人可以从不止一个邻站获取路由信息。因此很容易地选择出新的路由。距离向量算法往往不能给出正确的选择,因为这些算法往往不能给出正确的选择,是因为这些算法不能指出哪些邻站的目的站的路由时独立的。

图4-41给出了BGP报文的格式。四种类型的BGP报文具有同样的通用首部,其长度为19字节,通用首部分为三个字段:

  • 标记字段16字节:用来鉴别收到的BGP报文,如果不使用鉴别,则标记字段要置为全1
  • 长度字段指出包含通用首部在内的整个BGP报文以字节为单位的长度,最小值为19,最大值为4096(占1字节)。
  • 类型字段的值为1-4,分别对应上述BGP报文中的一种,占1字节。

OPEN报文共有6个字段:

  • 版本(1字节,现在的值是4)
  • 本自治系统(2字节,使用全球唯一的16位自治系统号,由ICANN分配)
  • 保持时间(2字节,以秒计算的保持为邻站关系的时间)
  • BGP标识符(4字节,通常是该路由器的IP地址)
  • 可选参数长度(1字节,可选参数)

UPDATE报文共有5个字段:

  • 不可行路由长度(2字节,指明下一个字段的长度)
  • 撤销的路由(列出所有要撤销的路由)
  • 路径属性总长度(2字节,指明下一个字段的长度)
  • 路径属性(定义这个报文中增加的路径属性)
  • 网络层可达信息NLRI(Network Layer Reachability Information:定义发出此报文的网络,包括网络前缀的位数,IP地址前缀)

KEEPALIVE报文只有BGP的19字节长度的通用首部。

NOTIFICATION报文只有三个字段:

  • 差错代码(1字节)
  • 差错子代码(1字节)
  • 差错数据(给出有关差错的诊断信息)

计算机网络-4-8-外部网关协议BGP的更多相关文章

  1. BGP--边界网关协议

    要全面了解BGP,首先我们要回答以下看上去很简单的问题:为什么需要BGP,也就是说BGP是如何产生的,它解决了什么问题.带着以上问题,我们先简单的回顾一个路由协议发展的轨迹. 首先路由的实质是描述一个 ...

  2. 边界网关协议BGP

    Border Gateway Protocol (BGP) is a standardized exterior gateway protocol designed to exchange routi ...

  3. 计算机网络-4-7-内部网关协议OSPF

    内部网关协议OSPF(开放最短路径优先) 出现的原因:为了克服RIP协议的缺点在1989年开发出来,**开放 表明OSPF协议不受任何厂家的限制.最短路径优先是因为使用了最短路径算法SPF**. OS ...

  4. openstack项目【day23】:keystone组件网关协议

    本节内容 一 静态页面和动态页面 二 什么是web server 三 什么是网关协议 3.1 引子 3.2 网关协议 四 网关协议CGI.FastCGI.WSGI.UWSGI 五 网关协议与keyst ...

  5. keystone系列三:网关协议

    一 静态页面和动态页面 在了解了http协议后,我们知晓,一个web server的本质就是 浏览器发送一个HTTP请求: 服务器收到请求,生成一个HTML文档: 服务器把HTML文档作为HTTP响应 ...

  6. openstack 之~keystone之网关协议

    第一:静态页面和动态页面 上一篇博客介绍了HTTP后,我们知道一个web server的本质就是 浏览器发送一个HTTP请求: 服务器收到请求,生成一个HTML文档: 服务器把HTML文档作为HTTP ...

  7. 网关协议学习:CGI、FastCGI、WSGI

    网关协议学习:CGI.FastCGI.WSGI https://www.biaodianfu.com/cgi-fastcgi-wsgi.html

  8. freeswitch与外部网关链接

    我建了一个 Freeswitch 内核研究 交流群, 45211986, 欢迎加入, 另外,提供基于SIP的通信服务器及客户端解决方案, 承接 sip/ims 视频客户端开发,支持接入sip软交换,i ...

  9. 物联网学习笔记三:物联网网关协议比较:MQTT 和 Modbus

    物联网学习笔记三:物联网网关协议比较:MQTT 和 Modbus 物联网 (IoT) 不只是新技术,还是与旧技术的集成,其关键在于通信.可用的通信方法各不相同,但是,各种不同的协议在将海量“事物”连接 ...

随机推荐

  1. 类的访问权限和Object

    1.访问控制权限 1.1.访问控制权限都有哪些? 4个. private 私有 public 公开 protected 受保护 默认 1.2.以上的4个访问控制权限:控制的范围是什么? private ...

  2. xml的语法规则

    XML 文档必须有根元素 XML 文档必须有关闭标签 XML 标签对大小写敏感 XML 元素必须被正确的嵌套 XML 属性必须加引号 针对元数据的 XML 属性 有时候会向元素分配 ID 引用.这些 ...

  3. SpringCloud微服务实战——搭建企业级开发框架(二十四):集成行为验证码和图片验证码实现登录功能

    随着近几年技术的发展,人们对于系统安全性和用户体验的要求越来越高,大多数网站系统都逐渐采用行为验证码来代替图片验证码.GitEgg-Cloud集成了开源行为验证码组件和图片验证码,并在系统中添加可配置 ...

  4. Python技法1:变长和定长序列拆分

    Python中的任何序列(可迭代的对象)都可以通过赋值操作进行拆分,包括但不限于元组.列表.字符串.文件.迭代器.生成器等. 元组拆分 元组拆分是最为常见的一种拆分,示例如下: p = (4, 5) ...

  5. C/C++内存几大分区和存储空间的布局

    先看一下可执行文件加载进内存后形成的进程在内存中的结构,如下图: 代码区:存放CPU执行的机器指令,代码区是可共享,并且是只读的. 数据区:存放已初始化的全局变量.静态变量(全局和局部).常量数据. ...

  6. Docker Nginx-Proxy 容器Nginx Proxy反向代理

    Docker Nginx-Proxy 容器Nginx Proxy反向代理   简单介绍 Docker容器的自动Nginx反向代理   dockerhub地址 https://hub.docker.co ...

  7. 8.7 进程间的通讯:管道、消息队列、共享内存、信号量、信号、Socket

    进程间的通讯 进程间为什么需要通讯? 共享数据.数据传输.消息通知.进程控制 进程间的通讯有哪些类型? 首先,联系前面讲过的知识,进程之间的用户地址空间是相互独立的,不能进行互相访问,但是,内核空间却 ...

  8. 一次线上GC故障解决过程记录

    排查了三四个小时,终于解决了这个GC问题,记录解决过程于此,希望对大家有所帮助.本文假定读者已具备基本的GC常识和JVM调优知识,关于JVM调优工具使用可以查看我在同一分类下的另一篇文章: http: ...

  9. mysql事务控制语言TCL

    Transaction Control Language 事务控制语言 事务:一个或一组sql语句组成一个执行单元,这个执行单元作为不可分割的整体执行.如果某个语句执行错误,整个单元回滚到最初的状态. ...

  10. 「Spark从精通到重新入门(一)」Spark 中不可不知的动态优化

    前言 Apache Spark 自 2010 年面世,到现在已经发展为大数据批计算的首选引擎.而在 2020 年 6 月份发布的Spark 3.0 版本也是 Spark 有史以来最大的 Release ...