BGP建立对等体的对等体都会发起TCP三次握手,所以会建立两个TCP连接,但是实际BGP只会保留其中一个TCP连接,从Open报文中获取对端BGP Identifier之后BGP对等体会比较本端的Router ID和对端的Router ID大小,如果本端Router ID小于对端Router ID,则会关闭本地建立的TCP连接,使用由对端主动发起创建的TCP连接进行后续的BGP报文交互
实际实验中:先发起的TCP连接会中断,后发起的TCP连接有效
R3的Router ID: 10.1.34.3,R4的Router ID:10.1.34.4。先配置R4的bgp,R4先发TCP,后配置R3,抓包显示则保留R3的TCP,并不会保护Router ID大的R4的TCP
BGP报文
1. BGP header:每一类BGP报文都会携带的头部
- Marker:占16字节,用于检查BGP对等体的同步信息是否完整,以及用于BGP验证的计算。不使用验证时所有比特均为1(十六进制则全“FF”)。
- Length:占2个字节(无符号位),BGP消息总长度(包括报文头在内),以字节为单位。长度范围是19~4096。
- Type:占1个字节(无符号位),BGP消息的类型。Type有5个可选值,表示BGP报文头后面所接的5类报文(其中,前四种消息是在RFC4271中定义的,而Type5的消息则是在RFC2918中定义的):
TYPE值 报文类型 1 OPEN 2 UPDATE 3 NOTIFICATION 4 KEEPALIVE 5 REFRESH(RFC2918)
2. BGP type:
1.open:协商BGP对等体参数,建立对等体关系(类似于OSPF的hello报文)
需要协商哪些参数
2. keepalive:用于维护BGP的邻居关系
不携带任何信息参数,只用于邻居保活。默认60s周期发送,180s超时。
[R3-bgp]timer keepalive <0-21845> 改变周期通告的时间
[R3-bgp]timer keepalive 60 hold <0, 3-65535> 配置保活时间
keepalive和holdtime时间两端可以不一致(要满足本端的keeplive时间在对端的holdtime时间内)两端最终会协商为小值
KEEPALIVE报文只有BGP报文头,没有具体内容,故其报文长度应固定为19个字节。
3. update:用于BGP路由信息的传递和撤销
只有当设备发送路由或撤销路由时,才会发送
4. notification:用于断开BGP连接
手动删除BGP邻居后,会通告notification报文,通知对端断开BGP邻接(TCP连接)
5. route-refresh: 用于请求更新BGP路由
<R3>refresh bgp all import 向对端发送route-fefresh报文请求路由信息
<R4>refresh bgp all export 向对端主动发送update报文
BGP状态机
1.idle:初始化状态,等待初始事件的发生
2. connect:TCP连接状态
- 1. 不存在TCP连接的设备,退回初始状态
- 2. 存在TCP连接,但是TCP连接超时或TCP连接中断
1)进入到active状态,继续尝试TCP连接,并启动连接定时器(32-37s)
a.如果连接定时器超时,则退回connect
b. 在连接定时器内,TCP正常连接
- 3. 存在TCP连接,且正常连接,发送open报文,进入下一个opensent状态
3. opensent状态:等待对方发送的open报文,进行open报文参数协商
1)如果没有收到对方的open报文,发送notification报文退回idle状态
2)如果收到了open报文,但报文内的参数协商存在问题,发送notification报文退回idle状态
3)如果收到了open报文,且报文内的参数协商不存在问题,会发送keeplive报文,进入openconfirm状态
4. openconfirm状态:等待对方发送的keeplive报文
1)如果没有收到keeplive报文,则发送notification报文退回idle状态
2)如果收到了keeplive报文,进入到established状态,BGP邻居关系正常建立
5. established:BGP的邻居最终状态
如果存在错误,会发送notification报文退回idle状态
可以通过update报文更新路由、撤销路由信息
可以通过route-refresh报文,请求路由信息
***任何状态下,如果收到了notification报文,则退回到idle状态
BGP路由的生成
1.通过network方式通告的
[R4-bgp]network 100.4.4.4 32 被通告的路由一定是设备已经存在的路由
2. 通过import方式引入的
[R4-bgp]import-route static 协议存在的路由,可以被引入的方式引入,被引入的路由不需要在路由表中最优选
3.通过BGP邻居学习的
可以接收IBGP、EBGP邻居发布的路由
4. 通过聚合的方式产生路由
[R4-bgp]summary automatic
[R4]dis bgp routing-table 查看BGP协议生成的路由表
1. 如果路由的下一跳为0.0.0.0,则表示该路由是自身设备发布的
2. 如果路由的下一跳为127.0.0.1,则表示该路由是设备聚合发布的
BGP路由的传递
1. 从EBGP邻居接收的路由,可以传递给IBGP邻居
传给IBGP邻居的路由一下跳不做改变,会导致BGP路由不可用(下一跳不可达)
路由不存在*>(*:可用的路由,>:最优的路由)
[R3-bgp]peer 1.1.1.1 next-hop-local 向IBGP邻居传递路由时,将路由的下一跳改变为自身的更新源地址
R4发布一条路由100.4.4.4/32
R1学习到100.4.4.4/32的路由下一跳不变
2. 从IBGP邻居接收的路由,不可以传递给IBGP邻居
为了防止AS内BGP路由环路,设计的规则(水平分割)
R2上学习不到100.4.4.4的路由
3. 从EBGP邻居接收的路由,可以传递给EBGP邻居
路由的下一跳改变为邻居的更新源地址(邻居建立使用的地址)
R5可以学习到100.4.4.4的路由条目,下一跳改变为邻居的更新源地址
4. 从IBGP邻居接收的路由,可以传递给EBGP邻居
R1上发布一条100.1.1.1/32的路由,R5可以接收到
***********************************************************************************************************
*BGP设备自身发布的路由,可以传递给IBGP邻居、EBGP邻居 *
*BGP只传递最优的路由 *
***********************************************************************************************************
项目 | 描述 |
---|---|
BGP Local router ID is 192.168.2.2 | BGP的Router ID是192.168.2.2,其格式与IPv4地址一样。 |
Status codes | 路由的状态代码。显示在每条路由的最前面。
BGP振荡抑制使用惩罚值来衡量一条路由的稳定性,惩罚值越高则说明路由越不稳定。路由每发生一次振荡,即路由器收到该路由的Withdraw报文或者收到该路由的属性更新的Update报文时,BGP便会给此路由增加一定的惩罚值。 当惩罚值超过抑制阈值时,BGP会将该路由的>标志去掉,此路由被抑制,不再参与BGP选路,路由器也不再向其他BGP对等体发布该路由的Update报文。
|
Origin | 路由的Origin属性代码。显示在每条路由的最后面。
|
Network | BGP路由表中的网络地址。 |
NextHop | 报文发送的下一跳地址。 |
MED | BGP路由的MED度量值,作用类似于IGP路由的Cost(也称为Metric)。 |
LocPrf | 本地优先级(Local_Pref)。 |
PrefVal | 协议首选值(PrefVal)。 |
Path/Ogn | AS_Path属性及Origin属性。 |