前言:

       在了解环路之前得先了解交换机的工作原理,当然交换机的基本工作原理其实非常简单,只有“单播转发与泛洪转发”、“交换机MAC地址表”这两个!其他的如vlan,生成树等也是在此基础上增加的,弥补交换机基础工作原理上的不足,如vlan划分广播域,生成树解决环路,当然这些高级功能也只有比较高级的交换机才有,不过现在网络技术已经很普遍了所以这些功能也慢慢变成了交换机的基础标配功能。如果您已经非常清楚“单播转发与泛洪转发”,“交换机MAC地址表的作用及建立过程”那就很容易了解“环路”是怎么回事。

正常结构图:

 环路过程: 

假设PC1向PC2发起通信(第一次通信),目的地址:f1,源地址: a1。

PC1查找自己的arp表,查看1.1.1.2对应的mac地址,因为是第一次通信,肯定是没有PC2的相关arp记录的,所以这时候它会发送一个arp广播,该报文PC1的PC1/1口出去,到S1交换机的s1/2口,S1交换机收到这个帧就会首先进行mac地址表学习【a1:s1/2】,然后因为是广播帧需要进行泛洪转发(泛洪给除s1/2外的其他端口);

广播帧从s1/3发出到s2/3,S2交换机收到这个帧也会首先进行mac地址表学习【a1:s2/3】然后也因为是广播帧所以进行泛洪转发(泛洪给除s2/3外的其他端口,也就是s2/2)PC2的pc2/1端口收到从交换机S2的s2/2发来的广播,查看发现目的地址是自己然后会进行arp缓存表的学习并进行回复(目的地址:a1,源地址: f1)回复PC2的pc2/1端口出去发送到交换机S2的s2/2端口,交换机S2会进行mac地址表的学习,并查看自己的MAC地址表有没有”a1”mac地址对应的端口,发现记录有:a1s2/3,然后直接转给s2/3;S1交换机的s1/3收到s2/3来的,然后S1也会进行mac地址表的学习,并查看自己的MAC地址表有没有”a1”mac地址对应的端口地址,发现记录有:a1s1/2,然后直接转给s1/2;这样PC1就收到了来自PC2的回复,得到PC2的MAC地址,并在arp缓存表中记录PC2的ip跟MAC地址的对应信息, pc1跟pc2就可以通过交换机进行通信了。

在此通信过程中,S1与S2交换机的MAC地址表分别记录了PC1的MAC地址跟PC2MAC地址与之对应的端口映射关系:a1s1/2 ;f1s1/3;  a1s2/3;f1s2/2。

Ps:如上过程中,为什么要获取MAC地址,因为数据链路层是根据MAC地址来进行转发的,不是IP地址(IP地址是工作在网络层),所以想要在数据链路层进行数据转发就需要知道对方的MAC地址,一般主机得到对方MAC地址的方式就是通过查arp缓存表,查不到就发送一个arp广播帧,广播给全网的主机,其他主机收到之后会查看ip地址是不是自己,如果是就回复,将自己的MAC地址告知对方,如果不是就直接丢弃。

环路结构图:

环路过程: 

假设:pc1向pc发起通信,优先走s1/3与s2/3。(因为交换机需要更新数据,所以正常情况下肯定是按先后顺序发送,后面一个肯定会覆盖前一个)

pc1查找自己的arp表,查看1.1.1.2对应的mac地址,假设没有找到,然后pc1pc1/1port向S1交换机s1/2port发送广播帧,广播地址为:ff:ff:ff:ff:ff:ff;

S1交换机从s1/2port收到pc1发来的广播 S1交换机就会学习mac地址表【s1/2:a1】并进行“泛洪”转发,将该广播转发给除接收数据s1/2port外的所有port,也就是转发给s1/3、s1/1port,S2交换机的s2/3、s2/1port分别收到s1/3、s1/1port发来的广播帧;

S2交换机也学习mac地址表【s2/3:a1、s2/1:a1;(因为优先是s1/3与s2/3,所以会先记录a1:s2/3port,再记录a1:s2/1port,因为mac地址一样,所以这里记录的时候会更新mac地址表,把a1:s2/3port中的端口更新成s2/1port,当然你也可以理解成覆盖)】分别泛洪转发s2/3、s2/1port收到的广播s2/3转发给s2/2、s2/1port,s2/1转发给s2/2、s2/3port,;此PC2会收到两广播(收到几个就要回复几个,所以PC2会分别回复s2/3、s2/1port转发过来的广播),S1交换机的s1/3、s1/1port也会收到S2交换机的s2/3、s2/1port发来的广播帧,S1换机也会学习mac地址表【s1/1:a1、s1/3:a1】,并分别进行广播……。

 映射关系:

S1:s1/2:a1;s1/1:a1、s1/3:a1

S2:s2/3:a1、s2/1:a1

Ps:此时因为mac地址表已经形成了环。所以会造成原本从pc1发出的arp广播帧在这个环里面陷入死循环;pc2回复的帧也会在这个环里面进入死循环,如:pc2回复的帧到达S2按mac地址表走从s2/1:a1出,到S1又按mac地址表走从s1/3:a1出,就这样一直反反复复循环。   

思科模拟器实验验证:

 

ps:图中pc1的端口被我关闭了,这是因为在设置端口重新连接或断电重启之后pc设备会发出一个“arp无故帧”,而这里避免pc0与pc1同时发送“arp无故帧”造成混乱,分析起来也比较麻烦,所以将pc1shutdown,只保留pc0,以便更加清楚的看清环路的过程!

数据帧传输过程:

 

ps:可以看到pc0发出的帧,是“gratuitous arp帧”(只要在cmd下使用arp -d命令就会触发pc发送“gratuitous arp帧”);这里只是说明一下这个帧是什么帧,不要纠结这个帧会不会对环路造成影响!不管什么帧都对环路没有影响, 环路只跟你的拓扑结构(环状结构)有关系跟什么帧没有关系!

数据帧收发过程解析:

 

1. pc0发出一个“gratuitous arp帧”(该帧使用来检测网络地址是否冲突的,该帧也是一个广播 帧),到达Switch0的f0/1口,Switch0学习mac地址表【9b38:f0/1】,然后分别转发给f0/2、f0/3,(注意此处先转发:f0/2)

2. Switch1的f0/2、f0/3分别收到Switch0转发来的帧,学习mac地址表【先:‘9b38:f0/2’,后:‘9b38:f0/3’(因为先转发f0/2!9b38:f0/3会覆盖‘9b38:f0/2’)】,分别转发!f0/2收到转发给f0/3、f0/3收到转发给f0/2(此处要不是我把pc1的端口关闭,应该是f0/2收到转发给f0/1、f0/3;f0/3收到转发给f0/1、f0/2,注意相同内容的包且同时去往一个地方的站思考交换机只转发一个!);

3. Switch0的f0/3、f0/2分别收到Switch1转发来的帧,然后学习mac地址表【9b38:f0/3、9b38:f0/2】来自f0/3的转发给f0/1(pc0)、f0/2(Switch1),来自f0/2的帧转发给f0/1(pc0)、f0/3(Switch1);

4. Switch1的f0/2、f0/3分别收到Switch0转发来的帧,学习mac地址表【先:‘9b38:f0/2’,后:‘9b38:f0/3’】,然后继续做转发处理,这里要注意图上0.204、0.205时间点上当前设备“Switch1”这里,在转发的时候都分别显示“f0/3正在发送另外一个帧、f0/2正在发送另外一个帧”,然后它先发送了从f0/3发来要转发给f0/2的帧,再发送原本优先的f0/2发给f0/3的帧;

5. Switch0的f0/2、f0/3分别收到Switch1转发来的帧,然后学习mac地址表【先:‘9b38:f0/2’、后:‘9b38:f0/3’】,然后继续做转发处理,来自f0/2的帧转发给f0/1(pc0)、f0/3(Switch1),来自f0/3的转发给f0/1(pc0)、f0/2(Switch1);

6. Switch1的f0/3、f0/2分别收到Switch0转发来的帧,学习mac地址表【先:‘9b38:f0/3’,后:‘9b38:f0/2’】,然后还是一样继续转发…………反反复复不断循环。

ps:这里需要提示的是至于先转发那个包这个不是一成不变的,由交换机性能等各方面因素决定!如上面的本优先处理f0/2的,后面到第四次转发的时候Switch1提示两个接口都在发送另外一个帧,所以导致先转发f0/3的帧最后也会操作mac地址表的改变,不过你不需要管它先处理哪个,因为结果都是一样的,一样会循环转发,也就是环路!

华为模拟器实验验证: 

 

从MAC地址表可以很清楚的看出,肯定会造成数据包在环内循环转发的,造成回复的数据包无法到达目的地。

如上mac地址表会造成PC2回复给PC1的包从SW2GE0/0/01 出去到SW1交换机的GE0/0/2,然后又从SW1交换机的GE0/0/3口出,不断循环重复这个过程。

下面的“抓包过程“也可以看出,这会使数据包不断循环转发,如果遇到广播包时也会造成不断的广播占用设备性能,肯定会造成设备性能下降,卡顿,断网等现象。

环路过程抓包:

Adi:华为抓包不在做讲解,因为原理一样的,看思科的实验解析就行,重复讲解没有意思,字多了看起来也烦;最后华为的抓包很清楚的环路的影响了。

环路的影响:

1. Broadcast storms广播风暴;

2. Multiple Frame Copies多重复数据帧;

3. MAC Database Instability MAC地址表混乱/地址表项错误;

4. 不断循环广播、泛洪,大量消耗交换机资源,导致交换机资源耗尽;

5. 导致通信故障,如断网。

Ps:现实环境中判断是否环路的方法:抓包、环路监测、看指示灯;不过现在的设备如华为、华三、Cisco网管交换机都会默认开启生成树,来防止环路。但现实中还是有很多非网管交换机的,这就很容易产生环路。

Adi:最后提醒一下,一定要确保自己懂得了mac地址表学习原理,交换机转发的方式:单播、广播之后在来看这个知识,没有这些基础做支撑你看了也是徒增烦恼。还有就是如果想要非常清楚看到环路过程中数据帧的走向,帧的类型及作用的,建议使用“ Cisco simulator (思科模拟器)” 去做实验!个人觉得相比于华为模拟器,思科模拟器更加直观清晰。 

tips:本文是本人手打一次过,有问题的地方欢迎大家指正!

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐