BGP协议学习理解.docx

上传人:b****2 文档编号:12652092 上传时间:2023-04-21 格式:DOCX 页数:27 大小:309.29KB
下载 相关 举报
BGP协议学习理解.docx_第1页
第1页 / 共27页
BGP协议学习理解.docx_第2页
第2页 / 共27页
BGP协议学习理解.docx_第3页
第3页 / 共27页
BGP协议学习理解.docx_第4页
第4页 / 共27页
BGP协议学习理解.docx_第5页
第5页 / 共27页
点击查看更多>>
下载资源
资源描述

BGP协议学习理解.docx

《BGP协议学习理解.docx》由会员分享,可在线阅读,更多相关《BGP协议学习理解.docx(27页珍藏版)》请在冰豆网上搜索。

BGP协议学习理解.docx

BGP协议学习理解

BGP协议学习理解

1、概述

BGP协议是“外部网关协议(BorderGatewayProtocol)”的简称,他是一个运行在AS(自治域系统)级别上的协议,负责处理不同AS之间的路由学习。

由于他承担的是不同AS之间的路由的学习和维护,因此BGP协议在很多特性上与负责处理AS内部路由的“域内路由协议(IGP)”,如:

RIP,OSPF等不同。

它适用于ISP,网络访问提供者以及那些拥有很多网络以至于IGP不能有效进行网络信息路由的大型网络环境。

2、协议简介

BGP协议是一个“路径矢量协议”,与“距离矢量协议”不同,在“距离矢量协议”中,到目的网络的所有与路径相关的信息都集中在“度量制式”值里,得到路由更新的路由器,只知道到达目的网络的“方向”和“距离”,这样不能很快地发现环路。

而“路径矢量协议”在路由信息中都携带有中传网络(AS)从源站点到目的站点的全部AS列表。

只要某个中转AS在列表里出现了两次,就说明出现了环路,这样的环路保护算法很简单。

图1

如上图,1.1.1.0/24是AS_100中的一个网段,当BGP路由器将此网段向AS外通告时,都会在路由更新信息中加入本自治系统的AS号。

如果出现环路,如上图,RT_3又将1.1.1.0/24的路由信息通告给RT_1(回到了AS_100),那么RT_1发现path中已经包含了自己的AS号,就知道成环了,于是忽略来自RT_3的关于1.1.1.0/24的路由更新信息。

我们也注意到,在BGP中是按AS进行路由的,而不是按网段来路由,在BGP中,是以AS号(而不是特定的IP地址)作为到达目的地的路径。

这也更加明确了BGP是一个AS层面上的路由协议。

运行BGP的路由器,又称为BGP发言者(BGP_Speaker),每个BGP路由器只能属于一个AS,也就是说一个路由器上只能起一个BGP实例。

这是因为自治系统之间是以网段作为分界点,而不是像OSPF的area那样是以路由器作为分界点。

BGP协议路由信息的通告和OSPF类似,都是先要与将要进行路由信息交换的对端路由器:

BGP对等体(BGP_peer)建立邻居关系,但BGP协议本身并没有采用像OSPF那样的Hello协议来动态处理邻居关系建立的机制,BGP的邻居关系是需要由管理员手工进行配置的。

BGP运行于TCP之上(端口179)。

通过一个可靠的传输协议(TCP)来交换连通性信息有很多优点,比如,将所有的“差错控制”功能都交给TCP来处理后,BGP本身就比较简单了:

既没有必要去设计复杂的差错恢复机制,也没有必要把BGP报文做成与IP数据报一样大,一切都由TCP来处理。

但缺点也显而易见,邻居的TCP连接都需要手工配置,当邻居非常多时,配置起来很麻烦,BGP制定有相应的解决措施,会在后面介绍。

BGP邻居分为两种,EBGP邻居和IBGP邻居;如果你和你的邻居在同一个AS内,你们之间就是IBGP邻居(InternalBGP),若你和你的邻居分别处在不同的AS,那么你们之间就是EBGP邻居(ExternalBGP)。

图2

如上图,RTA和RTB之间是IBGP邻居关系,RTB和RTC之间是EBGP邻居关系。

一般EBGP邻居之间要求是“直连”的,而IBGP邻居之间的TCP连接不一定要求是“直连”,就是说IBGP邻居之间的连接是可以跨三层的,它实际是一个逻辑连接。

如下图:

图3

如上图,两个BGP邻居之间是跨越了一个RIP网段和一个OSPF网段,但只要对端可达(通过动态路由或静态路由都可以),邻居就可以建立起来。

一旦邻居可达,BGP就可以通过协议报文来交互路由信息了。

BGP协议共有4中类型的报文:

Open:

Open报文的主要作用是参数协商。

KeepAlive:

KeepAlive报文主要是用于确定对端仍是“活”(active)的。

Update:

Update报文主要是交换路由信息。

Notification:

Notification消息在探测到错误情况时发送,发送之后BGP连接要立即

关闭。

这样做可以使问题被阻断在本地,而不致扩散。

下面说一下这4种报文的格式和所携带的信息:

首先说一下BGP报文的报文头,BGP报文头19个字节长,长度域最少是19,最多不能超过4096。

BGP报文的格式在RFC1771中有详细定义。

Open报文:

Open报文的作用是发起并完成邻居协商。

Open报文首先包括Version字段,他是由一字节的无符号整数指示的协议版本号信息,当前的BGP版本号是4。

如果你的邻居运行的是一个较早的BGP版本,如版本3那么它就会拒绝掉你发送的版本4的Open消息,版本较高的一方降一个版本,再发,直到双方版本协商一致。

随后的是MyAutonomousSystem字段,是2字节无符号整数,指示出发送者的自治系统号(AS号)。

再后面是HoldTime(保持时间)字段,他是两字节的无符号整数,指示了本端期望的Hold计时器的秒数。

当对端收到Open报文后,就要用收到的Open报文中的Hold定时器值和自己本机上设定的Hold定时器值,进行比较,取较小的值作为有效值,Hold计时器必须是0(无限大)或最少3秒。

当在HoldTime这么长的时间里,都没有收到对端发来的KeepAlive报文,就说明和对端已经断掉了。

BGP是这样的,当邻居建立起来以后,就把整个路由表交换一次,以后只有当路由信息发生变化时,才交换变化的部分,没有定期的路由交换机制,在BGP的RFC1771上明确说明:

BGP不使用任何基于传输协议的keep-alive机制来确定对端是否可达,因此它引入自己的keep_alive报文,通过周期发送和接收keep_alive报文来确定对端BGP可达,通常HoldTime是keep_alive报文发送周期的三倍。

再后面是BGPIdentifier(BGP标示符)字段,他是4字节无符号整数,指示了BGP发言者的标示符。

实际就是router_id,你可以手工制定一个IP来作为router_id,Cisco的一般用最大的Loopback_interface的IP来做router_id,若没有配置Loopback接口,就使用物理接口上最大的IP来作为router_id。

随后是OptionalParametersLength(可选参数长度)和OptionalParameters(可选参数)字段。

如果你的邻居认为收到的Open报文是可以接受的,协商成功。

就发一个KeepAlive报文作为回应。

KeepAlive报文:

BGP不使用任何基于TCP的keep-alive机制来确定对端是否可达。

相反,他使用周期性地发送KeepAlive报文的形式来确定连接是否还“活着”。

合理的最大两个KeepAlive消息之间的最大发送间隔是HoldTime计时器值的1/3。

KeepAlive消息必须不能比每秒一个更频繁。

如果议定的HoldTime间隔是0,周期性的KeepAlive消息必须不发送。

当然,在实际应用中是不推荐的。

KeepAlive报文只包含消息头,长度是19字节。

当然KeepAlive报文也有另一个用途,如上面说的,它可以作为对接受Open协商的回应。

Update报文:

UPDATE消息用来发送路由信息到BGP对端。

UPDATE消息报内的信息可以被用来构造AS之间的关系描述。

它包括通告更新的路由信息,路径信息,通告要撤销的路由信息。

Notification报文:

在BGP发言者探测到错误情况时发送Notification报文。

发送之后BGP连接要立即关

闭。

Notification报文所指示的错误码和错误子码在RFC1771有完全的定义。

3、BGP特性简介

3.1network:

在IGP中配置network的意思是,将要在这个网段上运行路由协议。

比如RIP,在RIP协议中配置network1.1.0.0/16的意思是,要在这个网段(直连网段)上运行RIP协议。

而在BGP中配置network却不是这个意思。

在BGP中这表示BGP协议将向外(他的BGP邻居)通告这个网段。

3.2ebgp_multihop<到HoldTime达非直连对端的跳数>:

我们前面说过,EBGP邻居之间一般要求是直连的,但很多时候,EBGP邻居的对端接口不一定是直连的,比如,我们和对端路由器上的一个loopback接口建立BGP连接。

对端的Loopback接口当然不是和我们本端的接口直连的。

这时就要用ebgp_multihop参数来说明,对端的BGP邻居接口不是直连的,当然除了用ebgp_multihop参数说明,你还要保证对端BGP邻居接口是可达的(通过IGP路由或静态路由),否则建立不起来BGP连接。

图4

如上图,RTA的接口1.1.1.2和RTB的接口2.1.1.2之间建立BGP连接,显然他们之间是非直连的。

在缺省情况下,发往EBGP邻居的BGP信息分组的IP包的TTL为1,如果EBGP邻居不是直连的,那么处在路径上的第一台路由器(RTC)就会将这个TTL为1的分组丢弃。

那么就要求在设置邻居接口时,用ebgp_multihop<到达非直连对端的跳数>参数表示对端的这个接口是非直连的,并指明到达非直连对端的跳数(如果没有指明默认就是255跳,足够了)而且要保证对端BGP邻居接口可达。

3.3Backdoor(后门):

如下图:

图5

上图中,RTA通过RTB学到一条AS内的1.1.0.0/16的网段路由,又通过RTC学到一条AS外的1.1.0.0/16网段的路由。

一般情况下,EBGP路由的管理距离为20(IBGP路由的管理距离为200),EBGP路由比一般的IGP路由的优先权都要高,于是RTA会把目的地为1.1.0.0/16网段的流量向AS外转发,但在某些情况下,你可能更愿意“相信”AS内的这个1.1.0.0/16网段。

这时,你可以通过改变EBGP或IGP的管理距离,来使AS内的1.1.0.0/16网段被选中,但因为一条路由而改变整个协议的管理距离,代价太大。

为了方便应付这种情况,于是就产生了设置Backdoor网段的应用。

命令networkbackdoor,是指明,x.x.x.x/M网段是一条后门网段,这个网段被BGP当作是一个本地网段,我们前面说过network命令,是把x.x.x.x/M这个网段通告出去,而networkbackdoor命令不会把x.x.x.x/M通告出去。

Backdoor比较方便,配置Back_door后,如果在什么时候,你又想要选择AS外的那条路由,撤销这个后门就可以了。

4、BGP路径属性

“路径属性”顾名思义,BGP是一个“路径矢量”协议,路径属性就是用来对路径的特征进行描述的属性。

除了提供基本路由功能的必须信息(目的IP和下一跳),路径属性允许BGP设置和互通路由策略。

BGP利用属性做出应该把什么样的路由插入路由表的决定,这些描述包括优先选择,AS数以及可以让BGP用来做出决定的其他方面的信息。

路径属性是BGP选路和路由策略的重要依据。

路径属性分为如下4种:

1>公认必选(强制)。

2>公认可选。

3>任选可透传。

4>任选非可透传。

公认必选属性是所有BGP实现所必须能够识别的,公认必选属性是路由信息中强制携带的,如果在路由信息通告中没有携带,就被认为是一个不合法的路由通告信息,而不被接受。

公认属性都是可透传的。

目前在RFC1771中定义了三个强制(公认必选)属性:

Origin,AS_Path,Next_Hop。

可以看出这是一条BGP路由信息所必备的基本属性,Origin说明路由来源的属性;AS_Path是这条路由通告经过的路径信息,前面我们讲过,BGP就是靠AS_Path来确定下一跳并防止环路的;Next_Hop指明到达目的地的明确的下一跳信息。

4.1Origin属性

首先说一下Origin属性,它定义了路径信息的来源,包括如下几种源:

1.IGP(学到的路由信息是BGP对端通过network命令通告的,其源就是IGP)

2.EGP(学到的路由信息是通过EGP学到的,其源就是 EGP)

3.Incomplete(学到的路由是BGP对端通告的重分布到其BGP中的路由,其源就是

Incomplete)

这三种源包括了BGP路由信息的三种基本来源,对于不同来源的路由信息,BGP有其不同的“信任等级”。

当出现多条关于同一网段的路由通告时,BGP会将Origin属性作为一个优选路由的因素。

最高可信的是IGP,BGP路由器通过network命令通告出去的路由,其Origin属性就是IGP,BGP认为通过network通告的路由,其源对于BGP是“可知”的,这一点很重要,因为BGP是一个AS层面上的协议,BGP没有给出每一个AS内拓扑的细节,它只看到AS的拓扑。

大多数情况下,它只知道目的网段在那个AS中,至于在AS内如何真正到达目的地BGP是不太了解的,通过network通告出去的网段,BGP对他的源是有确定把握(至少认为是有把握)的,所以它被认为是首选。

第二可信的是EGP,也就是从EGP邻居学来的路由,EGP是BGP之前负责在AS之间进行路由的协议,现在大多数情况下,它已被BGP所取代,但不管怎么说,它也是和BGP运行在同等层面(AS层面)上的协议,BGP将它作为二选。

最低可信度的是,从IGP重分布到BGP中,BGP又将它通告出去的路由。

将IGP路由引入到BGP中,同时也就把IGP的所有不确定因素反映到了BGP中,BGP对与这样的网段的真正可达性的获得是“二手”的(通过IGP获得),它再把他们通告出去,就是“道听途说”,BGP通过重分布学习到的路由无法确定路由的初始源,因此这样的路由的源信息被认为是Incomplete(不完整的)。

即使将静态路由(我们认为最可靠的路由)重分布到BGP中,源也是Incomplete。

比如,BGP从三个源收到三条关于1.1.0.0/16网段的路由信息通告,他们的Origin属性分别是IGP,EGP和Incomplete。

那么BGP当然是首选Origin属性是IGP的路由信息,将它置入路由表中。

4.2AS_Path属性

BGP用AS的顺序号来描述到达目的网络的路径上经过的AS。

BGP将Update消息发送给处在另外一个AS中的对等体时,BGP就将自己的AS号附加到AS_Path中。

也就是说,只有在EBGP邻居之间公布路由时,AS号才会被附加到AS_Path中,在IBGP对等体之间公布路由时,由于双方都在同一个AS内,不附加AS号。

前面我们讲到,BGP的环路避免机制是在AS层面上的环路避免机制,它的AS号是用来在AS间,检测环路在AS内就无能为力。

在AS内没有动态的环路避免机制,就在拓扑结构上消除环路。

于是BGP就要求所有的IBGP对等体之间,必须是全网状连接,并且只通告和学习而不向其他人“转发”学到的路由信息。

AS路径附加:

通常情况下,一个AS的AS号只会在BGP报文的AS_Path列表中出现一次,但有些情况下一个AS的AS号也许会在AS_Path列表里被添加不只一次。

如下图:

图6

假设左边的链路都是GE口,是AS_100接入Internet的主链路,而右边的链路都是FE口,是备用链路。

当AS_100中的网段(如:

1.1.0.0/16)访问Internet时,“出流量”可能是选择走主链路(如图蓝线所示),但是当Internet的流量进要发往AS_100时,由于point_2得到的路由更新信息中AS_Path较短,于是“入流量”会选择走经过AS_300的路径(如图中红线所示)。

这样就会出现流量不均衡。

流量不均衡会带来很多问题,BGP制定了一个方法来影响入流量的选择:

AS路径附加。

AS_100在发往AS_300的报文的AS_Path列表中,多次加入自己的AS号,来使得通过AS_300到达本AS的路径显得更长一些。

入下图:

图7

当RTA向AS_300通告路由时,在AS_Path列表里将自己的AS号添加多次,这样对于Internet来说,从point_1得到的1.1.0.0/16(AS_100内的网段)AS_Path是201,200,100;而从point_2得到的1.1.0.0/16网段的AS_Path是300,100,100,100显然比201,200,100“长”。

于是到1.1.0.0/16的流量会选择“较短”的路径,这样对于AS_100来说就不存在流量不均衡的问题了。

4.3NEXT_HOP属性

Next_hop属性描述了到达公布的目的网段的下一跳IP地址。

对于路由更新信息中携带next_hop信息,最典型的应该是RIP_v2。

在RIP_v2的路由更新信息中携带的next_hop必须是直接的下一跳(immediately_nexthop),而在BGP中,由于BGP邻居之间多处情况下并非直连,而是逻辑连接,因此BGP报文中的Next-hop属性有可能并非是直接的下一跳,更有可能不是邻居路由器的IP地址。

通常,next_hop属性的设置分为三种情况:

1>如果向EBGP邻居公布BGPUpdate,Next_hop属性就是发送通告的路由器的接口IP地址。

如下图:

图8

当AS_200中的RTA向RTB通告1.1.0.0/16网段的路由时,Next_hop属性就是10.1.1.2。

不管RTA在AS_200中的IBGP邻居将1.1.0.0/16网段通告给RTA时,Next_hop是怎样的值,当RTA向EBGP邻居通告时,就会将其Next_hop改为10.1.1.2,通告出去。

2>如果向IBGP邻居公布BGPUpdate,并且公布的网段信息也是本AS内的,那么Next_hop属性就是发送通告的路由器的接口IP地址。

如下图:

图9

上图中,当RTA向他的IBGP邻居RTC通告本AS内的网段路由信息时,Next_hop是2.1.1.1,

由于RTA和RTC之间的IBGP是逻辑连接(TCP连接),并非直连,Next_hop2.1.1.1对于RTC来讲是非直连的“下一跳”。

这种情况下,当有RTC要把发往1.1.0.0/16网段的数据报转发到目的地,就要执行一个“叠代查找”(循环查找)的过程,即首先查找1.1.0.0/16的下一跳,由于2.1.1.1并非直连的IP地址,于是继续查找2.1.1.1的下一跳,当然对于2.1.1.1的可达信息还要依赖于从IGP得到,直到查找到直接下一跳3.1.1.1,就将数据包发送到RTB的3.1.1.1/24接口上。

从这个例子可以看到,IBGP对于IGP是有相当程度的依赖的。

3>如果向IBGP邻居公布BGPUpdate,并且公布的网段信息是其他AS的,那么Next_hop属性就是发送通告的EBGP对等体的接口IP地址。

如下图:

图10

上图中,当RTA向他的IBGP邻居RTC通告AS域外的网段1.1.0.0/16时,其Next_hop仍是10.1.1.1。

这就带来一个问题,由于10.1.1.1是一个AS域外的IP地址,因此通常情况下IGP无法对这个下一跳提供可达信息。

对于这种情况有3种解决办法:

1>在每个IBGP邻居上配置到AS域外下一跳的静态路由,显然这个方法不太实际。

2>在外部接口(如10.1.1.0/24)上以被动模式运行IGP,它不向外通告IGP路由,只接收对端IGP的路由信息;但反过来讲,对端也可能是这样想的,于是对端也在它的外部接口上运行被动模式的IGP,那么谁也不向外通告,却都等待对端发来的IGP通告,显然也是行不通的。

3>使用配置选项:

next_hop_self。

当使用Next_hop_self配置后,当RTA向IBGP邻居RTC发送AS域外的网段通告时,会把Next_hop更改为本地接口的IP地址。

Local_Preference属性

Local_Preference属性是一个公认可选属性,只在IBGP邻居之间的路由更新信息传递,不会传递到AS外,也就是说不会传递给他其的AS。

当到一个AS域外的目的地,有多条路由通告时,BGP路由器对路由信息的Local_Preference属性进行比较,选择最佳的“出口路径“。

较高的Local_Preference值,代表优选。

如下图:

图11

上图中,假设AS_200对于AS_100内的用户来说是主选ISP(ISP_1)所在的AS,AS_300内的ISP_2是备选。

我们希望AS_100内访问Internet的流量通过ISP_1进行转发,但对于AS_100内的路由器来说,从AS_200和从AS_300通告过来的路由有等长的路径长度,无法区分优劣。

于是就要用Local_Preference属性来进行比较。

在RTA上进行设置,使得RTA在通告路由更新时,将Local_Preference属性设置为200,而RTB在通告时将Local_Preference设置为100。

当RTA和RTB的IBGP邻居RTC分别从两个邻居得到AS域外网段1.1.0.0/16的通告时,路径长度相同,比较Local_Preference属性值,较高的作为优选路由,于是将选择RTA通告的路由,下一跳就会是RTA。

可以看到,这个人为设置的值,在本AS域内的传递,只会影响从AS内部到AS外的流量走向,如果对AS域外到本AS内的入口点选择进行影响,就要用到MED属性。

4.4Multi_Exit_Discriminator(MED)属性

Multi_Exit_Discriminator(MED)属性是一个任选非可透传属性,MED属性在发往EBGP邻居的路由更新信息中携带,到达对端AS后,在对端的IBGP对等体之间传递,不会被传到另外的AS,也就是说会在“一对“AS之间传递,不会传递到第三个AS。

MED是一个度量值,越小代表“距离”越短,因此较小的MED值代表优选。

如下图:

图12

AS_100和AS_200之间有两个接口点,其中GE链路作为主链路,FE链路作为备选链路。

当RTA在向EBGP邻居通告AS域内的1.1.0.0/16网段时,将其MED值设置为10,RTB在向其EBGP邻居通告1.1.0.0/16网段时,将其MED值设置为100。

从RTA和RTB收到的关于AS_100内网段的MED值,会在AS-200内的IBGP对等体之间传递(但这个MED值不会再被传到AS_200以外)。

这样,AS_200中去往1.1.0.0/16网段的流量就会选择经RTC,RTA到达AS_100域内的路径(GE链路)。

如果到达同一目的地的两条路径分别来自不同的AS,默认情况下是不会对MED属性值进行比较(来选取优选路由)的。

MED一般只对到单一AS有多个接口点(不跨AS)的情况有意义。

在实际中,对于MED属性值的比较不一定限于同一AS,当进行了

bgpalways_compare_med配置后,可以对于来自不同AS的路由信息的路径MED属性进行比较。

4.5Community(团体)属性

Community(团体)属性是一个任选非可透传属性。

“团体是共享相同特性的一组目的的。

”——RFC1997。

Community(团体)属性在执行路由策略的时候作为判据。

不同的Community(团体)属性就像是不同的“旅游团”,发往对端的路由更新就是团员。

这样,“出发”时说明某(些)条路由属于某个“旅游团”,接收路由更新的路由器就可以根据团体属性的值进行不同的策略。

根据团体属性值,实现路由策略,就可以一次对一组路由使用相

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > IT计算机

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1