BGP 属于边界网关路由协议是一种 EGP 路由协议,其主要作用在各个 AS 自治系统之间传递路由信息,是大型网络之间互联的路由协议。基本像我这种小网工很难接触到,但是确实这个协议在大型网络中还是会优先考虑使用的,或者那种跨自治系统区域的网络架构也会使用,虽然日常工作用不到,但是面试官可没少问,为了找到高薪工作,像这种大型网络协议也是需要十分了解的。BGP 能够进行路由优选,避免环路,能更高效的传递路由和维护大量的路由信息,BGP 本身只是用来进行路由选路的,他仅仅通过自身算法计算出最优路径并转发出去,其本身是不产生任何新的路由条目的。这点和 OSPF 还是有区别的。
BGP 协议特性:
BGP 他的传输路由条目是基于 TCP 传输,协议端口号是使用的 179 ,也就是说需要建立传统的三次握手之后才会进行数据传输,举个简单的例子 icmp 协议也是基于 TCP 的。所以有个简单的办法来判断 BGP 是否能和对端建立邻居最基本的方法就是,通过 Ping 对端地址的方式来判断,若对端都无法 Ping 通的话,那邻居建立的第一步就失败了。 BGP 是一种路径矢量协议,提到矢量协议是不是会想起来前面的 RIP 协议,BGP 也是通过跳数来进行一个距离算法的,不过这里的跳数,一跳是一个 AS 自治系统,并不是前面的单个路由器设备了。因此每个节点都依靠下游邻居来将它的路由表中的路由传递下去,节点在路由的基础上进行路由计算并把结构传递给上游邻居。这个节点作为跳数,在 BGP 协议中会以节点列表来表明路由经过的路径信息。这里的节点列表也就是 AS_PATH ,这个也是 BGP 路径选择的属性之一。当一条路由传入进一个 AS 自治系统中,该路由的下一跳会变成上一个 AS 的出接口的 IP 地址,当这条路由在 AS 自治系统内部传递时,下一跳不会改变。 既然是路径矢量协议,那么就会存在环路的情况,若这条路由从本地 AS1 传递给 AS2 ,再由 AS2 传递给 AS3。最终 AS3 会再传递给 AS1 ,那么根据路由传递的原则后,该路由下一跳地址会不断进行变化,当有一条去往这个路由的数据报文,会在各个自治系统之间不断的循环,导致无法到达最终正确的目的设备。
那么解决这个问题的办法呢,BGP 的 AS_PATH 属性会在和路由信息一起打包传递,每经过一个 AS 自治系统后,会把 AS 自治系统的编号添加到 AS_PATH 中,当收到的数据包中有自身的 AS 自治系统编号,则不学习该路由,终止了路由环路的传递。 BGP 邻居建立完成后,第一次会发送完整的路由表,后续只会发送新增或者删改的路由信息给邻居,这个和 RIP 不同,虽然说是距离矢量路由协议,但是这一点和 OSPF 比较类似。 BGP 有 13 种控制路由优先级的路由属性,后面会单独用一篇文章来说明,这里就简单提一下。
BGP 邻居建立:
BGP 是基于 TCP 来构建邻居关系的,根据 BGP 运行方式,BGP 也可以分为 eBGP 和 iBGP 两种。BGP 路由器标识(Router_ID) 这个是在 BGP 协议中用来标识路由器唯一身份的标识,每一个对等体之间 Router_ID 不能相同。 eBGP; 就是运行在不同自治系统之间的 BGP 称为 eBGP ,当路由传递接收到的 AS_PATH 属性有自身自治系统号,则会丢弃改路由。 iBGP; 由于是运行在同一个 AS 自治系统中,故 AS_PATH 属性中会学习所有 AS 区域的路由信息。 我们这里没有做特殊说明的情况下,都是讨论的 eBGP 路由协议。 BGP 邻居建立完成一共经历 6 个阶段 Idle 状态、Connect 状态、Active 状态、OpenSent 状态、OpenConfirm 状态、Established 状态。
Idle 状态
BGP 空闲状态,这个状态是 BGP 邻居建立的最初始的状态,在此状态下拒接接收邻居发送的相关连接的请求,他会等自身系统发出的 Start 事件之后才开始接收,触发之后设备会对自己的资源进行初始化,开启重置连接计时器,计时器结束后才开始发起 TCP 请求并进入下一阶段。计时器时间默认为 32s ,若在建立完成或者其他任何阶段,收到了对端发送的拆除连接报文,或者连接错误 Notification 报文,都会立刻转换为 Idle 状态。
Connect 状态
在这个状态下,会启动重传计时器,并向对端发送 TCP 连接请求,若在重传计时器结束还没收到报文,会继续发送请求。除非出现断开连接,或者手动重置 BGP 进程的情况,这种情况会立刻转为为 Idle 状态。不然会持续重传 TCP 连接请求。建立成功会直接跳转到 OpenSent 状态,建立失败的话会变成 Active 状态。
Active 状态
BGP 等待接收对端设备的 TCP 连接请求,若建立成功状态会变成 OpenSent 状态。若连接失败会一直停留在此阶段,当进入此状态也会开启一个重传计时器,在计时器内还没收到请求,将会转换为 Connect 状态。
OpenSent 状态
这个状态就是完成了 TCP 连接的建立。并开始传输 Open 报文,报文内容包含 AS 号、BGP 版本号、认证码等一些基本信息。这些信息确认无误之后状态会变成 OpenConfirm 状态,并开始发送 Keepalive 报文。若核对的时候发现自身有冲突或者有错误验证信息等,会发送一个通告 Notification 报文,这时状态将会退成 Idle 状态。
OpenConfirm 状态
这个状态就是需要开始接收发送 Keepalive 报文了,这时两端都接收并发送 Keepalive 报文后,且确认报文内容数据真实有效,就会转为 Established 状态,完成最后的邻居建立。若这个状态收到错误的报文,会向对端发送通告 Notification 中断连接的报文,并退回 Idle 状态。
Established 状态
这个状态也就是标志 BGP 邻居建立成功,并开始交换自身的路由信息完成路由条目的传递,通过 Update 报文、Keepalive 报文等。这个状态收到中断连接的报文时也是会退回 Idle 状态的。所以任意阶段收到中断连接的报文都会退回初始阶段。
BGP 相关报文:
BGP 协议是通过 TCP 连接来运行的,所有报文传输都是需要建立 TCP 三次握手之后的,所以 BGP 的报文传输都是通过单播方式进行的,BGP 中一共存在 5 中报文类型,分别是 Open 、Keepalive 、Notification 、Update 、Router-refresh。
Open 报文
当设备的 TCP 会话成功建立之后,两个邻居就会发送一个 Open 报文,每个邻居都会使用该报文来表明自己,并规定自己的一些 BGP 基本运行参数,例如一些 BGP版本号,自身的 AS 号、还有一些相关的计时器的计时时间,报文中还会携带自身支持哪些 BGP 的参数。这会在后续邻居建立完成后,当对端不支持该协议参数的时候,将不会发送相关协议报文,大大提高了 BGP 的数据转发能力。
Keepalive 报文
简单来讲 Keepalive 报文会定期向邻居发送,用来确认邻居之间的 TCP 连接状态是否正常,若该时间为 0 ,则不会发送 Keepalive 报文。
Notification 报文
这个报文是用来通告连接中的错误信息,例如数据的检验时存在差错值,AS 号不可达,邻居 TCP 不可达等相关错误信息,接收这个报文后,设备会断开 BGP 邻居状态,重新进行邻居的建立。
Update 报文
主要用作于邻居之间的路由条目的更新,报文内容包括路由不可达、路由撤销、新增路由条目,以及路由属性这些信息。这里其中最重要的还是路由条目的路由属性信息,BGP 的最优路径选择就是通过报文中的这条信息。
Router-refresh 报文
这是支持本地路由刷新,将本地路由器的入口路由策略发生了变化时,会向对端发送 Router-refresh 报文,然后将自身的完整路由信息发送给邻居设备。
标签:基本,状态,报文,TCP,BGP,概述,邻居,路由 From: https://blog.51cto.com/u_14167341/5886837