• BGP—— 边界网关协议


    1,BGP的数据包

    BGP协议所有数据包的传输的可靠性均由TCP协议来保证。所有BGP数据包均基于TCP建立的会话通道发送。
    OSPF的Hello --- 可以周期性的发现,建立和保活邻居关系。
    在BGP中,发现邻居关系的过程变为由人手工指定。主要因为TCP协议需要建立会话通道,之后才会基于通道发送数据包。
    open包 --- 建立BGP对等体关系。---- 邻居关系的建立无非就是参数协商的过程。BGP建立邻居关系需要通过OPEN包来携带参数,进行比对协商。
    AS号 --- 在创建邻居关系时需要指定邻居所在的AS号,这个参数将被携带在OPEN报文中发送给对方,对方将比对这个AS号和本地所在的AS号是否一致,如果一致,则可以正常建立邻居关系。
    认证 --- BGP建邻也可以做认证,做认证后将携带认证口令,认证口令双方需要比对,一致则可以正常建立邻居关系。 ROUTE-ID ---- 区分和标定路由器的。也是由32位二进制构成,按照IP地址的格式来表示。 ---- 1,手工配置;2,自动获取(先看设备是否存在环回接口,如果存在则将选择环回接口中IP地址最大的地址作为RID,如果没有环回接口,则将在物理接口中选择IP地址最大的作为RID)
    这个RID将在OPEN包中携带,发送到对端之后,对端将检测这个RID,如果和本地的RID 不同 ,则将可以正常的建立邻居关系。
    手工建立邻居关系时所指定的建邻的IP地址必须和收到的open包中的源IP地址相同才能正常建立邻居关系。否则,邻居关系将建立失败
    Holdtime --- 保活时间 --- 默认时间为180S,在保活时间内,如果没有收到对方发送的keeplive包或者update包,则将断开BGP邻居关系。这个参数在open报文中将被携带,但是,双方不一致不会影响邻居关系的建立,但是在执行时,这个时间必须是一致的,则将采用双方中较小的保活时间来使用。
    路由器是否支持刷新功能也将成为OPEN报文中所携带的一个协商参数。
    keeplive包 --- 周期保活 --- 周期发送时间等于保活时间的1/3。默认保活时间180S,则默认的周期发送时间为60S。除了保活之外,keeplive包还将在open报文协商参数时临时充当确认包的作用。
    TCP协议进行确认的目的是为了保证数据传输的可靠性,而keeplive报文确认的目的是为了确认认可对方发送的open报文中的参数。
    update包 --- 更新包 --- 携带需要传递的路由信息的数据包。表示一条路由条目信息,需要携带的参数主要就是目标网络号和子网掩码信息,以及路径属性。
    在更新包中,存在一个 撤销路由条目字段 ,在这个字段下的路由条目将需要对端删除,而不再需要通过带毒传输的方式来表达。
    notification包 --- BGP中设计的一个告警机制。
    Route-refresh包 --- 用于改变路由策略变更后请求对等体重新发送路由信息。(前提条件是双方均支持路由刷新功能才行。)

    2,BGP的状态机

    BGP的状态机描述的是BGP对等体建立过程中状态的变化。因为BGP这个协议可以将邻居建立过程和路由收发过程分开进行。
    BGP的状态机 --- 6种
    IDLE --- 空闲状态 --- 路由器启动BGP进程之后,将先处于idle状态。
    当你手工指定邻居关系后,BGP将进入到一个检查环节,检查指定的IP地址在本地路由表中是否可达。如果可达,则将进入到下一个状态 --- connect。
    Connect --- 连接状态,该状态完成TCP会话的建立。
    如果TCP会话建立成功,则将进入到opensent状态,发送open报文。
    如果TCP会话建立失败,则将进入ACTIVE状态,尝试重新建立TCP会话。
    在建立TCP会话过程中,因为双方都会主动发起建立会话的过程,而最终建立的都是一个双向的会话。所以,最终只需要保持一个会话通道即可。选择方式是通过后续open报文中的RID进行比较,选择保留RID大的设备发起的TCP会话。
    Opensent --- 发出本地的open报文。收到对端发送的open报文,查看里面的参数,之后,如果确认参数无误。则将回复keeplive报文作为确认。
    Openconfirm --- open报文确认状态 --- 对端也收到本地发送的open报文,之后根据里面的参数进行确认。如果确认无误则将发送keeplive报文。本段收到对方发送的keeplive报文之后将进入下一个状态。Established --- 建立状态 --- 标志着BGP对等体关系的建立。

    3,BGP的工作过程

    1,基于IGP协议实现IP可达
    2,指定邻居关系,通过三次握手,建立TCP的会话通道。之后所有BGP的数据报都将基于TCP会话通道来进行传递。
    3,使用open报文和keeolive报文进行邻居关系的建立。之后将邻居关系收集到一张表中 --- 邻居表
    4,通过update报文传递路由信息。传递的路由条目信息中主要包含目标网络号,掩码信息,以及各种路径属性。之后,设备会将所有自己发出的以及收到的路由信息记录在一张表中 --- BGP表
    5,之后将BGP表中的最优路径加载到 路由表 中。
    6,收敛完成后,BGP将周期使用keeplive报文进行保活。保活时间默认为180S,周期发送时间默认为保活时间的1/3,即60S。
    7,若出现错误信息,将使用notification报文进行告警。
    8,若发生结构突变,则将使用update报文进行触发更行。

    4,BGP的路由黑洞

    由于BGP协议支持非直连建邻,故可能出现BGP协议跨越未运行BGP协议的路由器。导致BGP路由传递后,控制层面可达,但是数据层面,在经过未运行BGP协议的路由器时无法通过。形成路由黑洞。
    1,在R3上将BGP协议的路由信息重发布到IGP当中。
    2,直接在R4上运行BGP协议
    3,MPLS
    为了避免路由黑洞的情况产生,BGP提出了同步机制 --- 即当一台路由器从自己的IBGP对等体学习到一条BGP路由时,他将不能把他通告给自己的EBGP对等体,除非他又从IGP协议当中学习到这条路由。

    5,BGP的防环

    BGP使用的防环机制 --- 水平分割机制
    EBGP的水平分割 --- 一种专门应用在EBGP对等体之间,用来解决EBGP对等体之间可能出现的环路问题。
    BGP协议将在路由条目中记录所经过的AS编号 ---- AS_PATH --- 记录AS路径的一个属性。(这个属性除了可以完成EBGP的水平分割外,还可以作为选路的依据。) --- 接收到的BGP路由条目中,其中的AS_PATH属性中,若存在本地的AS号,则将拒绝接受。
    IBGP的水平分割 --- 一种专门应用在IBGP对等体之间,用来解决IBGP对等体之间可能出现的环路问题。
    IBGP水平分割 --- 当一个路由器从一个IBGP对等体处学习到某条BGP路由时,他将不能在将这条路由信息通告给其他的IBGP对等体关系。
    因为IBGP水平分割的限制,导致IBGP对等体之间的路由信息只能传递一跳,在这情况下,可能会造成通信障碍。解决方案:
    1,构建全连的IBGP对等体关系 --- 这样的方法弊端在于1,全连建邻会导致资源消耗增加;2,可能会导致网络的可拓展性降低。
    2,路由反射器
    3,联邦

  • 相关阅读:
    Ribbon的使用、拓展机制以及源码分析
    使用writev将多个小数据包合并发送,使用sysconf(_SC_IOV_MAX)查看writev函数最多允许数组大小
    c++11~c++20 -09-类型别名和别名模板
    docker离线安装
    html:mate
    神经网络和深度学习-用pytorch实现线性回归
    uboot启动参数详解和一些细节
    Flask 学习-25.passlib 对密码加密与验证
    多变量线性回归练习
    我们该如何看待AIGC(人工智能)
  • 原文地址:https://blog.csdn.net/Word_Smith_/article/details/125890633