BGP知识点整理

BGP介绍

边界网关协议BGP(Border Gateway Protocol)是一种实现自治系统AS(Autonomous System)之间的路由可达,并选择最佳路由的路径矢量路由协议。目前在IPV4环境下主要使用BGPV4,目前市场上也存在BGPV4+,BGPV4+在BGPV4的基础上支持多个地址族,如IPv6。

BGP协议本身不产生路由,而是转发本地路由表中来自其他协议生成的路由条目;AS之间正常存在大量的BGP邻居关系,且BGP协议不会计算最佳路径;因此在BGP协议中管理员需要进行策略来干涉选路

AS-自治系统

AS(自治系统),由单一的机构或组织所管理的一系列IP网络及设备所构成集合。

划分AS的原因:1.整个地球上的网络范围太大,单个网络收敛很慢且网络延迟大;2.每个网络可能是某个组织或公司组建的,他们并不想将自己辛苦组建的网络交给别人管理,所以需要自治管理

为了方便对自治系统进行管理,给每一个自治系统设计了一个号,即AS号。AS号由16位二进制构成,取值范围:0 - 65535,其中1 - 64511号为公有AS号, 64512 - 65534被设定为私有AS号。

因为传统的AS号存在不够用的情况,所以,目前大部分设备均支持拓展的AS号,由32位二进制构成。中国由于加入互联网较晚,所以中国的AS号大多都是扩展AS号。

BGP原理概述

想要AS之间互相通信,我们可以使用重发布,通过重发布将AS的路由信息导入到其他AS以达到AS间的互通,和重发布类似,BGP也是通过发送AS的路由信息以实现全网可达。那为什么AS间更多的是使用BGP而不是重发布呢?

BGP和重发布的区别

重发布要求AS间需要有ASBR,ASBR同时具有两个AS的路由信息,通过ASBR实现路由共享;而BGP是没有ASBR的,由于AS是自治系统,如果有ASBR,那这个ASBR归谁管理?如果只归一方管理,那他可以通过路由策略提高自己AS的流量的转发速度,所以BGP是AS间各出一个或多个运行BGP的路由器,让这些运行BGP的路由器建立邻居关系后交换路由信息。

重发布在导入路由时会洗掉开销值,会造成选路不佳的问题,而BGP具备强大的路由策略,BGP为路由信息设计了路径属性,通过属性进行选路,是的选路过程更加灵活,可控性更高。

BGP特性

BGP协议是无类别的路径矢量协议。无类别即BGP在传递路由时会携带子网掩码;路径矢量,不同与距离矢量,路径矢量是以一个AS为单位,而距离矢量是以一个路由为单位,距离矢量是一种路由算法,而BGP不需要计算路由,它只需将以计算好的路由传递给了邻居即可。

我们对IGP(内部网关协议)和EGP(外部网关协议)的要求不同,IGP需要在一个AS内计算路由,所以我们要求IGP选路佳、收敛快、占用资源少;而EGP不同,EGP协议只需传递AS以计算好的路由,所以我们对EGP的可控性、可靠性要求更高。

EGP的追求:可控性: AS之间需要传递大量的路由信息,所谓可控,就是可以更方便的干涉选路,更容易做策略,以弥补重发布的不足。为了保证路由传递的可控性,更方便干涉选路,BGP协议舍弃了开销值,取而代之的是他为路由信息设计了很多路径属性。可以通过属性进行选路,是的选路过程更加灵活,可控性更高。

EGP的追求:可靠性:BGP协议设备间需要交互大量的路由条目,但又不能选择周期更新来占用链路资源,故只能进行触发更新;又为了保证传输的可靠性,直接选择TCP协议作为传输层的协议来完成数据收发,使用的是TCP 179号端口。但使用TCP协议通讯也会造成一些问题,传输效率降低,只能单播通讯(TCP需要去建立会话),占用资源会加大 ,用TCP之后,便不能通过广播或者组播去自动发现邻居进行通信了。

由于BGP依靠TCP协议传输数据,BGP协议可以实现非直连建邻,非直连建邻的前提条件是邻居双方网络可达, BGP的非直连建邻是建立在IGP的基础上。

BGP的邻居更准确的说是BGP的对等体,我们可以根据邻居关系的建立情况,将BGP的邻居关系分为两种:

因为EBGP对等体之间一般采用直连建邻的方法,所以,我们将EBGP对等体之间的数据包中的TTL值设置为1;而IBGP对等体之间往往需要非直连建邻,所以,IBGP对等体之间的数据报中的TTL值我们设置为255;当然,如果EBGP对等体之间需要非直连建邻,则需要手工修改TTL值。

EGP的追求::AS-BY-AS:BGP将一个AS作为一个单位来看待,以一个AS为一跳,

BGP特点总结

无类别路径矢量 -----距离矢量的升级版---AS--BY--AS

使用单播更新来发送所有信息;基于TCP 179端口工作

增量更新,仅触发更新,无周期更新

具有丰富的属性来取代IGP中度量进行选路,有多个参数控制协议

可以在进项和出项对流量实施强大的策略,可控性非常强大

默认不被用于负载均衡-----通过各种选路规则仅仅产生一条最佳路径

BGP支持认证和聚合(将现有的IP地址合并成较大的、具有更多主机地址的路由域)

BGP的数据包

BGP协议中所有的数据包均需要在tcp会话建立后,基于TCP的会话来进行传输及可靠性的保障。

Open包

Open包主要用来建立邻居关系,正常进收发一次即可,Open包会携带一些建邻需要协商的参数,邻居互相认同对方的参数才可以建立邻居关系。以下为Open包会携带的一些参数:

AS号:在手工建立邻居关系需要时声明邻居的AS号。对端收到后会检查声明的AS号是否和本地的AS号一致,一致才可以建立邻居关系。

认证:BGP在建邻时如果做认证的话,需要比对双方认证口令,不一致则无法建立邻居关系。

Router-ID:主要区分和标定路由器。OPEN报文中携带RID的目的是为了确保双方的RID不一致。确保其唯一性,如果相同,则无法正常建立邻居关系。

这里的RID和OPSF的格式一致,也是由32位二进制构成,并且遵循IP地址的格式。也可以通过两种方法获取,一种是手工配置;另一种是自动获取(先在自己路由器的环回接口中选择最大的IP地址作为RID,如果没有环回接口,则在自己物理接口中选择IP地址最大的作为RID)。

注意:在接收邻居数据包时,其中的源IP地址和手工指定的邻居的IP地址一致才可以正常建立邻居关系。

holdtime:保活时间, 这个参数默认值为 180S,即180S内若收不到对方发送的keeplive或者UPdate包则将判定BGP链接中断。双方建邻时携带这个值,但是并不要求必须相同。但是,执行时必须相同,所以,将会选择二者中较小的作为执行时间

keeplive包

用来保活邻居关系,默认周期1min查询邻居关系是否存在;实际保活TCP会话。

Keeplive报文的发送周期为保活时间(hold time)的1/3,保活时间默认为180S,则周期发送时间默认为60S。

KeepLive包还有一个作用:在收到对方发送的OPEN报文后,临时充当确认包的作用。

TCP本身具有确认机制,可以确保传输的可靠性,这里的确认主要是确认OPEN报文中携带的参数,如果认同对方的参数,则将回复Keeplive包进行确认。

Update包

BGP中的更新包,用来携带路由条目,包括目标网段,子网掩码信息以及BGP的各种属性

在UPdate包中存在撤销路由字段,我们可以直接将不可达的路由信息放在该字段下进行通告,以达到传递失效信息的目的。而不需要像RIP那样采用带毒传输的方式。

Notification包

BGP设计的一个告警机制,出现错误数据时收发,当BGP检测到一个错误的时候,将会用这个包进行告警,告知对端错误点在哪

Route-refresh包

用于改变路由策略后请求对等体重新发送路由信息,前提是对等体双方均支持路由刷新

BGP的状态机

BGP的状态机仅描述BGP对等体建立过程中的状态变化。因为BGP可以做到建立邻居关系和发布路由分开完成。

idle状态:空闲状态,一旦指定邻居,就处于idle状态,然后BGP会首先检查指定的IP地址在本地路由表中是否可达,如果可达,则开始尝试建立TCP会话,进入下一个状态;如果不可达,则将停留在idle状态

connect状态: 进行TCP会话连接的状态。如果TCP会话建立成功,则进入下一个状态;如果TCP会话建立失败,则进入Active状态,该状态会反复尝试TCP连接,如果尝试超时,则放弃重连,退回到idle状态。

注意:在建立TCP会话连接时,双方都会尝试建立连接,一方建立成功,则将创建一个双向的TCP会话通道;双方都建立成功,则将会出现两个双向通道。则需要关闭一个TCP通道。后面开始发送OPEN报文,其中会携带RID,双方将比较RID,仅保留RID大的一端发起的TCP连接,RID小的一端发起的TCP连接通道将被断开。

OpenSent: 开始发送OPEN报文,报文中携带建立邻居关系所需的参数。当收到对端发送的OPEN报文后,并且报文里的参数没有问题,则将回复一个keeplive作为确认,进入下一个状态;

OPENConfirm:在该状态,本段在等待对端keeplive包,当对端收到本端的Open报文且确认参数无误,发送keeplive包进行确认进入下一个状态。

Established : 建立完成状态 ,标志着对等体关系的建立。

BGP的工作过程

配置完成后,邻居间单播TCP三次握手,目标端口179,建立TCP的会话;之后所有的BGP协议数据包基于该会话进行传输

会话建立后,邻居间正常收发一次open报文,并互发keeplive包进行确认建立BGP的邻居关系,并生成邻居表

邻居关系建立后,默认每1min,使用keeplive周期保活邻居关系,周期保活TCP会话

邻居关系建立后,管理员选择性将本地路由表中通过任意来源获取的路由条目,向BGP协议中进行宣告;使用updata数据包进行邻居间路由共享;之后生成BGP表;

本地对BGP表中的路由进行选择,默认将最优路径加载于路由表中(最优-仅仅基于BGP的选路规则,不一定为最佳路径;BGP默认不支持负载均衡)

若出现错误信息,邻居间将使用Notification报文进行报错操作

收敛完成,仅keeplive周期保活即可,默认保活时间为180S,周期发送时间为60S。

若发生结构突变,则将直接发送UPdate报文进行触发更新。

BGP的路由黑洞

AS间通过EBGP对等体交换路由信息,然后通过单播将获取到的路由信息发送给IBGP对等体,使AS所有运行BGP的设备拥有了所有AS的路由信息,如下:R3从R1学到AS100的1.0.0.0/8的路由信息,然后通过单播传给R7,R7传给R2,所有AS内运行BGP的路由器都学到了1.0.0.0/8的路由信息

矢量协议的特点是谁发给我这条路由,我到这条路由就找谁,如果R7想ping1.0.0.0/8,那R7就会将ping包发送给R3,由R3转发。在R7发送ping包时,它首先查看路由表查找R3的位置,假设R7通过R4找R3,那R7就会将ping包发给R4,当这个ping包来到R4上,R4看二层是找自己的,解封装看三层,发现这个ping包的DIP为1.0.0.0/8网段的,但R4上没有运行BGP,没有收到关于1.0.0.0/8网段的路由信息,所以R4就会把这个ping包丢弃,虽然R7上有1.0.0.0/8的网段路由信息,但无法与R1通信,这就是BGP的路由黑洞。

BGP的路由黑洞:由于BGP协议可以非直连建邻,故可能出现BGP协议跨越未运行BGP协议的路由器,导致BGP路由传递后,显示控制层面可达,但是,数据层面,流量经过未运行BGP协议的路由器时,无法通过,形成路由黑洞。

解决路由黑洞

AS内的设备全部运行BGP:既然路由黑洞是未运行BGP协议的路由器导致的,那就让AS内所有的设备都运行BGP获取路由信息。但这个方法是不现实的,可以承载越多路由信息的路由器其价格也就越昂贵,每一台运行BGP的路由器需要承载所有AS的路由信息,可以承载世界上几万几十万的路由信息的路由器价格也是上百万的,所以,是不可能让AS内的设备拥有全部路由信息的。

AS内运行BGP的设备将从BGP重发布到AS内运行的IGP协议里:通过重发布将BGP所有路由导入到IGP协议里,同样需要AS内所有设备可以承载所有AS的路由信息,同第一条一样不现实。

物理、逻辑拓扑全连:直接让AS内运行BGP协议的所有设备互相连接,使IBGP间通信不需要经过未运行BGP协议的设备,但由一个AS地理范围可能很大,IBGP间距离较远,所以使用真实链路连接IBGP也不现实,所以我们可以用GRE/MGRE等vpn技术,通过虚拟链路连接IBGP对等体

MPLS:当前工程中主要使用的解决BGP路由黑洞方案,MPLS后续会讲。

BGP为了防止BGP路由黑洞的产生,提出了BGP同步机制:即当一台路由器从自己IBGP对等体学习到一条BGP路由时,他不能将这条路由通告给自己的EBGP对等体,除非他又从IGP协议中(包含静态路由)学习到这条路由。也就是要求IBGP路由和IGP路由同步。

同步要求将BGP路由重发布到IGP协议中,但我们已经说过这种方法并不现实,所以华为设备默认关闭同步机制。

注意:在目前我们的学习情况下,我们在做BGP实验时都是用第一种方法解决路由黑洞

BGP的防环机制---水平分割

EBGP水平分割

下图中有三个AS,其中AS:1的一条路由信息传给了AS:2,AS:2将这条路由信息传给AS:3,如果AS:3又将这条路由信息传回给AS:1且AS:1将这条路由信息加表,就会导致路由环路。

BGP协议在路由条目中有一条专门记录所经过的AS编号的路径属性,在上图中AS:1发出的路由信息会携带编号1,AS:2将这条路由信息转发给R3时,添加编号2;AS:3将这条路由信息转发给AS:1时,也会添加编号3;最终AS:1收到这条路由信息的AS_PATH属性记录了1、2、3,R1发现该属性中有自己的编号则拒绝接受这条路由信息,避免环路产出。

IBGP水平分割

下图在AS:64513内,R2、R3、R4两两建邻,如果R2发布一条路由信息由R4到R3,再到R2,并且R3转发给R2的路由信息改变了R2的路由表,则会形成环路。

因为BGP的AS-BY-AS的特性,导致AS内部被认为是一个整体,在默认情况下,路由的属性是不会发生变化的,所以,无法通过属性来进行防环。

IBGP水平分割:当一个路由器从一个IBGP对等体出学习到某一条BGP路由时,他将不再把这条路由信息通告给其他的IBGP对等体。

IBGP水平分割可以有效的解决IBGP对等体之间路由回传造成的环路问题,但是,也会引发路由信息传递障碍问题。如下图中,如果R1学到其他AS的路由信息,它会将这些路由信息传递给R2,但由于IBGP水平分割,R2不能将这些路由信息传递给R3,R3就无法获取R1收集到的路由信息。

想要避免IBGP水平分割带来的问题,可以让所有AS内部运行BGP的路由器均建立IBGP对等体关系, 这种建立全连的IBGP对等体的方案并不是最佳解决方案,因为,当一个AS内运行BGP协议的路由器数量较多时,建立全连的邻居关系,将造成大量的资源浪费,并且降低网络的可扩展性。

BGP存在两个技术专门用于解决IBGP水平分割带来的问题:1.路由反射器,2.联邦。

相关推荐
UestcXiye2 天前
《TCP/IP网络编程》学习笔记 | Chapter 9:套接字的多种可选项
c++·计算机网络·ip·tcp
溟洵3 天前
【网络协议栈】网络层(上)网络层的基本理解、IP协议格式、网络层分组(内附手画分析图 简单易懂)
网络·网络协议·tcp/ip·ip
OkeyProxy3 天前
伺服器代理查找失敗的原因和解決方案
代理模式·ip·代理服务器·海外ip代理·proxypattern
UestcXiye4 天前
《TCP/IP网络编程》学习笔记 | Chapter 8:域名及网络地址
c++·计算机网络·ip·tcp·dns
UestcXiye6 天前
《TCP/IP网络编程》学习笔记 | Chapter 3:地址族与数据序列
c++·计算机网络·ip·tcp
Tony聊跨境6 天前
独立站SEO类型及优化:来检查这些方面你有没有落下
网络·人工智能·tcp/ip·ip
daqinzl6 天前
java获取机器ip、mac
java·mac·ip
xiaoxiongip6666 天前
HTTP 和 HTTPS
网络·爬虫·网络协议·tcp/ip·http·https·ip
IPdodo全球网络7 天前
如何在家庭网络中设置静态IP地址:一份实用指南
网络·tcp/ip·智能路由器·ip
蝌蚪代理ip7 天前
辩论赛——动态IP与静态IP的巅峰对决
网络·网络协议·tcp/ip·ip