BGP总结

BGP 总结
一: BGP 邻居
 
1.        BGP 邻居状态机:
 
l        Connect
触发事件:激活 BGP ,使用 neighbor 命令指邻居
动作:通过 TCP179 端口发起连接。
 
l        Open sent
触发事件:连接成功建立(通过 tcp179 端口完成三次握手)
动作 1 :发送 open 消息,并等待对方的 open 消息
动作 2 :核对对方的 open 消息内容( AS 号, RID BGP 版本号)
 
l        Open confirm
触发事件: open 消息核对成功
动作:发送 keepalive 消息,并等待对方 keepalive 消息
 
l        Establish
触发事件:收到对方的 keepalive 消息( keepalive 消息默认定期发送,用于维持邻居关系)
动作:发送 update 消息
 
l        Idle
触发事件 1 :任何一种状态下发现异常,则发送 notification 消息中断连接
触发事件 2 :收到对方的 notification 消息
动作:空闲,等待连接
 
提出疑问 1 当两个BGP路由器之间隔着几个路由器建立邻居关系的时候,他会根据neighbor所指邻居的IP地址在路由表查找到达此邻居的应该怎么走,然后根据路由转发原则,去发送用于建立TCP连接的消息,假设到达邻居有多条路径,那么将先看AD值,AD小的优选,AD一样则看cost值,cost值小的优选,如果两个都一样的话会怎么样呢?? 2 那么此时他向邻居发送更新是不是也会有多条呢?
 
解决疑问 :我么通过实验来研究这个问题:
对于问题一:
实验环境如下:
有两个路由器,分别是R1和R2,各自有一个loopback口,IP地址分别是
1.1.1.1 和 2.2.2.2,通过两个串行口相连,即cost值一样,分别是S0和S1
两个串行口的网段分别是11.0.0.0/24和22.0.0.0/24
在R1上写两条静态路由
 1.1.1.1 [1/0] via 22.0.0.2, Serial1
         [1/0] via 11.0.0.2, Serial0
情况一:R1运行BGP,R2不运行
R1输入
nei 1.1.1.1 remote 12
deb ip bgp
 
deb信息如下:
*Jan 28 14:28:48.483: BGP: 2.2.2.2 went from Idle to Active
*Jan 28 14:28:48.483: BGP: 2.2.2.2 open active, delay 7687ms
R1(config-router)#
*Jan 28 14:28:56.171: BGP: 2.2.2.2 open active, local address 22.0.0.1
*Jan 28 14:28:56.195: BGP: 2.2.2.2 open failed: Connection refused by remote host
R1(config-router)#
*Jan 28 14:30:56.195: BGP: 2.2.2.2 open active, local address 22.0.0.1
*Jan 28 14:30:56.223: BGP: 2.2.2.2 open failed: Connection refused by remote host
观察deb信息,发现并没有在两个接口发送open消息
猜想:BGP建邻居关系的时候,会根据所指邻居的IP地址来查看路由表,以便确定
如何去发送用于建立TCP连接的消息。
路由器会按照从上至下的顺序查找,当查找到了一个匹配的的路由条目后,就停止查找
并按该条目去发送用于建立TCP连接的消息
为验证猜想,将静态路由表改成如下:
1.1.1.1 [1/0] via 11.0.0.2, Serial0
         [1/0] via 22.0.0.2, Serial1
此时deb 的显示信息为
*Jan 28 15:28:48.483: BGP: 2.2.2.2 went from Idle to Active
*Jan 28 15:28:48.483: BGP: 2.2.2.2 open active, delay 7687ms
R1(config-router)#
*Jan 28 15:28:56.171: BGP: 2.2.2.2 open active, local address 11.0.0.1
*Jan 28 15:28:56.195: BGP: 2.2.2.2 open failed: Connection refused by remote host
R1(config-router)#
*Jan 28 15:30:56.195: BGP: 2.2.2.2 open active, local address 11.0.0.1
*Jan 28 15:30:56.223: BGP: 2.2.2.2 open failed: Connection refused by remote host
猜想成立
 
 
情况二:R1运行BGP,R2不运行
在R1上写入如下两条静态路由
 
S        2.2.2.0 [1/0] via 10.0.0.2, FastEthernet0/0
              [1/0] via 12.0.0.2, Serial1/1
即R1和R2通过两个不同类型的接口相连,参照情况一的方法进行验证,发现路由器按照从上至下的顺序查找,当查找到了一个匹配的的路由条目后,就停止查找
并按该条目去发送用于建立TCP连接的消息
 
 
情况三:两路由器都运行BGP
此时若在R1上观察deb 信息,会发现,R1既有可能从S0口发送open消息,又有可能从
S1口发送open 消息,至于究竟从那个接口发送,要取决于在哪个接口受到了R2发送的用于建立TCP连接的消息,则从那个接口回应
 
对于问题二 ,分为两种情况:
 
l        两个路由器通过两个接口相连,且分别通过两个物理接口建立邻居关系
首先 R2 输入 sh ip b s ,输出结果如下:
 
 
Neighbor        V    AS MsgRcvd MsgSent   TblVer InQ OutQ Up/Down State/PfxRcd
10.0.0 .1        4    12       7       6        2    0    0 00:02:45        1
12.0.0 .1        4    12       7       6        2    0    0 00:02:59        1
 
R1 上宣告了 1.1.1 .1/32 之后, R2 再输入命令 sh ip b ,输出结果如下:
R2(config-router)#do sh ip b
BGP table version is 2, local router ID is 2.2.2.2
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal,
              r RIB-failure, S Stale
Origin codes: i - IGP, e - EGP, ? - incomplete
 
   Network          Next Hop            Metric LocPrf Weight Path
* i1.1.1.1/32       12.0.0.1                 0    100      0 i
*>i                 10.0.0.1                 0    100      0 i
 
这里, R1 向两条路径都发送了更新信息, R2 收到了两条更新信息后,会按 11 条选路由原则去进行最优路径的选举
 
注意: BGP 是通过 RID 来唯一标识一个邻居的,而这里通过 sh ip b s 命令得到的输出结果所显示的两个“ Neighbor ”实际上是表示 RID 1.1.1 .1 的邻居通过两条不同的路径和我建立了邻居关系,并且所用接口的 IP 地址是 10.0.0.1 12.0.0.1  ,通过如下命令可以查看邻居的 RID
 
R1(config-router)#do sh ip b nei 12.0.0.2
BGP neighbor is 12.0.0.2, remote AS 12, internal link
 BGP version 4, remote router ID 2.2.2.2
 BGP state = Established, up for 00:00:08
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。(此处省略 N 1 行)
 
 
l    两个路由器通过 loopback 口建立邻居,在这种情况下,则要参照问题一中所讨论的情况,选举其中的一条路径进行发送。
R2(config)#do sh ip b s
Neighbor        V    AS MsgRcvd MsgSent   TblVer InQ OutQ Up/Down 
1.1.1 .1         4    12       7       6        3    0    0 00:02:51       
 
R2(config)#do sh ip b
 
   Network          Next Hop            Metric LocPrf Weight Path
r>i1.1.1.1/32       1.1.1.1                  0    100      0 i
 
 
 
2 .邻居建立的几点注意:
 
l        邻居之间必须互指 neighbor
l        ibgp 邻居是隔着几个路由器建立时,要确定所指邻居的 IP 地址必须在路由表中可达。
l        ebgp 邻居建立时,若其所指邻居的 IP 地址并非是处于自己的直连网段(如通过 loopback 口建立邻居),则必须要用如下命令
Neighbor 1.1.1.1 ebgp-multihop * * 代表跳数)
 
提出疑问 ebgp-multihop 后跟的跳数到底有何规律?
解决疑问 :通过实验验证很容易得出这样一个结论:当两个路由器试图建立 ebgp 邻居时,若非是通过直连网段进行建立的话(通过直连网段进行建立不需要配置 ebgp-multihop 命令),则后跟跳数和路由器的数量相同,举个例子说就是,若两个路由器隔者一个路由器建立 ebgp 邻居的话,则无论是通过物理接口还是 loopback 口,后跟跳数都是 3
 
 
二: BGP 防环和防黑洞机制
 
1.                IBGP 的水平分割原则 :从 IBGP 邻居所收到的路由信息,不会传递给其它的 IBGP 邻居,但可以传递给 EBGP 邻居,即 IBGP 的防环机制
注意 :若无此机制,那么当三个路由器两两相连,并建立了 IBGP 邻居之时,那么此时其中一个路由器发送的更新将在三个路由器之间无限循环。
 
2.                EBGP 防环机制 :当所接受的更新信息中包含自己所在区域的 AS 号,则拒绝接受。
3.                IBGP synchronization IBGP 同步) IBGP 路由信息,也必须从 IGP 路由协议中学习到,也就是 IBGP 的防黑洞机制。
注意 不少路由器的 IOS 默认关闭此特性,也用命令 no synchronization 手工关闭。
  
   
三: BGP 表和 BGP 的更新
 
1. BGP 更新:
 
l        BGP 中的 network 命令
BGP 路由器通过 network 命令来宣告路由信息,这里要注意的是, BGP 中的 network 命令并不存在接口激活的概念,当路由器 network 了某个网段后, BGP 会首先检查路由表,如果发现路由表中有该网段的信息(需要严格匹配,包括掩码),则会向所有邻居发送此条更新,这样的好处是, BGP 路由器宣告的路由信息将不必只局限于直连接口,只要是路由表中有的,都可以被宣告。
举例说明   R1(config-router)#do sh ip rou
 
 1.0.0.0/32 is subnetted, 1 subnets
C       1.1.1.1 is directly connected, Loopback0
     12.0.0.0/24 is subnetted, 1 subnets
C       12.0.0.0 is directly connected, Serial1/1
 
这时候想宣告 1.1.1 .1 ,则应当 network 1.1.1.1 mask 255.255.255.255
 
l        BGP 路由器转发更新的原则
1. 路由器从 IBGP 邻居学到的路由信息不会转发给自己其他的 IBGP 邻居,但是会转发给自己的 EBGP 邻居
2. 只有当自己收到的更新信息在 BGP 表中被优化了以后,才会被发送给其他的邻居
 
*        Clear ip bgp * soft out 命令
当在路由器上输入此命令时,路由器将会将其全部已优化的 BGP 条目向其所有邻居发送一遍
提出疑问 :此时接收到更新的邻居路由器,会像 OSPF 那样,选择覆盖原先老的条目吗?
解决疑问 :我们通过实验来验证这个问题
实验环境简述如下
R1 R2 相连并建立 IBGP 邻居, R2 R3 相连并建立 IBGP 邻居, R1 上宣告 1.1.1 .1/32 ,待 R2 R3 学到此条目后,在 R2 上输入
deb ip bgp ev
deb ip bgp update
此时在 R1 上输入 Clear ip bgp * soft out R2 上的 deb 输出信息为:
BGP(0): 12.0.0.1 rcvd UPDATE w/ attr: nexthop 12.0.0.1, origin i, metric 0, path 1
BGP(0): 12.0.0.1 rcvd 1.1.1.1/32...duplicate ignored
通过 deb 信息我们可以得知, R2 会认为 R1 发给他了一条重复的路由条目,而将其忽略掉
而事实上,在 BGP 表中, BGP 条目是不存在超时这个概念的,只有在如下两种情况下会让 BGP 表中的条目被清除:
 
*        告诉“我”这条 BGP 条目的邻居路由器“ down ”掉,于是“我”会将我”全部从该邻居路由器上学到的条目给清除
*        接收到了一条 BGP 条目的清除消息,这种消息会在两种情况下出现
情况一 :环境简述如下:
R1 与R2,R2与R3建立了BGP邻居关系,R1宣告了一条1.1.1.1/32,在某一时期,R1因为故障而“down”掉,R2会首先将1.1.1.1/32给清除,然后会发送一条清除消息给R3,R3收到后,也会将该条目给清除
情况二 :环境简述如下:
R1 与R2立了BGP邻居关系,R1宣告了一条1.1.1.1/32,在某一时期,R1发现在自己与1.1.1.1/32的连通性,于是R1会发送一个清除消息给R2,R2收到后便会将该条目清除
  注意: BGP damping 中,可能会出现符合上诉两种 BGP 条目清除的条件,但却依旧在 BGP 表中保留的现象,详见后面的 BGP damping 讨论
 
 
2 BGP 表:
 
l        路由器将会把从邻居那里收到的更新信息先写入 BGP 表,再来判断是否要写入路由表(后面会讨论)
l        先来看几个 BGP 表的示例:
拓扑简述如下:
R1 R2 建立 EBGP 邻居, R2 R3 建立 IBGP 邻居, R1 宣告直连网段 1.1.1 .1/32
 
首先 R2 bgp 表:
 
R2(config-router)#do sh ip b
BGP table version is 2, local router ID is 2.2.2.2
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal,
              r RIB-failure, S Stale
Origin codes: i - IGP, e - EGP, ? - incomplete
 
   Network          Next Hop            Metric LocPrf Weight Path
*> 1.1.1.1/32       12.0.0.1                 0             0 1 i
 
再在 R3 上看 BGP 表:
 
R3(config-router)#do sh ip b  
BGP table version is 2, local router ID is 3.3.3.3
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal,
              r RIB-failure, S Stale
Origin codes: i - IGP, e - EGP, ? - incomplete
 
   Network          Next Hop            Metric LocPrf Weight Path
*>i1.1.1.1/32       23.0.0.2                 0    100      0 1 i
 
我们可以看到, Status codes 在传递过程中是会变的,而 Origin codes 在传递过程却不会发生改变。
 
提出疑问: R1 上, 1.1.1 .1/3 明明是 BGP 通过 network 引入的,但是为什么 Origin codes 却是显示的“ i ”,也就是通过 IGP 引入?
 
解决疑问: BGP 看来,路由表中除了通过 BGP 学到的条目以外,其他的全都是属于 IGP 路由条目,当 R1 通过 network 宣告直连网段的时候,在 BGP 看来,该直连网段是自己从 IGP 路由条目中宣告进 BGP 的,所以 Origin codes 会显示为“ i
 
 
*        无法写入 BGP 表和无法写入路由表的几种情况
1. 无法被写入 BGP
实验环境如下:
R1 R2 通过 E0 口相连,并且各自都有一个 IP 地址为 1.1.1 .1/32 的环回口,两路由器运行 BGP ,顺利建立邻居关系。
R1 上打开如下 debug 命令:
deb ip bgp event
deb ip bgp updata
R2 宣告 1.1.1 .1/32 后,在 R1 上输入 sh ip b ,发现 bgp 表中没有 1.1.1.1/32
此时 R1 deb 输出信息为:
BGP: 12.0.0.1 announced my interface 1.1.1.1/32 back to me - ignored
由此可见原因是R1认为1.1.1.1/32是我自己的一个直连接口的IP地址,而R2却声称自己可达,这显然是不合理的,并且很有可能是一个环路,于是忽略此更新信息,拒绝写入BGP表。
且几分钟之后,R1会断掉与R2的邻居关系,deb 信心显示如下:
BGP: 12.0.0.2 reset due to BGP Notification sent
BGP-5-ADJCHANGE: neighbor 12.0.0.2 Down BGP Notification sent
这实际上是 BGP 为了避免潜在的环路所做的预防措施
 
另附 此条相关内容的讨论参见“ IP ,子网划分,精确匹配, VLSM 总结 .doc ”的第三页
 
 
2. 无法被写入路由表
   此种情况一般是因为路由表中已有一条 AD 值比 BGP 更低的路由条目,此时在 BGP 表中,该路由条路的 Status codes 将会被标记为 r

你可能感兴趣的:(tcp,Path,NetWork,路由器,Deb,delay)