如何形象地理解冲突域和广播域?

如何形象地理解冲突域和广播域?

很久很久以前,原始社会的人都生活在山洞里,这个山洞构造是这样的,每个人住在自己的洞穴里,洞穴的中间只有一个狭长的走廊,只能容纳一人通过(两人无法通行),平时出去打猎,老大会喊一嗓子:有出去打猎的吗?其他人都听得到,这个就是一个广播域。大壮听到了回应:老大,我想去打猎,等等我!于是大壮就顺着狭长的通道走向老大的洞穴。

过一会,老二也喊一嗓子:有出去泡妞的吗?小色大叫:二哥,我要去!于是小色走向老二的洞穴,不巧的是在通道上与大壮狭路相逢,于是产生了冲突,这个就是冲突域。于是小色乖乖退后,大壮继续走到了老大的房间。小色见大壮进了老大的房间,才敢出门到老二的房间。

后来大家觉得这狭长的通道太不方便了,于是将山洞的中心拓宽了,变成了一个大客厅,每个洞穴都连着客厅,这样大家就不会再狭路相逢了,大壮去老大的房间,小色可以同时去老二的房间,通行效率大大提高。

山洞里还住着小美,有时老二会到小美的房间谈工作,小色也会到小美的房间谈生活、谈理想,但是通往小美的走道也只能容纳一人,老二与小色如果同时到达,老二不客气,径直进入房间,小色闷闷不乐回去了,等老二走了再去。

后来小美觉得让小色白跑一趟不好,于是在房间门口放了一凳子,准备了香烟茶点、瓜子橘子水,让小色稍等片刻,小色觉得这个服务很人性化,欣然接受,等老二谈完工作,再和小美盖被聊天。

正式开始话题

最后小美使用的这项技术,就是交换机出接口(Outgoing)的缓存队列(buffer queue),当发现出口有数据占据通道时,将其它的数据缓存下来,而不是丢弃,可以避免数据源主机重新发送。

大家先有一个感性认识,再来聊聊相关的话题,最早大家的电脑用一个HUB连接起来,HUB如果按照OSI模型来划分,只是一个物理层设备,因为它不对以太网帧做解释,只是将接收到的物理信号放大(amplify),然后从其它所有端口将信号广播出去,此为广播域。

由于HUB只是一个信号放大器,没有缓存机制,任何时刻只能有一台电脑发数据给HUB,如果有多台电脑同时发数据给HUB,会产生冲突,所以就有了CSMA/CD机制,为了避免冲突,大家发数据之前,先听听HUB有没有数据在发送,如果没有,才可以发送。

很显然以上通信模式很落伍,于是有了交换机,交换机是二层设备,可以理解以太网帧的概念,可以学习每台电脑的MAC地址及对应端口,当交换机接收到一个帧,如果目的地址是广播地址、或不认识的MAC地址,依然会通过广播的方式发送出去,如果是认识的MAC地址,只会发给对应的端口。

那和交换机相连的电脑发送数据之前还需要侦听线路吗?不需要,因为现代交换机端口工作在全双工模式,直接发给交换机就可以了,交换机直接进行交换,如果交换的出端口拥塞,用缓存队列(Queue)这些数据,等出端口一空闲立马就发送。

但以上队列有一个问题,采用先进先出FIFO机制,如果就一个队列,低优先级的帧早于高优先级得帧进入队列,那最后是低优先级的帧先发送,高优先级的帧后发送,这不符合服务质量QoS 精神,高优先级的帧先发送。

于是可以有多个优先级队列,将高优先级数据放在高优先级队列先发送,将低优先级数据放在低优先级队列后发送,这样比较合理。

还有问题,如果端口1有去端口2的数据,也有去端口3的数据,但是端口2处于拥塞,排在前面的数据恰恰是去往端口2的,后面的数据急死了,因为端口3是空闲的,而前面的数据却因为端口2拥堵而在等待,这显然也不合理,于是就有了虚拟队列vQueue ( Virtual Queue),比如这里的端口1 有两个vQueue,一个是通向端口2的,一个是通向端口3的,互不干扰,即使端口2拥堵了,也不影响通往端口3数据的交换,数据交换效率大大提升。

最后补充一句,一旦电脑发送的数据太快、太多,交换机出端口拥堵,缓存也满了,那只有丢一条路了。