交换机的工作原理是什么?交换环境为什么要使用生成树协议?

STP的定位

在三层环境中,一组路由器彼此互联,要实现选路, 可以运行动态路由选择协议,也可以使用静态路由, 可以指定从源到达目的地通过哪条路径,通过修改路由的属性,比如修改度量值, 修改管理距离,而在BGP中还可以修改路径矢量,也叫路径属性,通过操纵这些参数,做一个三层的路径切换,在二层环境中, 由于交换机的智能性没有路由器那么强,所以在二层环境中, 交换机之间互联, 并且当设备之间连接了冗余路径之后,源到目的地走哪条路径,如何保证源到目的地之间没有环路,而且路径是最优的 这个就要依靠一个控制层面协议, 这个协议叫STP,在讲STP之前, 我们先回顾一下交换机的工作原理。

交换机的工作原理

任何设备都有控制层面和数据层面, 交换机的控制层面包含的一张表,叫MAC地址表,也叫CAM表,叫内容可寻址存储器。这张表作为交换机的转发表,用来帮助交换机做网络内的数据转发, 这个表里面的三元素,PC的MAC地址,PC所连接的交换机的接口,以及该接口所属的VLAN , 通过这个表, 交换机就可以知道通过哪个接口收到流量之后再通过哪个接口发送出去,那么交换机是如何学习到这个表呢?交换机有没有类似的动态路由选择协议来学习这些东西呢?应该说是动态交换协议。

答案是没有的, 那么能不能手工的写静态表项呢?当然可以写静态MAC地址表项,只是这个方式书写, 工作量比较大, 不灵活,当PC要经常更改一些连接, 做一些迁移,使用静态的表项是没有扩展性的,那么, 我们如何让交换机动态学习这些表项呢?一般使用自动学习,这个自动学习是特别不靠谱的,但是没有其他的更优的学习方式了, 只能使用这个方式。

交换机MAC地址表的学习方式

刚开机, 交换机的MAC 地址表是空的, 自动学习的时候,不管这个帧是谁发的,都会携带一个源MAC地址,这个MAC地址就是设备自身的标识符,当交换机通过一个接口收到一个数据帧之后,就能基于这个数据帧的源MAC地址,接收接口以及这个接口所属的VLAN, 我把这三样地址做一个绑定,就形成了一个MAC地址表项,交换机的学习指的是,只要我收到一个帧之后,我就认为这个帧的发送者就连接在我这个接口上。

大家想, 这种学习方法靠谱吗?其实是不靠谱的, 因为我们不能保证这个发送者就直接连接在这个交换机的接口上, 因为在我们的园区网中,在一个交换区块内,交换机之间也会互联,交换机之间还是中继链路, 中继链路是可以允许多个VLAN通行的,这个时候如果在交换机之间连接了多根中继链路,你们觉得会发生什么样的事情呢?

在这个图中, 假设SW1 身后连接了主机A, SW2 身后连接了主机B, 两个交换机之间连接了两根中继链路,这个主机A当发送一个广播数据的时候, SW 2 关于主机A的MAC地址表会怎么学习呢?

我们说交换机发送的广播帧,目的MAC地址全F,交换机所能学习到的表项只能是单播表项, 收到广播帧是找不到转发条目的,所以只能泛洪, 把这个帧复制成多份, 通过其他接口发送出去,交换机做的泛洪叫VLAN内的泛洪,我通过vlan内的一个接口收到广播流量, 可以通过哪些接口发送出去呢?属于这个VLAN的其他接入接口, 以及允许VLAN 通行的中继接口以及Hybrid接口, 交换机之间互联的都是中继链路。

所以主机A发送的流量会被SW1 通过这两条中继链路都发送出去,假设通过上边的链路被先收到,SW2 就会把PCA的MAC 地址绑定到上边这个接口上, 当SW2 通过下边这个接口也收到一个一摸一样的数据,那么这个交换机SW2会做怎样的处理呢?

其实这个问题就是在问大家,当交换机通过一个接口收到一个数据帧, 接下来通过另外一个接口收到一模一样的帧,这个源MAC地址都一样,,这个地址学习该怎么处理,是后学习到的MAC地址表项会覆盖先学习到的, 还是先学习到的维持不变,对后来的不做更新呢? 还是他俩同时保持呢?答案是后学习到的会覆盖先学习到的。

当交换机通过一条路径学习到一个转发表项的时候, 如果通过另外一条路径又学习到了相同的转发表项, 那么后学习到的转发表项就会覆盖先学习到的转发表项,这个就是交换机控制层面学习不可靠的根因。

泛洪会造成MAC 地址表翻摆

因为我只要学习到这个表项, 就认为这个设备连接到了我这个接口,。而当交换机之间拥有多根冗余链路的时候, 交换机是可以通过多根链路收到相同的数据的,而如果让这多根链路同时工作, 这个设备会出现什么问题呢?这个设备就会一会儿认为通过上边路径可以访问A, 一会儿认为可以通过下边路径访问A,这个接收设备会不停的做路径切换,这就是MAC地址表翻摆,MAC 地址表的翻摆会导致流量转发的不稳定。

比如主机A发送一个广播帧, 发送给SW 1 , SW 1 通过上边的链路泛洪发送给SW2 , SW 2 会把这个数据帧拷贝多份,从除了接收接口以外的其他接口泛洪发送出去, 会发送给主机B, 也会从下边的链路泛洪发送给SW1 , 而SW1 通过下边的链路泛洪发送的广播流量会通过SW2 从上边的链路再泛洪回来, 这就形成了两个环路,泛洪会产生广播风暴,而SW 1和SW2 收到这些流量还会继续泛洪, 因为目的MAC地址是全F, 交换机在收到目的MAC地址全F的数据帧一定会泛洪发送,可以发现, 这个泛洪是永无止境的,只要设备之间拥有冗余路径, 就会出现环路, 只要链路上出现广播或者未知单播帧, 就会出现广播风暴。

那么如何解决这个问题呢?把这些设备之间的冗余路径去掉一根就可以了, 只要设备之间没有冗余路径, 就不会产生环路,虽然这个地方还会产生泛洪, 但是这个收到的泛洪流量还能不能再泛洪回去呢?肯定是不能泛洪回去的,意思是不能通过接收接口再回送回去的, 所以, 只连接一根路径是不会出现刚才的问题的,但是单根链路会出现另外一个问题, 就是单点故障,没有冗余的网络,是没有健壮性的,为了让网络保持健壮性,设备之间还是要连接多根链路。

二层设备没有类似动态路由选择协议的一个机制来让设备知道整个网络是怎么连接的,为了解决二层设备产生的环路问题, 就引入了生成树技术。

生成树技术的好处:

1、可以动态监测链路和设备的运行状态,周期性发送链路探测报文,如果限制的时间内没有收到对方的探测报文, 则认为链路发生故障。

2、生成树可以自动计算最优路径,确保网络内的数据转发路径就是最优路径。

3,当设备或链路不可用, 可以立即发现拓扑变更, 立即开始拓扑变更计算, 不需要手工干预, 自动完成。

你可能感兴趣的:(交换机的工作原理是什么?交换环境为什么要使用生成树协议?)