1、BPDU报文格式
交换机之间使用BPDU(网桥协议数据单元)来交换STP(生成树协议)信息,BPDU报文分为配置BPDU和TCN BPDU两类分别对应STP的两种应用场景(STP工作在数据链路层)。
帧头 | Data(BPDU报文) | FCS |
配置BPDU(Configuration BPDU)报文:用来进行生成树计算和维护生成树拓扑。
Protocol ID | Protocol Version ID | BPDU Type | Flags | Root ID | Root Path Cost | ||
2字节 | 1字节 | 1字节 | 1字节 | 8字节 | 4字节 |
Bridge ID | Port ID | Message Age | Max Age | Hello Time | Fonward Delay | |
8字节 | 2字节 | 2字节 | 2字节 | 2字节 | 2字节 |
TCN BPDU(Topology Change Notification BPDU)报文:当拓扑结构发生变化时用来通知相关设备的报文。
Protocol ID | Protocol Version ID | BPDU Type | |
2字节 | 1字节 | 1字节 |
Protocol ID:协议类型,固定为0x0000,表示生成树协议。
Protocol Version ID:协议版本号,生成树目前有三个版本,0x00代表STP。
BPDU Type:BPDU类型,这个值用来区分该报文是配置BPDU还是TCN BPDU。
Flags:BPDU标志位,由8位组成,其中最低位(0位)为TC(Topology Change,拓扑改变)标志位,最高位(7位)为TCA(Topology Change Acknowledge,拓扑改变确认)标志位,其他6位保留不使用。
Root ID:根桥ID,标识已被选为根桥的设备标识,前2字节代表优先级,后6字节为其MAC地址。
Root Path Cost:根桥路径开销,到根桥的路径开销。
Bridge ID:发送网络桥ID,发送该BPDU的网桥信息,前2字节代表优先级,后6字节为其MAC地址。
Port ID:端口ID,发送该BPDU的网桥端口ID,包含该端口的编号和优先级。
Message Age:BPDU在网络中传播的生存期,代表该BPDU报文在网络中已传播了多久。
Max Age:超时时间,若超过该时间还没有收到根桥发出的BPDU数据包,则交换机将向其他所有的交换机发出BPDU数据包,重新计算生成树。
Hello Time:根网桥连续发送BPDU的时间间隔。
Fonward Delay:传输时延,交换机端口状态迁移所用时间。当网络发生故障导致生成树重新计算时,重新计算得到的新配置消息无法立刻传遍网络,如果端口状态立刻迁移的话可能会产生暂时性的环路。所以生成树协议采用状态迁移机制,保证新的配置消息已传遍整个网络。
2、交换机端口状态
运行生成树协议的交换机在正常工作期间其端口总是处于转发或阻塞状态,当设备识别到网络拓扑结构发生变化时,交换机自动进行状态转换,期间端口暂时处于监听和学习状态。
Listening:监听,交换机启动、接入网络或识别到网络拓扑结构发生变化时所有端口都切换到监听状态,此状态下不会接收和转发数据,但可以接收和发送BPDU。监听状态下各设备和端口将确定自己的角色,选举出根桥、根端口、指定桥和指定端口。随后根据选举结果将部分端口转为Learning状态,部分端口转为Blocking状态。
Learning:学习,选举完成后交换机参与工作端口的将转为学习状态,主要是学习并完善MAC地址表。该状态下不会接收和转发数据,但可以接收和发送BPDU。
Forwarding:转发,MAC地址表学习完成后交换机就可以开始工作,参与工作的端口就进入转发状态。该状态下可以接收和转发数据、学习MAC地址、接收和发送BPDU。
Blocking:阻塞,选举完成后交换机部分端口进入阻塞状态,并在工作期间保持该状态。该状态下不能接收或转发数据,不能发送BPDU,只能接收BPDU。
3、STP的工作过程
选举根桥:开启STP协议的交换机启动后默认自己为根桥,此时所有端口进入监听状态并向端口上相连的其他交换机发送配置BPDU报文。该报文中根桥ID就是发送设备自己的ID,交换机发出BPDU的同时也会接收到来自其他设备的BPDU,它会将这两个BPDU报文进行对比。先比较根桥ID中的优先级,数值越小则优先级越高。该优先级可由用户设置,若用户没有设置则所有交换机的默认优先级都是一样的,此时就比较根桥ID中的MAC地址,也是数值越小的优先级越高。若设备发现自己收到的BPDU中根桥ID的优先级较自己当前发送的BPDU高,则设备开始转发优先级较高的BPDU。通过这种方式整个网络很快地就只会发送根桥ID优先级最高的BPDU,同时大家也都知道了那台设备的BPDU优先级最高,并认同该设备为根桥。
在上图所示的网络中,由于交换机的默认优先级一致,所以比较其MAC地址得到SW1的优先级最高,故应选取SW1为根桥。
选举根端口:选举出根桥后,网络中所有设备都只会转发根桥发出的BPDU。根桥发出的BPDU中有一个“根路径开销”字段,BPDU从某端口进入交换机时该字段会累加该端口的“开销值”,于是交换机向其他设备转发根桥的BPDU时,根路径开销字段会不断累加各交换机接收端口的开销值,此值可由用户设置,若不设置则默认都是一样的(一般设置时会将链路两端的开销值设置为一样)。网络中某交换机可能从多个端口都收到来自根桥的BPDU,他比较所有的BPDU中路径开销字段的值,并认为路径开销字段值最小的BPDU为最佳,接收到该BPDU的端口为根端口。若多个端口收到的BPDU中路径开销字段值都一样,交换机就将端口ID最小的那个指定为根端口,若端口ID也一样则MAC地址值较小的为根端口。根端口在同一台交换机上不同端口中选出,其意义在于若根桥发送一段数据到该设备,则通过根端口进来的路径是最佳的。根桥没有根端口。
上图所示的网络中,以SW1为根桥,交换机的各端口收到来自根桥的BPDU的路径开销计算和根端口选举如下表所示:
交换机 | 端口 | 路径开销 | 根端口 |
SW2 | sw2-0 | 19 | sw2-0 |
sw2-1 | 19+4+19 = 42 | ||
SW3 | sw3-0 | 19+19 = 38 | sw3-1 |
sw3-1 | 19+4 = 23 | ||
SW4 | sw4-0 | 19 | sw4-0 |
sw4-1 | 19+19+4 = 42 |
选举指定端口:选举出根桥后,交换机SW2和SW3会在各自端口收到不同方向发来的BPDU,其中sw2-1会收到sw3-0转发的BPDU,而sw3-0也会收到sw2-1从另一方向发来的BPDU。交换机SW2和SW3各自收到后就会对这两个BPDU进行比较,根路径开销字段值较小的那个为优,若值一致则编号较小的那个为优,若编号也一致则MAC地址值较小的为优,发送该BPDU的端口就选为指定端口。指定端口从两台不同设备的两个互连端口中选出,其意义在于从两台互相发送BPDU的设备中选出最优的发送方向。
上图所示的网络中,交换机各端口发出的BPDU的路径开销计算和指定端口选举如下表所示,由于所有BPDU都是从根桥即SW1发出的,所以根桥端口发出的BPDU路径开销为0:
交换机 | 端口 | 路径开销 | 指定端口 | |
SW1 - SW2 | sw1-0 | 0 | sw1-0 | |
sw2-0 | 19+4+19 = 42 | |||
SW1 - SW4 | sw1-1 | 0 | sw1-1 | |
sw4-0 | 19+19+4 = 42 | |||
SW2 - SW3 | sw2-1 | 19 | sw2-1 | |
sw3-0 | 19+4 = 23 | |||
SW3 - SW4 | sw3-1 | 19+19 = 38 | sw4-1 | |
sw4-1 | 19 |
阻塞端口:选举出指定端口和根端口后,各交换机就有了最佳接收端口和最佳发送端口,此时将非指定端口、非根端口阻塞,则整个网络的环路消失,同时根桥到各交换机的路径为最优。
上图所示的网络中,sw3-0即不是根端口也不是指定端口,所以将其阻塞,则sw2-1到sw3-0的路径中断,网络环路消失。
【能否即是根端口又是指定端口】成为根端口的条件是同一台交换机上,从根桥到达该端口的路径开销最小,成为指定端口的条件是两个交换机直连的两个端口中发出BPDU路径开销最小。如下图所示的两台交换机,我们先假设端口sw1-1为指定端口,从端口sw1-0进入的BPDU路径开销值为A,从宽sw4-1进入的BPDU路径开销值为B,两台交换机直连的端口开销值为C。
由于sw1-1为指定端口,所以从sw1-1发出的BPDU路径开销值小于从sw4-0发出的BPDU路径开销值,所以我们可以得出A<B。
再假设sw1-1也为根端口,则从sw1-1收到的BPDU路径开销值小于从sw1-0收到的BPDU路径开销值,所以可以得出A>B+C。
根据上面的计算,若sw1-1为指定端口则A小于B,若sw1-1为根端口,则A大于B+C,互相矛盾,则我们可以得出结论一个端口不可能即是指定端口又是根端口。
【STP的作用】实际应用中为了使链路更加稳定,用户总是使用多条路径来实现链路以达到的目的,或网络相当复杂时就会产生一个或数个环路。环路的产生易导致广播风暴、多帧复制和MAC地址表抖动等副作用,为了解决这些问题就产生了“生成树协议”。生成树将复杂的网络拓扑看成是一棵树,选取其中一个交换机作为树根称为“根桥”,与之相连的交换机选取一个“根端口”用于接收来自根方向的数据,选取一个“指定端口”用于发送来自根方向的数据,并将其他端口阻塞。实现了数据从根出发后可到达网络中所有设备但不会出现环路和重复接收的情况,同样,数据从任意设备出发到达另一设备的路径都是唯一的。
【环路的危害】环路主要导致三个问题,广播风暴、多帧复制和MAC地址表抖动。
广播风暴:简单的讲是指当广播数据充斥网络无法处理,并占用大量网络带宽,导致正常业务不能运行,甚至彻底瘫痪,这就发生了“广播风暴”。假设AB两点成环,位于同一交换机。A发出未知地址的广播包,B接收到后由于交换机中无此MAC,重新发起一个广播,此广播包又到达A,由于目标无法从MAC表中匹配,A会再次发一起个广播,这样不停循环下去,就产生了广播风暴。
多帧复制:单播的数据帧可能被多次复制传送到目的站点。很多协议都只需要每次传输一个拷贝。多帧复制会造成目的站点收到某个数据帧的多个副本,不但浪费了目的主机的资源,还会导致上层协议在处理这些数据帧时无法选择,严重时还可能导致不可恢复的错误。
MAC地址表抖动:也就是MAC地址表不稳定,这是由于相同帧的拷贝在交换机的不同端口上被接收引起的。如果交换机将资源都消耗在复制不稳定的MAC地址表上,那么数据转发的功能就可能被消弱了。
【端口开销】网络中接入的交换机型号是多种多样的,同一交换机的不同端口其速率性能也并不一致,所以数据从A设备到达B设备或B设备到达C设备的损耗或速率并不一致,即传输成本不一致,于是提出一个端口开销的概念来区别这种差异性,两个直连端口的开销总是一致的,因为数据的接收和发送是双向的,不存在发送快接收慢的情况。
【路径开销】数据在网络中传递时会通过一个或数个端口,这些端口开销的累积值就是路径开销,代表了从链路一端到达另一端的总成本。
【网桥】早期的网桥就是用来连接两个由集线器构成的网络,因此说网桥可以隔离冲突域。可以将网桥看成只有两个端口的交换机,同样的,若交换机使用两个端口连接着两个网络,则也可以说这个交换机的两个端口实现了一个网桥。所以在前面的叙述中时常将网桥与交换机混为一谈。
原文地址:http://bigmaomao.blog.51cto.com/1531641/1850600