前期回顾:
BGPTCP三次握手后发送的报文:
open报文:
邻居建立和能力参数协商,(至少有一个地址簇能力要一致)
keepalive报文:
默认每隔60s周期性发送,如果180s没有收到keepalive报文,则认为BGP邻居失效
断开TCP连接。
update报文:
BGP路由传递以及撤销
Route-refresh报文:
用于手动进行BGP路由的触发更新,或者用于ORF功能。
Notificationn报文:
通知报文,用于报错,收到该报文会断开TCP连接。
BGP的状态机:
Idle:
产生原因:
1、没有去往邻居地址的路由,无法发起TCP三次握手,也无法完成TCP的三次握手。
2、发起TCP连接请求后被对端拒绝,发起TCP报文的源地址,不是本端指定的邻居地址。
Connect(连接):
产生原因:发起TCP连接路由器,无法收到邻居的TCP回应报文时会变为connect状态,并且5s后重传一次TCP连接请求,再等待32s左右,重新发起TCP连接请求。
Active状态:
产生原因:
本节我们继续从BGP建立邻居前的TCP三次握手到发送Open报文、Keepalive报文。邻居建立之后,我们对现网的操作可能会产生update报文。
现在我们谈一谈Update报文
Update报文
BGP通过Network和Import两种方式生成BGP路由,BGP路由封装在Update报文中通告给邻居,BGP在邻居关系建立后才开始通告路由信息。
Update消息主要用来发布可用路由和撤销路由,Update中包含以下信息:
1、网络层可达信息(NLRI):用来公布IP前缀和前缀长度。
2、路由属性:为BGP提供环路检测,控制路由优选。
3、撤销路由:用来描述无法到达且从业务中撤销的路由前缀和前缀长度。
再通告BGP路由时,由于各种因素的影响,为了避免路由通告过程中出现的问题,BGP路由通告需要遵守一定的规则,下面进行详细分析。
1、BGP通告原则之一:仅将自己最优的路由发布给邻居
[R1]dis bgp routing-table
BGP Local router ID is 1.1.1.1
Status codes: * - valid, > - best, d - damped,
h - history, i - internal, s - suppressed, S - Stale
Origin : i - IGP, e - EGP, ? - incomplete
Total Number of Routes: 2
Network NextHop MED LocPrf PrefVal Path/Ogn
*> 2.2.2.2/32 0.0.0.0 0 0 ?
*> 10.1.12.0/24 0.0.0.0 0 0 i
BGP路由信息中如何看一条邻居是最好的路由?
在BGP路由表中,带>的路由是最优的路由。
2、BGP通告原则之二:通过EBGP获得的最优路由发布给所有BGP邻居
3、BGP通告原则之三:通过IBGP获得的最优路由不会发布给其他的IBGP邻居
这是IBGP中重要的防止环路规则之一,又称之为IBGP的水平分割。
4、BGP通告原则之四:BGP与IGP同步
这个只会产生在BGP非全互联的拓扑中,即同一个AS内存在没有做BGP处理的路由器中,才会进行BGP与IGP的同步。
路由黑洞
我们看以下实验:
在这个拓扑图中,BGP传播路由是可以跨路由器传递的,A路由器可以将路由通过EBGP传递给B,B可以通过IBGP传递给D,因为B路由器到D路由器有运行OSPF协议,路由可达,D再次通过EBGP传递给E。
但是C路由器上却没有A路由器100.0.o.o的路由,因为C路由器没有运行BGP协议。
这样就会导致E路由器在回包的时候,将100.0.o.o的路由先发送给D,D继续转发给C,C直接丢弃。这就出现了BGP的路由黑洞。最终导致路由不通。
这种又该怎么处理呢?
其实,我们的D路由器会在IBGP报文发送过来之后,查询自己的IGP路由表中是否存在该路由,如果存在,则认为在这个区域内,其他路由器都存在该条路由,就认为是同步了,继续通过EBGP传递给E路由器,反之,则认为在这个区域内,其他路由器都不存在该条路由,直接丢弃。
*1、将EBGP路由引入到IGP协议中,(基本被淘汰)比较消耗设备资源,因为BGP路由数量过于庞大,引入到IGP协议,增加的IGP协议计算路由负担。BGP路由震荡,IGP路由也会产生震荡。
*2、AS内部所有路由器均运行BGP协议,即IBGP全互联。主流架构,此时不再需要同步检测。
从IBGP邻居得到的路由不会传递给IBGP邻居
从IBGP邻居得到的路由同步检测后传递给EBGP
记录:
BGP防环机制:
1、AS内部防患,IBGP的水平分割:通过IBGP获得的最优路由不会发布给其他的IBGP邻居。