环路那些事
为什么会有环路?环路的危害是什么?
很多时候,为了防止单点故障,如图(a),会人为地在链路中添加冗余链路,用作备份链路,以提高网络的可靠性,但是这样的代价是在会网络带来环路,如图(b)所示。
图(a)无冗余链路
图(b)冗余环路
图(b)中的环路存在三大危害:广播风暴、重复帧和交换机mac地址表不稳定。
什么是广播风暴?怎么消除广播风暴?
在图(b)的拓扑场景下,当主机A和主机B想要通信时,主机A需要先获取到主机B的mac地址,由此主机A会发送ARP广播报文来获取主机B的mac;而这个广播报文会经过A路线(1/1—>1/2—>2/2—>2/1—>1/1)和B路线(2/1—>2/2—>1/2—>1/1—>2/1)两个方向永无止境的被循环复制转发,最后整个链路都充斥着同一个广播报文(抓到的报文如图(c)所示),直到链路带宽资源被耗尽,链路无法再正常通信,这就是广播风暴。
为了停止上述的广播的风暴,除了人为地切断物理冗余链路(复杂的现实链路中难以执行),另外一种方法就是启用STP生成树协议,从逻辑上切断环路,阻止广播风暴。在交换机A和交换机B上开启生成树协议STP后,主机A和主机B恢复正常通信
STP是什么?它的主要作用是什么?
STP是生成树协议(Spanning Tree Protocol),定义在IEEE 802.1D 中。STP通过阻塞冗余链路,来消除桥接网络中可能存在的环路;并在当前活动路径发生故障时,STP**冗余链路恢复网络连通性。简单来讲就是,STP允许两个网络节点之间存在多条物理链路,每一次STP只允许其中一条主链路处于“通”的状态,其他链路则处于“阻塞”的备份状态,当主链路发生故障时,STP经过相应的算法,自动启用一条备份链路,从而提高网络的可靠性。
STP的切断环路的具体流程是怎么进行的?
交换机之间周期(一般为2秒)性地发送STP的桥接协议数据单元(Bridge Protocol Data Unit ,BPDU),用于实现STP的功能;BPDU报文格式如下:
Ø Protocol ID:协议号,目前都是0
Ø Version :版本号,802.1D的版本号是0
Ø Message Type :消息类型,指名为配置BPDU还是TCN BPDU
Ø Flags:表明此报文是TC报文还是TCA报文
Ø Root ID:根交换机ID
Ø Cost ofPath:到根交换机的路径开销
Ø Bridge ID:发送BPDU的交换机ID
Ø Port ID:发送BPDU的端口ID
Ø Message Age:消息寿命,每经过一个交换机递增1,为各网桥到达根交换机的跳数
Ø Maximum Time:当一段时间未收到任何BPDU,生存期达到Max Age时,网桥则认为该端口连接的链路发生故障。默认20秒
Ø Hello Time:发送BPDU的周期,默认2秒
Ø Forward Delay:BPDU全网传输延迟,默认15秒
其中,
1)、路径开销修订前后的802.1d路径成本 :
2)、BID:
Ø 网桥优先级取值范围:0到65535;默认值:32768(0x8000)
Ø 首先判断网桥优先级,优先级最低的网桥将成为根网桥
Ø 如果网桥优先级相同,则比较网桥MAC地址,具有最低MAC地址的交换机或网桥将成为根网桥
3)、端口ID:
Ø 端口优先级是从0到255的数字,默认值是128(0x80)
Ø 端口优先级越小,则优先级越高
Ø 如果端口优先级相同,则编号越小,优先级越高
Wireshark抓到的BPDU报文如下:
STP切断环路的步骤如下:
1)、选择根网桥(Root Bridge);
1>网桥ID最小。
2)、选择根端口(Root Ports)(非根桥上选择一个根端口);
1>到根路径成本最低;
2>与本端口直连的上级网桥ID最小;
3>与本端口直连的上级桥端口ID最小(即对端端口ID最小)。
3)、选择指定端口(Designated Ports)(在每个网段上,选择1个指定端口);
1>根路径成本最低;
2>本网桥ID最小;
3>本网桥上端口ID最小。
4)、将既不是根端口也不是指定端口的端口状态设置为阻塞状态。
验证实验:构建最简单的环路(两个交换机用以验证stp),如下图所示:
默认交换机优先级为32765,默认端口优先级为128,sw1的mac地址为00d0.f822.34b0,sw2的mac地址为001a.a90f.5016。
1)、验证根桥的选择和个端口的选择
默认条件下,各交换机优先级都相同,各端口优先级也都相同,那么按照前述理论,SW2的mac地址较小,则根桥应该是sw2;而根桥sw2的端口8比10小,则8口对端的2口应该是sw1的根端口,10其对端的8口冗余应该置为阻塞状态,打开生成树,验证是否如此:
在sw1上查看生成树:
确实sw2为根桥,且sw1的跟端口是2;再查看sw1的8口:
转发状态为1(即blocking),端口角色为备份端口
验证结论:符合理论
2)、端口ID中含有两个字符意义(优先级和端口号),到底是先比较优先级还是先比较端口号?
在上述优先级相同的情况下,已经明确是比较的端口号,在此基础上,更改根桥sw2上的端口10优先级小于8口的优先级,如果sw1的根端口转为8则验证先比较优先级,反之则先比较端口号:
更改根桥sw2的10口的优先级为64,而8口的优先级依然是128:
查看sw1上的端口状态变化情况:
实验发现,sw1上端口8和2的角色发生对调,证明先比较的是优先级
3)、验证根桥id中优先级与mac地址谁先做比较
在优先级相同儿mac地址不同的情况下已经知道了mac地址小的被选为根桥;现在更改优先级,将sw1的优先级改为更小的4096,而sw2的优先级依然为默认值32768,查看根桥是否变化
实验证明,根桥变为mac地址较大的sw1,由此说明,先比较的桥ID的优先级。