HCNP Routing&Switching之BGP报文结构、类型和状态
前文我们了解了BGP的邻居建立条件、优化以及BGP认证相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/15395723.html;今天我们来聊一聊BGP报文结构、类型和状态相关话题;
BGP报文结构和类型

提示:BGP工作在应用层,其端口号为179;报文结构是7层封装,BGP报文主要由两种报文头部组成,公共头部和类型头部;公共头部主要用来描述bgp AS号,包头长度,报文类型,版本信息等等信息,类型头部主要用来描述不同类型的BGP报文相关属性;BGP报文类型有5种,分别是open包、update包、Notification包、keepalive和route-refresh;其中open包主要用来建立邻居使用,在邻居建立以后相互发送一次,后续不再发送;keepalive包主要作用是维护邻居关系,默认情况下bgp是每60秒发送一次keepalive包向邻居通告自己还“活”着;如果连续三个周期没有收到邻居的keepalive包,此时本端会认为邻居挂掉;update包主要用来路由更新,其包里的内容主要是用来描述更新的路由信息和属性;只要有路由更新对应都会向邻居发送更新;notification包主要用来发送当检测到错误,发送后关闭BGP连接的信息;Route-refresh包主要用来触发请求邻居重新通告路由;
BGP邻居状态

提示:BGP邻居状态有6种,分别是idle,connect,active,open-sent,open-confirm,established,其中idel状态是最开始状态,表示邻居为空,没有邻居;当配置好邻居信息以后,如果在对应路由表中找到去往邻居的路由,此时邻居关系会从idel转变为connect;如果没有路由,则还是原来的idle状态,即没有发送tcp三次握手请求报文的状态;connect状态表示发起TCP连接,等待tcp连接完成,即本端发送TCP三次握手请求,等待对端回复完成tcp三次握手的状态,该状态会有一个超时时长,如果在规定的时间内还是没有建立tcp连接,该状态会超时重试,即没有邻居回复本端的三次握手请求的状态;active状态表示tcp建立失败,继续尝试tcp连接,即tcp三次握手的报文已经发送,但是由于某些错误导致tcp三次握手没能正常建立的状态,该状态会有一个尝试时间,如果尝试tcp连接还是失败则该状态保持,如果tcp建立超时,则会从active状态转变为idle状态,如果tcp建立成功则会从active状态转变为open-sent状态表示tcp连接成功,并已发送一次open包后的状态;即本端三次握手成功建立,发送open包以后的状态;open-confirm表示对端收到本端发送的open包后的状态,如果没有收到对端的open包,此时会从open-sent状态进入active状态,表示tcp连接失败,或者错误的TCP连接,或者对端不认可和本端建立邻居;established表示邻居建立完成的状态;即收到对端的发送到keepalive包以后的状态;open-sent/open-confirm/established这三种状态一旦发生错误都会返回到idle状态;
BGP邻居建立过程和状态转换

提示:idle和connect状态主要发生在邻居建立初期,tcp三次握手阶段,如果三次握手正常交互,对应状态会从idle转变为connect状态,表示发送了tcp三次握手请求,等待完成tcp三次握手;三次握手成功以后,如果发送了open包,对应状态会从connect状态转变为open-sent状态,如果正确接收到对端的open包以后,对应状态会从open-sent状态转变为open-confirm状态,并向对端发送keepalive包,通告本端的存活状态;如果对端收到本端发送的keepalive包以后,对应状态会从open-confirm状态转变为established状态;以上是bgp邻居建立过程中几种状态切换过程;在established状态下,BGP路由器可以和邻居交换update、keepalive、Route-refresh报文和notification报文;
实验:如下拓扑,配置BGP

R1的配置

sys
sys R1
int g0/0/0
ip add 12.0.0.1 24 bgp 12
router-id 1.1.1.1
peer 12.0.0.2 as 12
R2的配置

sys
sys R2
int g0/0/0
ip add 12.0.0.2 bgp 12
router-id 2.2.2.2
peer 12.0.0.1 as 12
只配置了R1未配置R2时,R1bgp邻居状态验证

提示:此时R1并未发送tcp三次握手请求,所以对应邻居状态还是idle状态;表示正在查找路由表去往邻居的路由;
在R1查找到对应去往邻居的路由以后,发送TCP三次握手请求后,对应邻居状态

提示:R1发送三次握手请求后,对应邻居从idle状态转变为connect状态,表示发送了三次握手请求,等待三次握手完成;
在R1上抓包

提示:在R1上抓包只有arp包,其原因是R2没有配置,R1找不到R2的mac地址,所以一直发送广播请求R2的mac地址;
配置R2接口地址

验证:在R1上查看bgp邻居状态,看看有什么变化没有?

提示:可以看到对应邻居状态一直处于connect状态;
在R1上抓包,查看对应tcp三次握手的情况

提示:可以看到R1向R2的179端口发起三次握手请求,对端R2一直发送重试;其原因是R2没有配置bgp,当然179端口并不会处于监听状态;所以R1请求R2的179端口,对应R2回复重试;
配置好R2 bgp邻居信息

在R1上查看邻居关系

提示:可以看到对应R1的邻居关系为established,这个过程相对较快,中间的状态我们看不到,但从上面的提示可以看到对应established的前面一个状态为openconfirm状态;
查看R1上的抓包过程

提示:可以看到R1向R2发起三次握手请求,对应R2响应确认并向R1发起建立连接请求,对应R1确认,对应发送open包,再后续发送keepalive包;
在R1上配置邻居2.2.2.2 对应as号为12

查看邻居状态

提示:可以看到我们配置的2.2.2.2,对应邻居状态为idle,表示没有发送tcp三次握手请求;其原因是本地没有去往2.2.2.2的路由,所以对应邻居会一直处于idle状态;
验证:在R1上添加静态路由去往2.2.2.2,看看对应邻居状态是否发生变化?

提示:可以看到在R1上添加静态路由以后,对应bgp邻居状态从idle状态变为了connect状态;说明R1通过查找路由表,已经向2.2.2.2发起tcp三次握手请求;
验证:查看R1的抓包,看看R1是否向2.2.2.2发起tcp三次握手?

提示:可以看到对应R1的确在向2.2.2.2发送tcp三次握手请求;
在R2上新建lo接口并配置接口地址为2.2.2.2/32

再次验证R1上2.2.2.2的邻居状态是否发生变化?

提示:可以看到R1上2.2.2.2邻居状态从connect状态转变为active状态,这是为什么呢?我们知道active状态是tcp三次握手失败,对应状态;
在R1抓包查看tcp三次握手情况

提示:可以看到R1向2.2.2.2发起三次握手请求,对应2.2.2.2也回复并建立起tcp连接,对应R1向2.2.2.2发送了open包以后,对应2.2.2.2又给R1发送了断开连接请求;说明R1和2.2.2.2并没有建立起TCP连接,即tcp连接建立失败,所以从connect转态转变为active状态;其实这里的原因是R2回复R1的包其源地址为12.0.0.2和R1配置的邻居2.2.2.2地址不匹配导致的;
验证:在R2上更改更新源为lo2接口地址,看看邻居状态的变化

提示:在R2上更改更新源以后,对应和12.0.0.1邻居状态从established变为了idle,这是因为更新源发生变化导致tcp连接错误;所以从established状态转变为idle状态;
在R1上验证邻居状态

提示:可以看到此时R1上和2.2.2.2建立起邻居,但是对应和12.0.0.2的邻居状态变为了active,这是因为从R2过来的包,其源地址为2.2.2.2,和本端配置的邻居12.0.0.2不匹配,所以导致tcp连接建立失败,所以在R1上看到和2.2.2.2正常建立tcp连接,邻居正常,和12.0.0.2建立不起来TCP连接,邻居状态处于active状态;
总结:指向bgp数据包源ip地址的路由不存在,即没有邻居路由,对应邻居关系为idle;邻居与错误地址建立对等关系,即源地址不匹配,导致邻居状态为active状态;不存在该路由器的邻居声明,即对端未配置本端为邻居,邻居状态会卡在active(如果对端未配置bgp会卡在connect状态);as号配置错误会导致对应邻居状态为active;以上原因都可能导致邻居状态在idle/active状态循环;
HCNP Routing&Switching之BGP报文结构、类型和状态的更多相关文章
- HCNP Routing&Switching之IS-IS报文结构和类型
前文我们了解了IS-IS动态路由协议基础相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/15249328.html:今天我们来聊一聊IS-IS动态路由协 ...
- HCNP Routing&Switching之BGP路由宣告
前文我们了解了BGP报文结构.类型以及邻居状态相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/15422924.html:今天我们来聊一聊BGP路由宣告 ...
- HCNP Routing&Switching之BGP邻居建立条件、优化和认证
前文我们了解了BGP相关概念.AS相关概念以及BGP邻居类型.基础配置等,相关回顾请参考https://www.cnblogs.com/qiuhom-1874/p/15370838.html:今天我们 ...
- HCNP Routing&Switching之BGP防环机制和路由聚合
前文我们了解了BGP路由宣告相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/15440860.html:今天我们来聊一聊BGP防环机制和路由聚合相关话题 ...
- HCNP Routing&Switching之BGP基础
前文我们了解了路由注入带来的问题以及解决方案相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/15362604.html:今天我们来学习下新的路由协议BG ...
- HCNP Routing&Switching之BGP路由属性和优选规则
前文我们了解了BGP防环机制和路由聚合相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/15458110.html:今天我们来聊一聊BGP路由属性和选路规 ...
- HCNP Routing&Switching之BGP路由控制
前文我们了解了BGP的路由属性和优选规则相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/15489497.html:今天我们来聊一聊BGP路由控制相关话 ...
- HCNP Routing&Switching之OSPF外部路由类型以及forwarding address
前文我们了解了OSPF的4类.5类LSA,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/15222969.html:今天我们来聊一聊外部路由类型和forward ...
- HCNP Routing&Switching之BGP路由过滤和AS-Path-Filter
前文我们聊了下通过修改BGP路由属性来影响路由,从而达到控制BGP路由的目的:回顾请参考https://www.cnblogs.com/qiuhom-1874/p/15495585.html:今天我们 ...
随机推荐
- Spring笔记(2)
一.AOP简介 1.概念: 面向切面编程(Aspect-Oriented Programming),可以说是OOP(Object-Oriented Programing,面向对象编程)的补充和完善. ...
- linux centos7 命令中的 2>&1 代表的意义
2021-09-01 1. 参数介绍 0 – stdin (standard input) 标准输入1 – stdout (standard output) 标准输出2 – stderr (stand ...
- 基于Linux的系统排错
1.系统引导过程概述 2.系统异常及恢复 [1]grub系统引导 1)mbr上446字节丢失 模拟问题: dd if=/dev/zero? of=/dev/vda? bs=446? count=1? ...
- 干货:详解C++ sort函数的cmp参数!
学算法的第一天你在学冒泡.桶排 在你还没搞明白快排和归并的时候 你已经学到了数据结构最后的堆排序和希尔排序 可以说排序是很多竞赛生的噩梦-- 于是它诞生了 void std::sort() Sort ...
- LeetCode通关:通过排序一次秒杀五道题,舒服!
刷题路线参考:https://github.com/chefyuan/algorithm-base 大家好,我是拿输出博客督促自己刷题的老三,前面学习了十大排序:万字长文|十大基本排序,一次搞定!,接 ...
- JDK1.8源码阅读笔记(1)Object类
JDK1.8源码阅读笔记(1)Object类 Object 类属于 java.lang 包,此包下的所有类在使⽤时⽆需⼿动导⼊,系统会在程序编译期间⾃动 导⼊.Object 类是所有类的基类,当⼀ ...
- Python网编之简单的聊天小程序
服务端: import socket sock = socket.socket() sock.bind(("127.0.0.1",8899)) sock.listen(5) whi ...
- PreparedStatement预编译的sql执行对象
一.预编译,防sql注入 其中,设置参数值占位符索引从1开始:在由sql 连接对象创建 sql执行对象时候传入参数sql语句,在执行对象在执行方法时候就不用再传入sql语句: 数据库索引一般是从1开始 ...
- Vue3.x全家桶+vite+TS-搭建Vue3.x项目
目录 一.搭建基础项目 1.vite创建项目 3.运行项目 2.环境变量设置介绍 vite配置多环境打包 二.配置Router 1.安装路由 2.配置路由 3.引入 三.配置Vuex 1.安装vuex ...
- 为什么在匿名内部类中引用外部对象要加final修饰符
当所在的方法的形参需要被内部类里面使用时,该形参必须为final. 为什么必须要为final呢? 首先我们知道在内部类编译成功后,它会产生一个class文件,该class文件与外部类并不是同一clas ...