Stp基础
- 交换环路与广播风暴,解决交换环路的技术汇总
交换机认知:交换机收到任何一个帧,都会认为此主机链接在该接口上,并记录帧中的源mac地址,将接收接口、smac、vlan汇总成cam表项。
出现环路的原因
1、设计网络时有冗余备份。
2、交换机的认知(根本原因)
PCA——SW1—(两根冗余链路)—SW2——PCB
假设AB属于同一个网络,通信之前需要ARP解析B的mac地址,此时A会发送arp报文,SW1会记录主机A的mac地址和接收接口,并拷贝两份泛洪发送,当SW2收到ARP报文会记录主机A的mac地址,同时泛洪给下面的接口和右边链接PCB的接口,此时SW1重新学习到SW2泛洪回来的数据,会重新学习关于主机A的mac地址表项,此时关于SW1会认为主机A链接在右下角的接口上,覆盖掉原来的表项,(此时出现交换环路)SW2右下角的接口接收到流量又会将cam表项翻动,再次拷贝两份泛洪,导致两端的cam表项不停翻动,此时当B回包给主机A时,交换机就会将流量通过左下角的接口发出,此时SW1收到后由于CAM表已经改变,又会将流量从右下角的接口发送给SW2,SW1又会将流量通过左上角 发送回 SW2(实际情况哪个接口并不可控反正到不了主机A)此时数据会来来回回,永无止境的发送下去,直到消耗完交换机的资源为止。(这就是广播风暴)
解决方式:
- 不设计冗余(有单点故障,一般不会使用的)
- 运行交换的路由协议(需要启用大二层协议,要求高,需要交换机支持大二层)
- 堆叠(分为横向堆叠和纵向堆叠,现网中用的特别多)
- 运行生成树协议(比较浪费资源,堵塞端口,牺牲了交换机的转发能力)
Spanning tree protocol(生成树协议)
防环原理:
- 确定交换机间无环最优路径,阻塞所有冗余次优路径
- 实时监控链路状态,一旦拓扑变更,立即重新收敛
IEEE
802.1D stp生成树协议
802.1W rstp快速生成树协议
802.1S mstp 多进程生成树协议
思科的1D和1W叫做PVST和RPVST(基于vlan的生成树协议和基于vlan的快速生成树协议,可以做基于vlan的负载均衡)
华为叫做cst和rcst(通用生成树协议和快速通用生成树协议,相比于思科可以减少资源消耗,但是华为和思科的私有生成树协议是不兼容的,所有其他厂商都是使用cst只有思科使用pvst)
802.1D由于从监听到转发需要经过30S时间,所以当主机插上交换机接口也是需要30S才能进行上网,发现拓扑变更最长需要20s,最短立即发现,重新收敛也需要两倍forwarding time,1W使用分段收敛,从运行到选举完毕到能够转发数据,是可以实现毫秒级收敛的。发现拓扑变更最多只需要6s,从发现到能够转发数据基本上零延迟。1S底层机制是1W的,但是解决了兼容性问题,在混合厂商的网络环境中使用也不会有任何压力。
运行生成树后进行选举
- 选举根桥
- 在每一台非根桥上选举唯一的根端口
- 在交换机间选举唯一的指定端口
前两部可以确定最优路径,第三步选举是为了通过指定端口来转发bpdu报文,通过BPDU实时监听链路状态。(只能在中继链路传递)
BPDU(网桥协议数据单元):三步选举都是通过此报文进行选举的
交换机默认行为:一台交换机没有收到任何的bpdu我就认为自己是根桥,接口没有收到任何的bpdu我就认为自己是指定端口
根桥:网络中优先级最高的交换机,根桥可以通过启用STP的所有接口来周期性的发送bpdu(配置bpdu)还有一种叫做TCN-bpdu(只有在拓扑更新的时候才会发送)周期为2S一次,上来每台交换机都会认为自己是根桥,所以一开始大家会交换bpdu:包含bridge id(BID网桥标识符)一共8字节,前两个字节是优先级(默认为32768,只能4096,4096的改)拿背板mac地址中最小的值来做他的mac地址)所以每台交换机的BID是全球唯一的
Bpdu包含字段
- protocol id:描述生成树协议
- version:描述生成树版本
- massage type:描述bpdu类型(如果是配置bpdu为0,如果是tcn-bpdu就是0x80)
- flag:携带一些特殊标记实现特殊功能
- route-id:描述根桥的bid
- cost of path:(根路径代价)描述一个非根桥的交换机到根桥的度量值是多少(使用带宽来判断)如果一台交换机收到一个bpdu并认为对方是根桥,会根据接收bpdu的接口带宽算出自己的度量值累加再发送给其他非根桥。(控制层面bpdu的接收接口来累加度量值)每传一次都会改变为接收接口的度量值累加。
- bridge id:转发者bridge id,描述我的bid,(route-id)不会改变,这个字段会改变,每传一跳都会改变为转发者的bid
- prot id:描述接口id,前一个字节是优先级,后一个字节是端口编号(优先级只能16,,16的改。)每传一次都会改变为发送端口的pid
- message age:bpdu产生时间(以跳数为计时器,不能超过20,超过20则丢弃)</