交换机是一个二层设备,它是基于数据帧的源MAC地址和目的MAC地址来工作的,还可以隔离冲突域,交换机的主要功能有三个:
- 转发(数据帧)
- 地址学习(建立MAC地址表)
- 环路避免
地址学习:交换机收到数据帧后,会将数据帧中源MAC地址存储到MAC地址表中(基于源MAC地址学习)。
转发(数据帧):前面我们说过交换机主要是基于源MAC地址和目的MAC地址来转发数据帧的,换句话说,交换机收到一个数据帧时会在MAC地址表中查找其目的MAC地址和端口,并把数据帧转发到对应的端口。
环路避免:关于环路避免暂时跳过,我们主要关注交换机的工作原理。
通过一个简单的实验来简单学习一下交换机的工作原理:如下图所示,在PC1和PC2两台主机之间连接了一台交换机,分别配置PC1和PC2的ip地址信息,SW1交换机不动,然后PC1 ping PC2测试网络连通性。
PC1通过ping PC2去测试网络连通性:
PC1#ping 192.168.1.2
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 192.168.1.2, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 20/28/36 ms
结果说明PC1和PC2的网络是可以通信的,那么SW1交换机是如何转发数据实现PC1和PC2之间的网络通信?
前面说过交换机是基于源MAC地址和目的MAC地址来转发数据的,也就是说,在SW1交换机中有一个MAC地址表,这个表中存放了MAC地址和交换机端口的映射关系,我们通过show命令查看交换机的MAC地址表信息:
//查看交换机的MAC地址表
SW1#show mac-address-table
Destination Address Address Type VLAN Destination Port
------------------- ------------ ---- --------------------
cc02.15a4.0000 Self 1 Vlan1
cc03.1f30.0000 Dynamic 1 FastEthernet1/0
cc04.090c.0000 Dynamic 1 FastEthernet1/1
PC1和PC2之所以能通信,是因为交换机会根据MAC地址表来转发数据帧,通常交换机对数据帧的转发操作会有三种行为:
- 泛洪:交换机把从某一端口收到的数据帧通过其他端口转发出去
- 转发:交换机把从某一端口收到的数据帧通过另一端口转发出去
- 丢弃:交换机把从某一端口收到的数据帧直接丢弃掉
交换机转发数据帧的原则:
1. 当交换机从某一端口收到一个数据帧时,会把源MAC地址和该端口之间进行映射并存储到MAC地址表中
2. 如果交换机收到的是一个广播帧,交换机不会查找MAC地址表,而是直接执行泛洪操作
3. 如果交换机接收到一个单播的数据帧,交换机会在MAC地址表中查找目的MAC地址,如果没找到,交换机则执行泛洪操作;如果找到了,则对比目的MAC地址映射的端口是否为数据帧进入交换机的端口。如果是则丢弃数据帧,如果不是则执行转发操作。
交换机在收到一个数据帧时,还具备学习MAC地址能力。
由于二层网络中使用mac地址通信,PC1想要和PC2通信就必须知道对方的mac地址,那么PC1和PC2通信之前会发送一个ARP请求(以广播的方式发送)以获取PC2的MAC地址,当SW1交换机从f2/0端口收到这个数据帧时,查找自己的MAC地址表发现是空的,会把源MAC地址和f2/0端口进行映射并存储到自己的MAC地址表中,以后SW1交换机只要收到目的MAC为01-02-03-04-AA的数据帧一律从f2/0端口转发出去,接下来交换机会把这个数据帧从其他端口(f2/1和f2/2)泛洪出去。
PC3收到该数据帧会丢弃,但PC2收到该数据帧后会响应一个ARP应答,并封装自己的MAC地址为源MAC,当SW1交换机从f2/1口收到这个数据帧时,也会将源MAC地址和f2/1端口进行映射并存储到MAC地址表中。
然后PC1和PC2就可以建立点到点连接了,并且只有这2个设备接收到这些数据帧,因为SW1交换机的MAC地址表中还没有PC3的MAC,所以PC3是无法看到这些数据帧的。
为什么当交换机收到一个广播或组播的数据帧时不会学习mac地址呢?而是直接执行泛洪操作?因为交换机是基于源mac地址学习的,广播和组播的mac只能作为目的mac地址使用,所以交换机无法学习到广播或组播的mac地址,这意味着交换机的mac地址表中根本就没有广播和组播的mac,也就不需要再查找mac地址表。