STP

21 Jul

网络中要有些冗余拓扑可以防止单点故障导致网络瘫痪,但冗余拓扑会带来一些问题:广播风暴,多帧复制,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报文里的内容:

20160109140332452

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通信。

20160109160858049

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

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

20160109173348314

如截图所示,三台交换机的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上端口:

20160109151040393

根桥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地址无法修改):

20160109161755822

也可以用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报文的介绍)

Leave a Reply

Your email address will not be published. Required fields are marked *