前言:学思科技术我想说,浅尝辄止,不是天才千万别深钻。和我研究高等数学一样,越深入就会发现越多的问题与不合理之处。尤其对于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. Spring+SpringMVC+MyBatis+easyUI整合

    进阶篇 Spring+SpringMVC+MyBatis+easyUI整合进阶篇(一)设计一套好的RESTful API 优化篇 Spring+SpringMVC+MyBatis+easyUI整合优化 ...

  2. 利用C#进行Socket通信编程之二:一个实例

    本文转载自: http://blog.csdn.net/huangxinfeng/article/details/4967629/

  3. java.lang.NoSuchMethodError:android.content.Context.getDrawable

    今天在开发的时候,这个代码在源码中是可以看到的,但是在android 4.3手机上面会报错,具体错误信息和代码如下: setBackgroundDrawable(context.getDrawable ...

  4. 一个普通的 Zepto 源码分析(一) - ie 与 form 模块

    一个普通的 Zepto 源码分析(一) - ie 与 form 模块 普通的路人,普通地瞧.分析时使用的是目前最新 1.2.0 版本. Zepto 可以由许多模块组成,默认包含的模块有 zepto 核 ...

  5. linux 两个查找工具 locate,find详解

    linux 中有很多查找工具,今天主要讲解locate,find两个工具. 1.locate (1)查询系统上预建的文件索引数据库 /var/lib/mlocate/mlocate.db 注意:如果这 ...

  6. JDK问题--linux下java unrecognized class file version错误的解决

    linux下java unrecognized class file version错误的解决 环境:RedHat Linux Enterprise 5.4 问题:java.sun.com下载jdk1 ...

  7. Python获取区域面积

    import cv2 import numpy as np def get_leave_areas(image): img = cv2.imread(image) GrayImage = cv2.cv ...

  8. 从源码理解Spring原理,并用代码实现简易Spring框架

    前言(本文为原创,转载请注明出处) 个人之前对于框架的学习,就停留在配置,使用阶段.说实话过段时间就会忘得荡然无存.也不知道框架的运行逻辑,就是知道添加个注解,就可以用了. 由于实习,时间比较多,也感 ...

  9. centos开放端口8080

    今天购买了云服务器,玩耍一下,配置好了jdk和tomcat后,发现访问不了8080端口,telnet 不通,由此想到了防火墙挡住了. 配置规则: iptables -I INPUT -p tcp -- ...

  10. Win7下C:\Users\Cortana以账户名称命名的系统文件夹用户名的修改

    Win7下C:\Users\Cortana以账户名称命名的系统文件夹用户名的修改 Win7下C:\Users\Cortana以账户名称命名的系统文件夹用户名的修改 即修改Cmd命令提示符:C:\Use ...