交换机是数据链路层的连接设备。
使用一个或多个交换机互连的交换式以太网,其所有的站点都属于同一个广播域。
巨大的广播域并不是一件好事,它会带来很多问题,比如它会产生广播风暴。
广播风暴:
- 假设主机A要给主机B发送数据,在数据链路层封装帧时,需要填入主机B的mac地址,然而主机A由于刚刚启动,没有主机B的mac地址。
- 于是主机A首先会发生arp请求用于询问主机B的mac地址。
- arp请求时一种广播帧,当交换机收到广播帧、多播帧时,都会将其通过自己从其他接口转发出去,也称为泛宏。
- 因此,这个广播帧会传播给广播域内的所有主机。这不仅浪费网络资源,也浪费各主机的CPU资源。

使用路由器可以隔离广播域,但是路由器成本较高,在局域网中不可能全部使用路由器来隔离广播域,所以虚拟局域网VLAN应运而生。
虚拟局域网VLAN(Virtual Local Area Network) 是一种将局域网内的设备划分成与物理位置无关的逻辑组的技术,这些逻辑组具有某些共同的需求。
如上图所示,1楼2楼3楼分别为一个局域网,将它们用一个交换机相连组成一个更大的局域网。我们将该局域网划分为两个VLAN: VLAN1和VLAN2。此后,VLAN1中的广播信息不会传递到VLAN2,VLAN2中的广播信息也不会传递到VLAN1。也就是说,同一个VLAN内部可以通信,不同VLAN之间不能通信。
如何实现VLAN
单台交换机实现VLAN
我们先简单考虑如何在一台交换机上实现VLAN,我们对广播帧和单播帧分别进行讨论。
对于没有划分VLAN的交换机,当交换机收到某个主机发来的广播帧后,将该帧从自己的其他端口转发出去,如下图所示。
如果交换机自身可以生成VLAN,比如下图中,端口1和端口2属于VLAN1,端口3和端口4属于VLAN2,VLAN1中的主机发送的广播帧不会被交换机转发到VLAN2。
对于没有划分VLAN的交换机,交换机是如何转发单播帧的?
- 当交换机收到帧后,解析出帧的目的mac地址
- 然后在帧交换表中查找包含目的mac地址的条目
- 如果找到,则从该条目指定的端口转发帧
- 如果找不到,则从其他所有端口转发帧
现在,交换机划分了VLAN,我们很自然的想到,应该还有一张VLAN表,用来记录交换划分的各VLAN,如下图所示。
当交换机收到帧后,先查找转发端口,再根据转发端口对应的VLANID,然后转发端口的于接收端口属于同一个VLAN就转发帧, 如下图所示。
多台交换机实现VLAN
如果有多个交换机互连,并且同一个VLAN分布在不同的交换机上,上面讨论的方法还有效吗?
我们来看下下面的例子。
两台交换机互连,ABEF属于VLAN1,CDGH属于VLAN2,那么两台交换机上的端口5应该属于LAN1还是VLAN2?
如下图所示,如果都划分到VLAN1,则分布在两个交换机上的VLAN1各成员可以完全互通,但分布在两个交换机上的VLAN2各成员不能完全互通。
同理,如果都划分到VLAN2,则分布在两个交换机上的VLAN2各成员可以完全互通,但分布在两个交换机上的VLAN1各成员不能完全互通。
看来实现VLAN的方法并不像我们想象的那么简单。
真的的VLAN实现方式
实际当中,在交换机上实现VLAN技术,需要交换机能够实现以下两大功能:
- 能够处理带有VLAN信息的帧,我们称为IEEE 802.1Q帧。
- 交换机的各端口可以支持不同的端口类型,不同类型的端口对帧的处理方式有所不同。
IEEE 802.1Q帧格式
对以太网帧扩展,插入了4字节的VLAN标记。
VLAN标记的最后12位称为VLAN标识符VID,它唯一地标志了以太网帧属于哪个VLAN。
- VID的取值范围0-4095
- 0和4095都不用来表示VLAN,因此VID的有效取值范围为1-4094
802.1Q帧是交换机来处理的,而不是用户主机来处理的。
- 当交换机收到普通的以太网帧时,会将其插入4字节的VLAN标记进而转变为802.1Q帧,简称“打标签”。
- 当交换机转发802.1Q帧时,可能会删除4字节的VLAN标记,简称“去标签”。
端口类型
PVID:Port VLAN ID,即端口的VLAN ID
端口类型: Access端口,Trunk端口,Hybird端口(华为特有)。
Access端口
- Access端口一般用于连接用户计算机
- Access端口只能属于一个VLAN
- Access端口的PVID值与端口所属VLAN的ID相同
Access端口接收处理方法:
- 一般只接收"未打标签"的数据帧,即普通以太网数据帧
- 当"未打标签"的数据帧时,根据接收改帧的端口的PVID,给帧“打标签”
Access端口发送处理方法:
- 若帧中的VID与端口的PVID相等,则"去标签"后转发该帧;否则不处理。

注意:
为了简化问题的描述,我们省去了根据帧目的MAC地址在帧交换表中查找对应转发端口的过程,后续介绍Trunk端口和HyBird端口时,同样会省去该过程。
Trunk端口
-
Trunk端口一般用于交互机之间或交换机与路由器之前的互连。
-
默认情况下,Trunk端口的PVID值为1,通常不用设置。
Trunk端口接收处理方法:
- 对于数据帧中的VID等于端口PVID的帧,去掉“标签”再转发。
- 对于数据帧中的VID不等于端口PVID的帧,直接转发。
Trunk端口发送处理方法:
- 接收“已打标签”的数据帧,而不管数据帧中的VID是否等于端口的PVID。
- 接收"未打标签"的数据帧,根据端口的PVID值给帧"打标签"。

下来分析两个例子。
一、 主机A发送广播帧。
- 主机A发送广播帧,从交换机1的端口1进入,改端口时Access口,PVID为1,因此对广播帧"打标签"。
- 该广播帧将从端口2,3,7转发,2,3时Access口,因此"去标签"后转发。
- 7是Trunk口,并且7的PVID与数据帧的VID相等,所以“去标签”后转发。
- 交换机2的7口接收该广播啊帧,该帧没有"标签",所以对该帧打标签。
- 该广播帧从交换机2的1,2,3端口转发。
二、 主机D发送广播帧。
与上述过程的1,2步骤都是差不多的,后面有点不同:
- 交换机1的7转发该广播帧,因为7口的PVID与数据帧的VID不相等,直接转发。
- 交换机2的7口接收该广播啊帧,该帧有"标签",所以不做处理,其中该帧的VID为2。
- 该广播帧从交换机2的4,5,6端口转发。
这里有点不太明白Trunk口设置PVID的意义?
我们看到,对于数据帧的VID与Trunk的PVID是否相同,处理规则时不同的。 我们能否简化规则,比如如下:
Trunk端口接收处理方法:对数据帧不做处理。 Trunk端口发送处理方法:直接转发。
简化之后,也能达到同样的效果,所以,不太明白Trunk口设置PVID的意义。