BGP基础

news/2024/12/4 14:26:08/

EGP:早期的外部网关协议,用于在自治系统间动态交换路由信息,但设计简单,无法避免环路问题

BGP:取代EGP的另外一种外部网关协议,能够进行路由优选,避免路由环路,提供更高效的路由传递,不产生路由,只传递路由,提供丰富的路由策略

概述

AS:自治系统,同一个组织管理管理下,使用统一选路由策略的设备集合

如果使用IGP传递路由:

AS之间需要直连链路,或者通过VPN协议构造逻辑直连

AS之间可能是不同的机构、公司,相互之间无法完全信任,使用IGP可能存在暴露AS内部的网络信息的风险

VPN(virtual private network):使用虚拟专业网络技术可以从逻辑上建立一个直接连接的网络

使用BGP传递路由:

BGP是基于TCP的,只要建立TCP就可以建立BGP

传递的只有路由信息,不会暴露AS内的信息

触发式更新

触发更新就是当检测到网络拓扑发生变动时,路由器会立即发送一个更新信息给邻居路由器,并依次产生触发更新通知它们的邻居路由器

周期更新就是周期性扫描网络拓扑,当扫描到拓扑发生变化时,才进行更新

BGP基本原理:

2006年之后单播IPv4网络使用的版本是BGP-4(RFC4271),其他网络(如IPv6等)使用的版本是MP-BGP(RFC4760)

BGP的特点:

使用TCP作为传输协议,端口号179,触发式路由更新

能够承载发批量的路由信息,支撑打规模的网络

提供了丰富路由策略,可以灵活的进行路由选择,指导对等体发布路由

能够支撑MPLS/VPN的应用,传递客户VPN路由

提供了路由聚合和路由衰减功能,可以防止路由振荡,有效提高了网络的稳定性

BGP通常被称为路径矢量路由协议,每条路由都携带多种路由属性,可以根据这些路由属性控制路径,区别于IS-IS和OSPF只能通过开销来控制路径,所有BGP在路径选择控制上具有丰富的可操作性

BGP对等体

BGP对等体是指共享相同出站策略的BGP邻居,可以在对等体组中进行分组,以便对不同对等体应用不同的策略,从而简化配置并提高更新计算的效率,对等体之间无需直连,只需要IP可达,然后手动配置建立对等体关系

BGP对等体关系建立:

首先进行TCP三次握手,由于是两个对等体会同时发送TCP,会根据router ID(数值大的)来选择一个设备来进行TCP连接

两个设备之间相互发送Open报文进行协商

协商成功后,相互发送keep alive报文,收到后即成功建立对等体,双方定期发送keep alive保持联系

对等体建立成功后,互相发送BGP Update报文通告

BFP报文类型

Open : 协商BGP对等体参数,用于建立对等体,在TCP建立成功后发送的

Update : 发送BGP路由更新,有需要时,一般是路由变化或者是需要发送时才发送

Notification : 报告错误信息,中止对等体关系, 发现错误时,使用该报文通告对等体

Keepalive : 标志着对等体建立,维持BGP对等体关系,建立关系后会定期发送

Route-refresh : 在改变路由策略后请求对等体重新发送路由信息 , 当路由策略发生变化时,触发请求对等体重新通告路由

BGP报文格式:

报文头:五种都有相同的报文头

Marker:168Byte , 用于标志报文边界

Length : 2Byte, 包含BGP报文的长度信息

Type : 1Byte, 标志着BGP的报文类型

Open的报文格式:

Version : BGP的版本号

My AS : 本地自治系统号码,可以哦按段是否处于相同AS

Hild Time : 保持时间,由对等体协商,在时间内未收到其他报文,可以任务BGP中断

BGP Identifier:BGP标识符,以IP地址的形式表示,用来识别BGP路由器

Update的报文格式

Unfeasible route length : 不可达路由字段的长度,如果为零说明没有不可达的路由

Withdrawn routes: 不可达路由列表

Path attributes : 于NLRI相关的所有路径属性列表

NLRI : 可达路由的前缀和前缀长度二元组

Withdrawn Routes Length:标明Withdrawn Routes部分的长度。其值为零时,表示没有撤销的路由

Total path attribute length:路径属性字段的长度

Notification的报文格式:

Error Code、Error subcode:差错码、差错子码,用于告知对端具体的错误类型

Data:用于辅助描述详细的错误内容,长度并不固定

Keepalive的报文格式

只包含报文头,没有附件其他任何字段

Rooute-refresh的报文格式

AFI : 地址族标识,比如IPV4

Res : 保留位

SAFI :子地址族标识

BGP状态机

Idle状态 :

启用BG后,开始准备建立TCP的连接时的状态

任何状态中收到No报文或TCP拆链等错误事件后,BGP都会转至idle状态

Connect状态:

TCP三次建立的过程中属于Connect状态,发送TCP时会开启定时器

如果建立TCP连接成功,BGP像对等体发送Open报文, 进入opensent状态,如果建立TCP连接失败或者error,会转到Activeh状态

这种状态一直持续,可以判断邻居没有配置BGP,或者由中间设备拦截了BGP报文

Active状态 :

从connect状态转过来后,BGP一九会继续尝试建立TCP连接

建立TCP连接成功,转换到Opensent状态

建立TCP连接失败,一直停留到该状态,直到定时器超时返回到Connect状态

OpenSent状态:

TCP连接成功后,发送Open报文等待keep alive报文,转到Opensent

如果发送的open报文出错,发送No报文,转到idle状态

OpenConfirm状态 :

发送keep alive报文后等待对方回复的状态

成功则进入established状态,出错或收到No报文转至idle报文

established状态:

对等关系建立完毕,update更新信息

定期发送keep alive报文保持联系

一蛋出错或者收到表示错误的报文,就会进入idel状态

BGP路由的生成:

BGP自身是不会发现并计算产生路由的,而是将IGP路由表的路由注入到自己的路由表中,有两种注入方式

network注入方式:

用network命令通告 , network + 地址

已经获得路由的BGP路由器通过update报文将路由传递给其他AS的BGP路由

import-route方式注入路由:

是为了改善network方式只能一条条配置注入的复杂性

可以将直连路由,静态路由,OSPF路由、IS-IS等协议的路由注入到BGP路由

BGP路由聚合

执行聚合之后,在本地的BGP路由表中除了原本的明细路由条目之外,还会多出一条聚合的路由条目

如果在执行聚合时指定了detail-suppressed,则BGP只会向对等体通告聚合后的路由,而不通告聚合前的明细路由

被update通告的BGP路由无法看到聚合前的路由明细

BGP路由通告原则:

  1. 只发布最优且下一跳地址可达的路由

  2. 从EBGP对等体的update获取的路由 ,会发给所有的对等体

  3. 水平分割 : 从IBGP对等体获取的路由,不会再发送给其他BGP,因为如果互传会形成路由环路,最终自己又会收到这个路由

  4. BGP同步规则:当一台路由器从自己的IBGP对等体学习的IBGP路由通告给自己的EBGP对等体

本文为个人学习笔记,总结于华为学习资料和网络资源介绍

如有问题,谢谢指正


http://www.ppmy.cn/news/1552294.html

相关文章

李宏毅深度学习-Pytorch Tutorial2作业

一、任务描述 什么是张量? 张量(Tensor)是深度学习和机器学习中一个非常基础且重要的概念。在数学上,张量可以被看作是向量和矩阵的泛化。简单来说,张量是一种多维数组,它可以表示标量(0维&am…

Linux系统:网络

目录 一、网络协议 1.网络协议概念 2.协议分层 3.OSI七层模型和TCP/IP五层(或四层)模型 4.为什么要有网络协议? 5.网络通信协议的原理 二、网络传输的基本流程 1.局域网的网络传输流程 1.MAC地址 2.局域网通信原理(以太网…

远程桌面协助控制软件 RustDesk v1.3.3 多语言中文版

RustDesk 是一款开源的远程桌面软件,支持多平台操作,包括Windows、macOS、Linux、iOS、Android和Web。它提供端到端加密和基于角色的访问控制,确保安全性和隐私保护。使用简单,无需复杂配置,通过输入ID和密码即可快速连…

无线网络设备驱动开发

文章目录 一、总线设备驱动层二、网络设备驱动层1. 网络接口层2. 设备接口层3. 设备驱动功能层4. 网络设备和媒介层 无线网卡驱动可以借助PCI,SDIO,UART,USB来用于总线通讯。MAC层可以用软件来实现,也可以用硬件来实现。一般有mac…

每次执行 git pull 时都需要输入账号和密码

每次执行 git pull 时都需要输入账号和密码,可能是因为你的 Git 仓库使用的是 HTTPS 协议进行连接,而 HTTPS 协议默认需要每次请求时都进行身份验证。为了提高 convenience 和安全性,你可以采取以下几种方法来避免每次都输入账号和密码&#…

在Scala中Array不可变的学习

package gjhs114import scala.collection.mutable.ArrayBuffer object Arrray114 {// 不可变数组:Array// def main(args: Array[String]): Unit {1 创建不可变数组// val arr1 Array(1,2,3)//2 访问.数组名(下标)。下标是从0开始到…

C++多态---面向对象的心动信号:多态之美

公主请阅 1.多态基本概念多态的概念 2.虚函数2.1 多态的构成条件2.1.3 虚函数的重写/覆盖题目2.1.5 虚函数重写的一些其他问题基类的析构函数要不要定义成虚函数,如果不定义成会出现什么问题呢?定义成在什么场景起作用呢?基类析构函数定义为虚…

高效处理 iOS 应用中的大规模礼物数据:以直播项目为例(1-礼物池)

引言 在现代iOS应用开发中,处理大规模数据是一个常见的挑战。尤其实在直播项目中,礼物面板作为展示用户互动的重要部分,通常需要实时显示海量的礼物数据。这些数据不仅涉及到不同的区域、主播的动态差异,还需要保证高效的加载与渲…