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