BGP 协议原理 (a) BGP 协议基本概念:BGP 的作用和特点、BGP 邻居关系的建立和配置
文章目录
- 前提概念
- AS
- ASN
- IGP与EGP
- BGP的基本概述
- 基本作用
- BGP协议特点
- BGP邻居关系和配置
- 建立TCP连接
- BGP邻居类型
- BGP简单邻居关系配置
- 报文类型
- 邻居关系的建立
前提概念
AS
AS(Autonomous System):自治系统/路由选择域
AS是指由同一技术机构管理,使用同一选路策略的一些路由器的集合。
一般来说,一个公司、一个企业、一所大学就可以说是一个自治系统
AS内部使用IGP来计算和发现路由,同一个AS内部的路由器之间是相互信任的,因此IGP的路由计算和信息泛洪完全处于开放状态,人工干预很少。
不同的AS之间,使用EGP来进行通信。BGP作为EGP中的一种协议,用于在AS之间进行路由控制和优先
ASN
ASN:自治系统号
一个自治系统将会分配一个全局的唯一的16位号码,有时我们把这个号码叫做自治系统号(ASN)。
自治系统号由IANA分配,范围为:1-65535,最开始大小为2B(0~65535)。
自治系统号分为(可类比共有IP地址、私有IP地址)
公有ASN:1~64511
私有ASN:64512~65535
后来由于不够用,长度升级到了4B(45536~4294967295)
IGP与EGP
IGP:内部网关路由协议:
包含有:OSPF、RIP、IS-IS等
注重于发现和计算路由。执行在AS内部
EGP:外部网关路由协议:
包含有:EGP(目前不使用)、BGP:外部网络路由协议代表(目前AS间路由协议或者说的EGP协议一般都指的是BGP协议)
由于BGP的前身EGP由于设计简单,只能简单的传递路由信息,不会对路由进行优选,会造成环路等问题,所以就有了BGP代替了EGP。
BGP的基本概述
基本作用
)
AS之间的路由我们可以将一个AS看成一个大路由器
BGP协议特点
- 可靠的路由更新机制(有变化才发)(没有组播,只有单播的连接。建立在TCP之上。只有在路由信息发生更新的时候才会发送增量路由。不会释放掉TCP连接:keep alive机制,保证TCP连接不会断掉)(注意:建立BGP连接首先要建立TCP连接)
- 丰富的度量方式
- 避免环路
- 路由附带属性信息(AS之间的路由器是不完全互相信任的,为了实现路由按需求控制和优选,BGP设置了诸多属性)
- 支持CIDR、VLSM
- 丰富的路由选择和路由控制
- 增量更新计算
- 可以跨越多跳路由器建立邻居关系
BGP邻居关系和配置
建立TCP连接
BGP协议被设计运行在AS之间传递路由,AS之间是广域网链路,数据包在广域网上传递是可能出现不可预测的链路拥塞或丢失等情况,因此BGP使用TCP作为其承载协议来保证可靠性。
相当于TCP连接一直存在,BGP通过Keep alive机制(不断、定时发送keepalive报文)时TCP连接不会断掉
BGP使用TCP封装建立邻居关系,端口号为179,TCP采用单播建立连接,因此BGP协议并不像RIP和OSPF一样使用组播发现邻居。单播建立连接也使BGP只能手动指定邻居。(配置的时候需要自己手动指定邻居)
先看起BGP的一端发起TCP的连接。
TCP连接(三次握手)简单介绍:
一下图为例:RTB向RTA发起建立TCP连接请求,RTA收到之后,返回一个连接请求和确认消息,RTB收到之后返回一个确认消息。连接建立完成。
)
BGP邻居类型
)
BGP邻居类型分为两种:
EBGP(External BGP):运行在不同AS之间的BGP路由器建立的邻居关系为EBGP邻居关系
IBGP(Inter BGP):运行在相同AS内的BGP路由器建立的邻居关系为IBGP邻居关系
EBGP只用于不同AS之间传递路由。如图,AS 100内的RTB与BTC分别从AS 200与AS 300学习到不同的路由,怎么实现AS 200与AS 300之间路由在AS 100内的交换?
在AS 100内实现将学到的AS 200和AS 300路由进行交换,可以在拓扑中的RTB与RTC路由器上将BGP的路由引入IGP协议(图中为OSPF协议),再将IGP协议的路由在RTB与RTC路由器上引入回BGP协议,实现AS 200与AS 300路由的交换。
上述方法存在以下几个缺点:
公网上BGP承载的路由数目非常大,引入IGP协议后,IGP协议无法承载大量的BGP路由;
BGP路由引入IGP协议时,需要做严格的控制,配置复杂,不易维护;
BGP携带的属性在引入IGP协议时,由于IGP协议不能识别,可能会丢失。
因此我们用IBGP来邻居关系来解决上述问题:如上图,因为BGP使用TCP作为其承载协议,所以可以跨设备建立邻居关系。如图所示,RTB与RTC之间建立IBGP邻居关系,并各自将从其他AS学到的路由传递给对端,实现BGP路由在AS内的传递。
注意:建立IBGP邻居关系建立一般使用Loopback口IP地址,因为Loopback口为逻辑接口,且不会down,非常稳定,这样邻居关系一直处于稳定状态。EBGP邻居关系建立使用直连接口IP地址。
BGP简单邻居关系配置
)
第一步
搭建拓扑,规划网段并配置各个接口IP地址。
以RTB举例:
[RTB]int g0/0/0
[RTB-GigabitEthernet0/0/0]ip ad 10.1.24.2 24
[RTB-GigabitEthernet0/0/0]int g0/0/1
[RTB-GigabitEthernet0/0/1]ip ad 10.1.12.2 24
[RTB-GigabitEthernet0/0/1]int lo0
[RTB-LoopBack0]ip ad 22.22.22.22 32
[RTB-LoopBack0]quit
[RTB]
第二步
AS 100内部使用IGB:OSPF协议通信。配置OSPF协议
注意:不要忘记宣告Loopback接口所在网段。
以RTB为例其余路由器相同:
[RTB]ospf
[RTB-ospf-1]a 0
[RTB-ospf-1-area-0.0.0.0]network 22.22.22.22 0.0.0.0
[RTB-ospf-1-area-0.0.0.0]network 10.0.12.0 0.0.0.255
验证RTB环回口是否能与RTC环回口通信,若正确则进行下一步:
<RTB>ping -a 22.22.22.22 33.33.33.33
PING 33.33.33.33: 56 data bytes, press CTRL_C to break
Reply from 33.33.33.33: bytes=56 Sequence=1 ttl=254 time=40 ms
Reply from 33.33.33.33: bytes=56 Sequence=2 ttl=254 time=30 ms
Reply from 33.33.33.33: bytes=56 Sequence=3 ttl=254 time=30 ms
Reply from 33.33.33.33: bytes=56 Sequence=4 ttl=254 time=30 ms
Reply from 33.33.33.33: bytes=56 Sequence=5 ttl=254 time=30 ms
--- 33.33.33.33 ping statistics ---
5 packet(s) transmitted
5 packet(s) received
0.00% packet loss
round-trip min/avg/max = 30/32/40 ms
第三步
配置BGP邻居关系:
1. 配置Router ID:标识路由器
2. 配置EBGP邻居关系:AS之间传递路由
以RTB、RTD之间建立EBGP关系为例:
[RTB]
[RTB]bgp 100
[RTB-bgp]peer 10.1.24.4 as-number 200 //BGP邻居关系的类型主要靠配置的AS号区别,peer关键字后面是对端邻居的接口IP地址,as-number后面是邻居路由器所在的AS号,AS号相同则为IBGP邻居关系;AS号不同,则为EBGP邻居关系。
[RTD]
[RTD]bgp 200
[RTD-bgp]peer 10.1.24.2 as-number 100
第四步
配置IBGP邻居关系:
本例中RTB和RTC建立IBGP邻居关系(本例使用逻辑接口建立IBGP邻居关系):
[RTB]
[RTB]bgp 100
[RTB-bgp]peer 33.33.33.33 as-number 100 //AS号相同则为IBGP邻居关系
[RTB-bgp]peer 33.33.33.33 connect-interface LoopBack 0
[RTC]
[RTC]bgp 100
[RTC-bgp]peer 22.22.22.22 as-number 100
[RTC-bgp]peer 22.22.22.22 connect-interface LoopBack 0
[RTC-bgp]
额外提供直连接口配置方法:
[RTB-bgp]peer 10.1.12.1 as-number 100
查看邻居关系display bgp peer
:
以RTB为例:
[RTB]display bgp peer
BGP local router ID : 2.2.2.2
Local AS number : 100
Total number of peers : 2 Peers in established state : 2
Peer V AS MsgRcvd MsgSent OutQ Up/Down State Pre
fRcv
10.1.24.4 4 200 41 42 0 00:39:16 Established 0
33.33.33.33 4 100 37 37 0 00:35:27 Established 0
注意:此时BGP邻居关系已经建立,但是由于没有路由引入所以没有路由表,查看BGP路由表命令:display bgp routing-table
。路由引入命令下一遍文章介绍
报文类型
BGP通过报文的交互完成邻居建立、路由更新等操作,共有Open、Update、Notification、Keepalive和Route-refresh等5种报文类型。
Open报文:是TCP连接建立后发送的第一个报文,用于建立BGP邻居之间的连接关系。BGP邻居在接收到Open报文并协商成功后,将发送Keepalive报文确认并保持连接的有效性。确认后,BGP邻居间可以进行Update、Notification、Keepalive和Route-refresh报文的交换。
Keepalive报文:BGP路由器会周期性的向邻居发出Keepalive报文,用来保持连接的有效性。(该报文内容少,无意义,只是为了保证连接不中断)
Update报文:用于在BGP邻居之间交换路由信息。Update报文可以发布多条属性相同的可达路由信息,也可以撤销多条不可达路由信息。
Notification报文:当BGP路由器(BGP speaker)检测到错误状态时,就向邻居发出Notification报文,之后BGP连接会立即中断。
Route-refresh报文:Route-refresh用于在改变路由策略后请求对等体重新发送路由信息。
邻居关系的建立
lBGP路由器报文交互过程:
- Idle状态是BGP初始状态。在Idle状态下,BGP路由器拒绝邻居发送的连接请求。只有在收到本设备的Start事件后,BGP路由器才开始尝试与其邻居进行TCP连接,并转至Connect状态。
- 在Connect状态下,BGP路由器启动连接重传定时器(Connect Retry),等待TCP完成连接。
- 如果TCP连接成功,那么BGP路由器向邻居发送Open报文,并转至OpenSent状态。
- 如果TCP连接失败,那么BGP路由器转至Active状态。
- 如果连接重传定时器超时,BGP路由器仍没有收到邻居的响应,那么BGP路由器继续尝试与其邻居进行TCP连接,停留在Connect状态。
在Active状态下,BGP路由器总是在试图建立TCP连接。
- 如果TCP连接成功,那么BGP路由器向邻居发送Open报文,关闭连接重传定时器,并转至OpenSent状态。
- 如果TCP连接失败,那么BGP路由器停留在Active状态。
- 如果连接重传定时器超时,BGP路由器仍没有收到邻居的响应,那么BGP路由器转至Connect状态。
-
在OpenSent状态下,BGP路由器等待邻居的Open报文,并对收到的Open报文中的AS号、版本号、认证码等进行检查。
-
如果收到的Open报文正确,那么BGP路由器发送Keepalive报文,并转至OpenConfirm状态。
-
如果发现收到的Open报文有错误,那么BGP路由器发送Notification报文给邻居,并转至Idle状态。
-
在OpenConfirm状态下,BGP路由器等待Keepalive或Notification报文。如果收到Keepalive报文,则转至Established状态,如果收到Notification报文,则转至Idle状态。
-
在Established状态下,BGP路由器可以和邻居交换Update、Keepalive、Route-refresh报文和Notification报文。
下一篇: BGP 协议 路由规则
推荐阅读
-
go语言Socket编程-Socket编程 什么是Socket Socket,英文含义是插座、插孔,一般称之为套接字,用于描述IP地址和端口。可以实现不同程序间的数据通信。 Socket起源于Unix,而Unix基本哲学之一就是“一切皆文件”,都可以用“打开open –> 读写write/read –> 关闭close”模式来操作。Socket就是该模式的一个实现,网络的Socket数据传输是一种特殊的I/O,Socket也是一种文件描述符。Socket也具有一个类似于打开文件的函数调用:Socket,该函数返回一个整型的Socket描述符,随后的连接建立、数据传输等操作都是通过该Socket实现的。 套接字的内核实现较为复杂,不宜在学习初期深入学习,了解到如下结构足矣。 套接字通讯原理示意 在TCP/IP协议中,“IP地址+TCP或UDP端口号”唯一标识网络通讯中的一个进程。“IP地址+端口号”就对应一个socket。欲建立连接的两个进程各自有一个socket来标识,那么这两个socket组成的socket pair就唯一标识一个连接。因此可以用Socket来描述网络连接的一对一关系。 常用的Socket类型有两种:流式Socket(SOCK_STREAM)和数据报式Socket(SOCK_DGRAM)。流式是一种面向连接的Socket,针对于面向连接的TCP服务应用;数据报式Socket是一种无连接的Socket,对应于无连接的UDP服务应用。 网络应用程序设计模式 C/S模式 传统的网络应用设计模式,客户机(client)/服务器(server)模式。需要在通讯两端各自部署客户机和服务器来完成数据通信。 B/S模式 浏览器(Browser)/服务器(Server)模式。只需在一端部署服务器,而另外一端使用每台PC都默认配置的浏览器即可完成数据的传输。 优缺点 对于C/S模式来说,其优点明显。客户端位于目标主机上可以保证性能,将数据缓存至客户端本地,从而提高数据传输效率。且,一般来说客户端和服务器程序由一个开发团队创作,所以他们之间所采用的协议相对灵活。可以在标准协议的基础上根据需求裁剪及定制。例如,腾讯所采用的通信协议,即为ftp协议的修改剪裁版。 因此,传统的网络应用程序及较大型的网络应用程序都首选C/S模式进行开发。如,知名的网络游戏魔兽世界。3D画面,数据量庞大,使用C/S模式可以提前在本地进行大量数据的缓存处理,从而提高观感。 C/S模式的缺点也较突出。由于客户端和服务器都需要有一个开发团队来完成开发。工作量将成倍提升,开发周期较长。另外,从用户角度出发,需要将客户端安插至用户主机上,对用户主机的安全性构成威胁。这也是很多用户不愿使用C/S模式应用程序的重要原因。 B/S模式相比C/S模式而言,由于它没有独立的客户端,使用标准浏览器作为客户端,其工作开发量较小。只需开发服务器端即可。另外由于其采用浏览器显示数据,因此移植性非常好,不受平台限制。如早期的偷菜游戏,在各个平台上都可以完美运行。 B/S模式的缺点也较明显。由于使用第三方浏览器,因此网络应用支持受限。另外,没有客户端放到对方主机上,缓存数据不尽如人意,从而传输数据量受到限制。应用的观感大打折扣。第三,必须与浏览器一样,采用标准http协议进行通信,协议选择不灵活。 因此在开发过程中,模式的选择由上述各自的特点决定。根据实际需求选择应用程序设计模式。 简单的C/S模型通信 Server端:Listen函数 func Listen(network, address string) (Listener, error) network:选用的协议:TCP、UDP, 如:“tcp”或 “udp” address:IP地址+端口号, 如:“127.0.0.1:8000”或 “:8000” Listener 接口: type Listener interface { Accept (Conn, error) Close error Addr Addr } Conn 接口: type Conn interface { Read(b byte) (n int, err error) Write(b byte) (n int, err error) Close error LocalAddr Addr RemoteAddr Addr SetDeadline(t time.Time) error SetReadDeadline(t time.Time) error SetWriteDeadline(t time.Time) error } 参看 [<u>https://studygolang.com/pkgdoc</u>](https://studygolang.com/pkgdoc) 中文帮助文档中的demo: 示例代码:TCP服务器.go package main import ( "net" "fmt" ) func main { // 创建监听 listener, err:= net.Listen("tcp", ":8000") if err != nil { fmt.Println("listen err:", err) return } defer listener.Close // 主协程结束时,关闭listener fmt.Println("服务器等待客户端建立连接...") // 等待客户端连接请求 conn, err := listener.Accept if err != nil { fmt.Println("accept err:", err) return } defer conn.Close // 使用结束,断开与客户端链接 fmt.Println("客户端与服务器连接建立成功...") // 接收客户端数据 buf := make(byte, 1024) // 创建1024大小的缓冲区,用于read n, err := conn.Read(buf) if err != nil { fmt.Println("read err:", err) return } fmt.Println("服务器读到:", string(buf[:n])) // 读多少,打印多少。 }
-
BGP 协议原理 (a) BGP 协议基本概念:BGP 的作用和特点、BGP 邻居关系的建立和配置
-
BGP 协议的原理和应用