您的位置:首页 > 编程语言 > PHP开发

STP

2016-01-19 11:09 411 查看
网络中要有些冗余拓扑可以防止单点故障导致网络瘫痪,但冗余拓扑会带来一些问题:广播风暴,多帧复制,MAC地址表抖动。

广播风暴:比如交换机的透明桥接,交换机对收到的帧不做任何处理和修改直接原封不动地转发。但透明桥接会出现问题。如SW1和SW2间连接多跟线,SW1从某根线转发帧给SW2后,因为帧没有任何修改,SW2并不知道是SW1转发过来的,会从其他线再转发回给SW1,形成环路。如果是两个路由器出现环路,虽然会导致不可达,但因为有TTL值,每次转发会减1,形成环路后不多久就中断了,不会造成设备崩溃。但二层一旦出现环路会耗尽交换机所有处理能力,造成设备崩溃。

多帧复制:2层环路收到相同帧浪费带宽。MAC地址表抖动:2层环路能从多个方向收到环外地址,那源MAC地址到底是哪个呢?

IEEE 802.1d STP(Spanning-Tree Protocol生成树协议)就是为了解决这些问题的:在冗余拓扑链路上阻塞冗余端口,使网络中节点在通信时只有一条链路生效。当通信故障时将处于阻塞状态的端口打开,以保证网络正常通信。

默认都是开启STP协议的,不需要手动启动,一启动交换机就会自动启动STP,你可以关闭掉但最好别这么做。比如你认为你的网络肯定不会出现环路,就是简单的PC1->SW1->PC2,只有1台交换机也不建议你关闭生成树协议。因为你不能保证不会粗心大意在交换机上将两个端口用线连起来形成环路。

STP分类:分IEEE和Cisco两大类。

IEEE:802.1d(STP),802.1w(Rapid-STP),802.1s(MST)。其实它们都是STP协议,只是有些细节不一样,三者可以相互兼容。

Cisco:PVST/PVST+,Rapid-PVST,MIST/MST。分别依次对应上面IEEE的三种标准。

最先开发出来的是IEEE 802.1d(STP)标准生成树,但它收敛时间很慢(30s-50s)。Cisco与之相对的是PVST/PVST+(PVST即ISL,PVST+即ISL加上802.1Q),收敛时间也是30s-50s。区别是:IEEE是基于交换机的,而Cisco是基于VLAN的。比如网络里有100个VLAN,那802.1d会无视VLAN数量,用一颗生成树来阻塞冗余端口。而PVST/PVST+会根据每个VLAN用生成树阻塞冗余端口,即100个VLAN会有100颗树,好处是可以使网络更合理,可以负载均衡,如50颗阻塞左边端口,剩下50颗阻塞右边端口,坏处是增加了开销。

802.1d和PVST/PVST+需要30s-50s的收敛时间,在网络飞速发展的时代,是无法忍受的。因此IEEE在802.1d基础上改进成802.1w(Rapid-STP)快速生成树,Cisco同样改进成Rapid-PVST,它们的收敛时间小于1s。

上面说了IEEE是基于交换机,因此无法负载均衡。Cisco可以负载均衡,但有100个VLAN就要维护100颗树,实在不堪重负。结合了两者的优点,IEEE进一步改进成802.1s(MST)分组生成树,Cisco改进成MIST/MST。这样前50个VLAN划到一组,后50个VLAN划到一组,只要维护2颗树。既能负载均衡又大大节省了开销。

STP报文:BPDU

交换机间用BPDU(Bridge Protocol Data Unit)报文来确定哪个交换机上需要阻塞哪个接口。默认每2秒发送一次BPDU组播,组播地址为01-80-C2-00-00-00。交换机会保存收到的高优先级的BPDU并泛洪,丢弃低优先级的BPDU。等选举结束稳定后指定端口会发BPDU。

先看一下BPDU报文里的内容:



Protocol ID 固定为0。Version:0为802.1d,1为802.1w,2为802.1s。Message type:0为普通BPDU,80为TCN。

Flags字段: 0位:TCN的ACK。1位:Agreement。2/3位:Forwarding/Learning。4/5位:00表示Unknown,01表示Alternative/BackUp,10表示Root,11表示Designated。6位:Proposal。7位:Topology Change。802.1d时只用到0位和7位,都和TCN相关,TCN的ACK报文里0位置1,TC报文里7位置1。802.1w里中间6位也用到了,2/3位表状态,4/5位表端口角色,1/6位表握手。

Root ID / Cost of path / Bridge ID / Port ID:用于选举。

RootID:根桥的Bridge ID。一开始都认为自己的Bridge ID是最小的,因此第一个BPDU里Root ID就是自己的Bridge ID,都认为自己是网络的根。等选出根桥后,所有BPDU里的Root ID都是根桥的Bridge ID

Cost of path:IEEE的带宽标准:10G是2,1G是4,100M是19,10M是100。最新将依据IEEE 802.1t标准:10M为200万,依次类推,100M为20万,1000M为2万,10G为2千。另外注意这是计算入接口的开销,比如Fast Ethernet链路上两端口都是19,那交换机收到BPDU里cost值是0+19=19,并不是38

Bridge ID是交换机的桥ID。有8个字节,前2个字节是优先级,后6个字节就是MAC地址。前2字节优先级中前4bit是优先级,总是4096的倍数,因此0000代表0,0001代表4096,0010代表8192,1111代表61440。默认是1000即8代表32768。后12bit是Extend System ID即VLAN标记以区分BPDU是为哪个VLAN服务的。因此如果VLAN10且优先级是4096的话,总优先级是4096+10=4106。选举时如果优先级一样就比较后6个字节MAC地址。

Port ID是端口的物理ID号

Message age:收到BPDU就开始从0s开始计时。另外每穿过一个交换机都会加1s,如SW1->SW2->SW3,其实穿过3台交换机时间很快,但Message age时间至少是2s

Max age:20s。Hellotime:2s。Forward delay:15s。

(上面BPDU报文字段如果不明白干什么用的,可以结合下面STP选举过程综合起来理解)

STP选举过程:

1.选举一个根桥(根据Bridge ID,最小的作为根桥)

2.在每个非根桥交换机上选举一个根端口(每个交换机都计算去往根桥最近的路径,该端口就是根端口,每个非根桥上有且只有一个根端口)。依据的是接收到的BPDU

3.在每个网段上选举一个指定端口(因为现在是以太网因此等于每条链路都要选一个指定端口)。依据的是发送出去的BPDU

4.如果一个端口既非根端口,又非指定端口,那该端口将被阻塞掉

如下图:网络需要一些冗余连接,SW1可以直接转发给SW2,也可以通过SW3转发给SW2。如果没有STP协议会形成环路,有了STP后,SW2的f0/2口将被阻塞掉,如果哪天SW1和SW2间链路出问题了,那SW2的f0/2口将被解除阻塞,SW1可以经由SW3和SW2通信。



现在看一下STP的选举过程:(选举虽然分为4步,但其实是非常快的,一瞬间就能全部完成)

第一步:三台交换机间要选举出一个根桥,Bridge ID最小的就是根桥。(STP默认就是开启的,不用手动开启,直接看STP结果即可)



如截图所示,三台交换机的Brideg ID的优先级都是32768(默认值),因此比较MAC地址,SW1的MAC地址最小,因此SW1将被选为根桥。SW1被选为根桥后,三台交换机的Root ID都将是根桥SW1的Bridge ID

第二步:在每个非根桥交换机(即SW2,SW3)上根据接收到的BPDU,选举根端口。选举依据依次是:

1.根桥Root ID最小。(因为根桥选出后,所有BPDU里的Root ID都是根桥的Bridge ID,因此其实第一条Root ID是肯定选不出的,要用后4条来选举)

2.去往根桥Cost of path最小(参照上面BPDU报文里该字段的解释)

3.发送方Bridge ID最小(如果两个交换机间连两根线,那这两个端口根据前3条就选不出了,需要下面第4条)

4.发送方Port ID最小(如SW2连1根线到HUB,HUB连两根线到SW3,那SW3上的两个端口根据前4条就选不出了,需要下面第5条)

5.接收方Port ID最小

查看非根桥交换机SW2和SW3上端口:



根桥Root ID都是SW1的Bridge ID,选不出。比较各端口去往根桥SW1的开销,SW2的f0/5口和SW3的f0/1口的开销最小,因此这两个端口被选为根端口。拓扑图中打圈的两个端口为根端口。为何开销是0呢?因为参照上面BPDU报文里该字段的解释:从SW1上发出报文开销是0,因此SW2的f0/5口收到的BPDU里开销是0。如果途径SW3的话,SW3收到SW1发出的开销是0的报文,SW3转发时要加上入接口f0/1口的开销19,因此SW3的f0/2口发出的BPDU里开销是0+19=19。SW2的f0/2口收到的BPDU里开销就是19。

第三步:每条链路中选一个指定端口,选举依据和选举根端口是一样的,参照上面。

SW1所在链路上,因为SW1是根桥,因此它的两个端口的Cost of path肯定都是0,为指定端口。(根据实际经验:一条链路上如果一个端口被指定成根端口了,那另一个端口只能是指定端口。这也能推断出根桥SW1上的两个端口是指定端口)。SW2和SW3链路上,参数上面截图,两个f0/2的cost均为19,比较不出。然后比较发送方的Bridge ID,SW2和SW3的Bridge ID的优先级都一样是32768,但SW3的MAC地址小,因此SW3的f0/2口成为指定端口。拓扑图中正方形的端口将成为指定端口。

第四步:将非根端口或非指定端口阻塞掉。即SW2的f0/2口阻塞掉(截图中状态为BLK,其他端口为FWD),这样SW2和SW3间的链路将down掉。避免了环路。

修改优先级:

如果想让某交换机成为根桥,那需要修改Bridge ID中的优先级(MAC地址无法修改):



也可以用SW1(config)#spanning-tree vlan 1 root primary/secondary命令来修改优先级。该命令本质还是修改优先级的值,因此primary等价于SW1(config)#spanning-tree vlan 1 priority 8192,secondary等价于SW1(config)#spanning-tree vlan 1 priority 16384。即使你设成primary,其他改优先级比你小(比如改成0),你也成不了根桥。因此最好如截图中那样直接修改值吧。

STP的端口状态

Disabled:不发送任何报文,如接口shutdown

Listening:接口一旦no shutdown,就进入该状态。通过BPDU来选举该端口角色(根端口/指定端口/其他)。如果该端口被选为根端口或指定端口,等15s时延(forward delay)进入Learning状态。否则立即进入Blocking状态阻塞该端口。

Learning:进行MAC地址学习。Learning状态要等15s时延(forward delay)才能进入Forwarding状态。

Blocking:如果接口是不是根端口或指定端口,就进入阻塞状态。该状态下能继续接收但不会发送BPDU

Forwarding:开始接收并转发数据。能继续接收并发送BPDU

所以802.1d的交换机,当PC接入交换机,交换机端口立即进入Listening状态。因为PC不会发送BPDU,所以交换机端口肯定会被选为指定接口,15s后进入Learning状态。Learning状态下开始学习PC的MAC地址,15s后进入Frowarding状态能接收并转发数据。也就是说PC插到交换机上后要30s后才能上网。在以前没问题,但现在看来30s的时间太长了。因此要用802.1w或802.1s。

TCN报文:

BPDU分普通的BPDU和TCN(网络拓扑发生变化时的报文)两种报文。上面介绍BPDU报文字段里,有个Message type:0为普通BPDU,80为TCN。TCN(Topology Change Notification)网络拓扑变化报文,是一种特殊的BPDU报文。当网络拓扑发生变化时,该交换机的端口会向根桥发送特殊BPDU报文。报文里只有最上面Protocol ID(固定为0),Version(0为802.1d,1为802.1w,2为802.1s),Message type(80)这3个字段,剩下的如Root
ID,Cost of path等都是没有的。因此TCN报文的作用非常的简单,就是通知根桥网络拓扑结构发生变化了。

举个例子SW1是根桥,PC->SW3->SW2->SW1。如果PC插头拔掉,SW3会向根桥SW1发送TCN报文,通知根桥SW1网络发生变化了。SW3的TCN报文先发送给SW2,因为TCN报文是可靠传送的,因此SW2需要回复ACK(※1)。SW2将TCN报文转发给根桥SW1,SW1同样回复ACK。这样根桥SW1就知道网络拓扑发生变化了,会向全网发送BPDU(※2),全网交换机会将MAC地址表老化时间从300s变为15s,15s后全部老化全网重新学习。

上述过程是802.1d,在802.1w和802.1s中过程被简化了。802.1w和802.1s就没有TCN报文了,SW3直接发TC报文通知全网。

※1:该BPDU里Flags字段里的0号位Topology Change ACK置1(参照上面BPDU报文的介绍)

※2:该BPDU又称TC报文,BPDU里Flags字段里的7号位Topology Change置1(参照上面BPDU报文的介绍)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: