环路那些事

为什么会有环路?环路的危害是什么?

很多时候,为了防止单点故障,如图(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的优先级。