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

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

——第一部完

时间: 2024-09-19 08:56:02

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

《 C++程序设计:原理与实践(进阶篇.》导读

本节书摘来自华章出版社< C++程序设计:原理与实践(进阶篇)>一书中作者[美] 本贾尼·斯特劳斯特鲁普(Bjarne Stroustrup) 著 刘晓光 李忠伟 王刚 译     前 言 Programming: Principles and Practice Using C++, Second Edition 该死的鱼雷!全速前进. --Admiral Farragut 程序设计是这样一门艺术,它将问题求解方案描述成计算机可以执行的形式.程序设计中很多工作都花费在寻找求解方案以及对其求精上

网络虚拟,云卷云舒

网络虚拟化(Network Virtualization)对于很多网络工程师尤其是刚入行的新手常常有一种懵懵懂懂,不甚了然的神秘感觉,虽然常常为之想入非非,最终还是似是而非.在这篇BLOG里面,除了举例,不涉及具体的技术和实现,尽量展现网络虚拟化背后的最基本的原理(Rationale)和思想(Idea).可能很多人都发现,理解网络技术和协议背后的原理和思想比具体配置操作这些技术和协议更重要,这就是说,知其然当然很好,但更好的是知其所以然.毫无疑问,这一原则同样地适用于其他计算机科学领域.   虚

IOU设计模式介绍及应用

原理 IOU 思想是人们在处理日常债务关系时行之有效的一种方法,即: 债务人通过可靠的第三方保管账户,向债权人发放 IOU 债务凭证: 债务人通过向第三方保管账户提交结果以终止 IOU 债务: 债权人凭此 IOU 债务凭证通过第三方保管账户履行债权并进行结果赎回. 债务人和债权人之间的债务关系,通过可靠的第三方保管账户,实现了在时间和空间上最大程度的分离和解耦. IOU 设计模式是 IOU 思想在软件设计领域的应用,最早由 Allan Vermeulen 于 1996 年首次提出.在软件设计领域

如何编写Linux设备驱动程序

序言 Linux是Unix操作系统的一种变种,在Linux下编写驱动程序的原理和思想完全类似于其他的Unix系统,但它dos或window环境下的驱动程序有很大的区别.在Linux环境下设计驱动程序,思想简洁,操作方便,功能也很强大,但是支持函数少,只能依赖kernel中的函数,有些常用的操作要自己来编写,而且调试也不方便.本人这几周来为实验室自行研制的一块多媒体卡编制了驱动程序,获得了一些经验,愿与Linux fans共享,有不当之处,请予指正. 以下的一些文字主要来源于khg,johnson

js在输入框屏蔽按键,只能键入数字的示例代码

 本篇文章主要介绍了js在输入框屏蔽按键,只能键入数字的示例代码.需要的朋友可以过来参考下,希望对大家有所帮助 代码如下: <script language="javascript"> function GetInput(){//屏蔽非数字和非退格符     var k = event.keyCode;   //48-57是大键盘的数字键,96-105是小键盘的数字键,8是退格符←     if ((k <= 57 && k >= 48) ||

如何用PhotoShop脚本语言处理图片教程

利用Ps脚本我们可以简化工作流程,甚至能创造出让人震惊的数字艺术.卓越的设计师不是沉迷于幻想,而是将幻想变为现实的人.而技术,则是你的魔术棒... 原文作者Ross Aitken(个人教程站:http://psdlearning.com/) 这篇文章写得很详细,力图让每一个读者都能看懂.本文主要涉及到三块主要技术:调色.添加边框和阴影以及随机旋转.调色的方法是复制图片图层,然后平均模 糊取得该图片的平均色,其后用图片RGB通道直方图校验的方法取得该平均色的色值,并根据各通道颜色比例作出调整,然后

动态规划算法

斐波纳契数列F(n) n 0 1 2 3 4 5 6 7 8 9 10 F(n) 1 1 2 3 5 8 13 21 34 55 89 递归 vs 动态规划 递归版本(太慢): int f(int n) { if(n <= 1) return 1; else return f(n-1)+f(n-2); } 动态规划版本(有效率!算法复杂度是 O(n)): int a[1000]; int f(int n) { a[0]=a[1]=1; for(int i=2; i<=n; i++) a[i]=

IOS团队编程规范

本文讲的是IOS团队编程规范,需求是暂时的,只有变化才是永恒的,面向变化编程,而不是面向需求编程. 不要过分追求技巧,降低程序的可读性. 简洁的代码可以让bug无处藏身.要写出明显没有bug的代码,而不是没有明显bug的代码. 先把眼前的问题解决掉,解决好,再考虑将来的扩展问题. 一.命名规范 1.统一要求 含义清楚,尽量做到不需要注释也能了解其作用,若做不到,就加注释,使用全称,不使用缩写. 2.类名 大驼峰式命名:每个单词的首字母都采用大写字母 ==例:== MFHomePageViewCo

iOS代码规范

这篇规范一共分为三个部分: 核心原则:介绍了这篇代码规范所遵循的核心原则. 通用规范:不局限于iOS的通用性的代码规范(使用C语言和Swift语言). iOS规范:仅适用于iOS的代码规范(使用Objective-C语言). 一. 核心原则 原则一:代码应该简洁易懂,逻辑清晰 因为软件是需要人来维护的.这个人在未来很可能不是你.所以首先是为人编写程序,其次才是计算机: 不要过分追求技巧,降低程序的可读性. 简洁的代码可以让bug无处藏身.要写出明显没有bug的代码,而不是没有明显bug的代码.