前言:学思科技术我想说,浅尝辄止,不是天才千万别深钻。和我研究高等数学一样,越深入就会发现越多的问题与不合理之处。尤其对于IT界,算法的最终解释权还是掌握在老外手中,所以对于有些细节,我们"记住就好"。

本文主要关于BGP的逻辑而不是具体实验,所以我就随便配了几幅图,大多还是文字哈。由于BGP太过复杂,本文只是第一部介绍作品,以后会有更新!

BGP边界网关协议(Border Gateway Protocol)是互联网上很重要的一个高层协议,被广泛应用于运营商网络的自制系统之间,以及与园区网络之间,实现不同网络之间的"兼容"。

网关(gateway)英文译作"门口",就像海关一样,是整个系统通往外界的唯一出路(除非你是走私~)。在园区网中"网关"有不同的概念,网络也有不同层次之分。企业内部路由器可以作为本地介入网络(网段)的网关,而企业边界路由器可以作为整个自制网络的网关。

BGP边界网关协议就是这么一个凌驾于园区网络之上,实现与外部交流的机制。

正因为BGP工作在IGP之上,本质的不同导致一些细节上的重要区别:

1.IGP路由器邻居之间必须是直连网络;BGP邻居不一定。

2.IGP邻居自动发现;BGP邻居手动指定。

3.同一个进程号的IGP(如eigrp)网络是连续的,即任意两个eigrp路由器之间至少有一条拓扑路径上全是eigrp路由器;而BGP只用在边界路由器上。

4.未启动eigrp的路由器不会转发eigrp消息(阻断eigrp网络);而非BGP路由器被要求转发IGP的消息(正是这一点导致了路由黑洞,稍后说)。

5.IGP可以实现负载均衡;BGP默认不会。

除此之外,BGP与IGP之间是可以类比的!就像二维函数与三维函数之间的类比关系,这种不同网络层次的类比可以这样理解:

1.扩散能力:路由条目都能扩散到整个网络

2.一个BPG网络(联邦或互联网)是由若干个IGP网络组成。

3.IGP路由器身后是一个交换网络,BGP路由器身后是整个企业网(园区网),而企业网是由若干个交换网组成。

4.IGP网络中认为下一跳(或组成单元)是另一个路由器,BGP网络认为下一跳是下一个自制系统(正是这一点衍生出命令next-hop-self,稍后讲)。

由于国家管控严格,规定企业网络必须依赖互联网服务提供商(运营商ISP)接入互联网(世界各国都如此),运营商是互联网的骨干网之一,也是最为我们所熟知的电信、移动和联通。因此BGP与ISP密切相关。

当企业网只连接了一家运营商时,不需要启用BGP,CE端(client edge)只要做一个缺省路由并推向内部路由器,PE端(provider edge)做一个静态路由指向企业就好了。这种方案称为单宿(single homed)或双宿(dual homed)。但大型公司总是采用多宿方案(multihomed),即连接到两家以上的运营商来提高冗余性。多宿解决方案中可以有多种内网配置方案,但大多数公司会采用这种方案:

在每个CE之间的中转路径上全启动BGP,相互指定ibgp peer关系(并不是两两关联)。此时企业网(或者说每一个BGP路由器)成为互联网的一部分(连通性),然后任选一个BGP路由器通过底层动态路由协议将默认路由推向企业内部路由器,即default information originate这条命令。然后这个BGP路由器就会根据数据包的目的ip判断发给哪一个CE。(BGP也有默认信息源这条命令,旨在告诉其他AS,默认流量从我的AS走,但不实用)

这时会出现一个问题,即BGP的防环机制阻隔路由跟新的转发。因为BGP没有DUAL算法的防环性,也没有SPF算法的上帝视角,只采用了最原始的水平分割(split horizon),即从一个ibgp peer收到的更新包不许转发给另一个ibgp peer(与rip的水平分割不太一样)。为解决水平分割带来的问题,一个叫路由反射器(Route Reflector,RR)的东西开发出来。

AS内BGP路径上可以将某个或某几个路由器设置成RR,剩下的成为RR的客户机(但并不知道自己是客户机)。说白了就是手动设置哪些路由器能转发从ibgp peer发来的更新包。

另一种解决方案是不在CE的中转路径上启动BGP,只CE间指定邻居。这种方案也会带来一个问题,即路由黑洞。路由黑洞指ping不通路由表里的目标网络的现象。通常当路由表中的某一个条目在非邻居AS中时,往往ping不通。原因如下:

AS 200的中转路由器R3(无BGP)转发AS 100的某个路由条目给AS 300的BGP路由表,但自身路由表中却没有这个条目(不可达),因此R7 ping AS 100中的网段会失败。

可以用MPLS来解决这个问题,由于mpls技术很复杂需要另作文章,这里讲主要逻辑:标签匹配路由与标签交换,在AS 200中共享路由条目的标签(插入数据包),这样R3寻路时不用看路由表了。

然而BGP最主要是用在ISP分站之间,或者说是互联网的骨干协议。每一个AS或者联邦可以看成是互联网的结点。

每家ISP的BGP路由器都存有数十万条互联网的路由条目。通过类比IGP发现也是通过结点间交换路由更新信息而来。首先BGP需要知道所属AS的内部网段信息,这有两种途径:

1.宣告网络。不一定要宣告直连网络,只要IGP路由表中有的都可以宣告。

2.重分发。直接将IGP分发进BGP,一键到底比较方便。

然后与邻居AS交换路由信息表即可。

返回来谈谈BGP邻居的建立过程。命令行指定邻居地址后,路由器会查询路由表,找到这个地址后向它发送TCP连接,三次握手之后才开始发送与接收open消息(跨网段),之后完成建立。Open消息主要包括:router-id、认证口令、目的与源地址、跳数与AS号。

因为程序员逻辑,对ebgp peer发送hello包的TTL值为1,因为ebgp peer一般都是直连,如果用直连接口地址的话没有问题;但如果想用对方的环回口作为peer地址则会出现问题:对方收到包后将其ttl值减1变成0后丢弃,不在转向自己的环回口,关系无法建立。Ebgp多跳命令由此产生,用于强制修改数据包ttl值(一般改为2)。

又因为程序员逻辑,前面也说过,BGP认为下一跳是下一个AS,路由更新起源于AS外的话,跟新包的源地址保持为AS外的地址,当此CE发给他的ibgp peer后,peer认为下一跳在AS外不可达,又导致了中断。Ibgp下一跳命令由此产生:总是做在ibgp peer之间。

BGP同步机制是一个无用的鸡肋(而且也默认关闭),旨在将BGP更新同步给内网所有路由器。但这样一来相当于所有路由器都启用了BGP,BGP还有什么意义呢?要知道企业内部路由器的性能是无法承受几十万条路由的。

BGP的选路机制。BGP 11条选路策略中最常用的是第四条:选择穿越自治系统数量最少的路径,也就是AS的"跳数"……

——第一部完

【★】深入BGP原理和思想【第…的更多相关文章

  1. 【★】深入BGP原理和思想【第…

    前言:学思科技术我想说,浅尝辄止,不是天才千万别深钻.和我研究高等数学一样,越深入就会发现越多的问题与不合理之处.尤其对于IT界,算法的最终解释权还是掌握在老外手中,所以对于有些细节,我们" ...

  2. 【★】深入BGP原理和思想【第一部】

    前言:学思科技术我想说,浅尝辄止,不是天才千万别深钻.和我研究高等数学一样,越深入就会发现越多的问题与不合理之处.尤其对于IT界,算法的最终解释权还是掌握在老外手中,所以对于有些细节,我们" ...

  3. 使用Cookie实现跨域单点登录的原理

    对于构建分布式系统来说业务功能的物理部署会随着新业务模块的增加而增加或改变物理部署的位置.而每个用户都有统一的帐号作为我们登录系统时的一个认证.当新业务或子系统部署在不同的物理机上,我们去访问不同的业 ...

  4. Orchard工作原理

    概述 本文翻译仅供学习之用,了解Orchard工作原理设计思想.技术点及关键词,如有缺漏请不吝指正.鉴于能力有限定有诸多曲解或不完整的地方,请海涵.不定时完善整理. CMS不像常规的web程序,它更像 ...

  5. Terracotta设计原理分析--(部分内容来自官方描述)

    因为工作中历史产品采用了terracotta作为分布式缓存线性扩展平台,因此不得不提前对其原理做了相关了解,当然其中很多的设计思想和oracle.memcached的设计相似,但也有自己的亮点,那就是 ...

  6. 如何用快排思想在O(n)内查找第K大元素--极客时间王争《数据结构和算法之美》

    前言 半年前在极客时间订阅了王争的<数据结构和算法之美>,现在决定认真去看看.看到如何用快排思想在O(n)内查找第K大元素这一章节时发现王争对归并和快排的理解非常透彻,讲得也非常好,所以想 ...

  7. skiplist(跳表)的原理及JAVA实现

    前记 最近在看Redis,之间就尝试用sortedSet用在实现排行榜的项目,那么sortedSet底层是什么结构呢? "Redis sorted set的内部使用HashMap和跳跃表(S ...

  8. 锐速与BBR的原理简单解析

    锐速与BBR的原理简单解析  4 前言 昨天,有一位朋友在我的文章下留言说,锐速和BBR不都是一样,是拥塞算法嘛.因为这方面需要讲的东西比较多,所以我还是专门水一篇文章吧. 锐速 参考资料: http ...

  9. 深入浅出 Java Concurrency (35): 线程池 part 8 线程池的实现及原理 (3)[转]

    线程池任务执行结果 这一节来探讨下线程池中任务执行的结果以及如何阻塞线程.取消任务等等. 1 package info.imxylz.study.concurrency.future;2 3 publ ...

随机推荐

  1. transport.js报hasOwnProperty对象不支持此属性

    ECShop transport.js错误 这次出现的问题是transport.js在IE下提示对象不支持该用法.出现错误位置为608行的下面的代码: if(this.hasOwnProperty(k ...

  2. 接口测试框架开发(二):extentreports报告中文乱码问题

    转载:http://www.cnblogs.com/lin-123/p/7146935.html 问题:中文乱码 问题解决:eclipse设置编码为utf-8 结果:

  3. vue - webpack.dev.conf.js for merge

    webpack-merge提供了一个merge连接数组并合并创建新对象的对象的函数.如果遇到函数,它将执行它们,通过算法运行结果,然后再次将返回的值包装在函数中. 这种行为在配置webpack时特别有 ...

  4. 算法笔记_164:算法提高 最小方差生成树(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 给定带权无向图,求出一颗方差最小的生成树. 输入格式 输入多组测试数据.第一行为N,M,依次是点数和边数.接下来M行,每行三个整数U,V, ...

  5. 读-《c++设计新思维-泛型编程与设计模式之应用》经典记录(英文书名:《modern c++ design》)

    1.以设计为目标的程序库都必须帮助使用者完毕静止的设计.以实现使用者自己的constraints,而不是实现预先定义好的constraints. 2.Anything that can be done ...

  6. DB文件会生成在哪里以及生成的个数是多少?

    当系统发生Kernel Exception.System Server异常等问题时.MTK内部机制会抓取相关异常调试信息.产生相应的DB文件,放到aee_exp目录下.而在不同的情况下.aee_exp ...

  7. 【leetcode】Reorder List (python)

    问题的思路是这样: 循环取头部合并,事实上也能够换个角度来看,就是将后面的链表结点,一次隔空插入到第一部分的链表中. class Solution: # @param head, a ListNode ...

  8. Spring bean注入方式

    版权声明:本文为博主原创文章,如需转载请标注转载地址. 博客地址:http://www.cnblogs.com/caoyc/p/5619525.html  Spring bean提供了3中注入方式:属 ...

  9. mysql处理大数据合并的另一种方法

    在做项目的时候我碰到了一个这样的场景,有两张表,数据都在300W左右,现在要求在生产环境中合并这两张表为一张表,本来想用sql语句insert into select来实现,后来发现这样操作速度很慢, ...

  10. Android开发——跟随手指的小球实现

      今天要实现的是一个跟随手指的小球,说白了就是让小球按着手指滑动的轨迹运动,实现起来还是比较容易的. 用到的类是drawView,我们先自定义一个DrawView组件. DrawView.java: ...