交换机的VLAN是如何工作的?
一篇文章,用最通俗的人话,带你了解交换机VLAN的工作原理TvT!
什么是交换机?
交换机,工作在五层参考模型中的数据链路层,用于局域网内的设备通信,负责转发数据帧的网络设备。
交换机是一种即插即用的网络设备,无需管理员手动分配,它会自动维护一张MAC地址表,关联连接设备的MAC地址与自己的端口。交换机从端口接收数据帧,查看数据帧的目标MAC地址,根据MAC地址表,选择合适的端口发送数据帧。
如果MAC地址表中不存在目标设备的MAC地址,交换机则会通过广播的形式发送数据帧到所有连接设备,交换机是通过观察流量的源MAC地址来学习的,因此如果目标设备收到了目的地是自己MAC地址的数据帧,会返回一个响应帧,交换机根据这次发送的源MAC地址来学习,把目标MAC地址和端口号加入到MAC地址表中,与此同时记录的还有更新时间,如果长时间无通信,该条数据将会由超时机制被从MAC地址表中移除。
什么是VLAN?
Virtual Local Area Network(VLAN),即虚拟局域网。这里从VLAN的用途,逐步详细介绍VLAN的工作原理,最后会涉及一个小练习,如果你能成功完成它,代表你已经成为VLAN高手了!
VLAN——将一个物理交换机分割成多个虚拟交换机
我们知道,交换机用于同一个局域网内的设备间的通信;类似路由器用于局域网网络之间的通信一样。

这里有三个局域网,通过两台路由器连接,每个局域网中的设备通过交换机连接,如果每个交换机上有24个端口,但只有两个端口被使用了,剩下的22个端口不就被浪费了吗?
明明一个交换机的端口数量,已经绰绰有余了,但这里我却用了三个交换机。如果我想搭建这样一个网络模型,能不能只使用一个交换机呢?
当然是可以的,这就需要用到VLAN技术了,它允许你把一个物理交换机划分为多个虚拟交换机。

这个网络结构与之前的完全相同,路由器的配置和运行方式也一模一样。
每个虚拟局域网,即VLAN,仅仅是一个给端口号数字标记,例如:红色虚拟交换机上的两个端口被标记为VLAN #10
,黄色虚拟交换机上的两个端口被标记为VLAN #20
,蓝色虚拟交换机上的两个端口被标记为VLAN #30
。
那么其他没有被特别标记的端口,都属于默认VLAN,一般是VLAN #1
。
每个VLAN是一个虚拟局域网,如果流量没有经过路由器的转发,即使是在同一个交换机上的端口,也无法跨局域网通信。例如,A发送的数据包,在未经路由器转发时,只能由VLAN #10
这个局域网内的设备收到,不可能神奇的出现在VLAN #20
,VLAN #30
其他局域网中。
那么,问题来了,交换机是如何知道来自一个设备的流量,都需要转发到哪些端口呢?
为了实现这一目标,每个交换机都维护一个MAC地址表,该表是连接到每个交换端口的MAC地址的映射。支持VLAN的交换机还会在每个 MAC 地址表的条目中包含 VLAN #
。
一个支持 VLAN 的交换机的 MAC 地址表中的单个条目的简单表示为: VLAN# | MAC Address | Port
。
如果主机A发送一个目标MAC地址为主机 B 的数据帧,那么这个数据帧仍然只会被发送到 VLAN #10
的交换机端口上。即使MAC地址表中存在与 VLAN #30
相关的主机 B 条目,但不在一个局域网内,就无法直接发送。
VLAN——将虚拟交换机扩展到多个物理交换机上
VLAN的强大功能不止上面如此,此外,他可以将虚拟交换机扩展到多个物理交换机上。

这里将两个交换机连接起来,例如设备A和C,虽然他们连接到了两台不同的交换机,但他们都在VLAN #10
中,因此,主机A发送的流量,无需经过路由器,就可以被主机C接收。
这意味着,单个VLAN可以跨越物理地域限制,例如:我在7号楼,你在8号楼,我们的设备连接的是不同的交换机,但我们仍然可以在同一个局域网VLAN #10
中,进行局域网内的通信。单个VLAN可以跨越多个房间、楼层或办公楼。
Access VS Trunk
上面我们介绍的情况,交换机的端口都属于acceess
端口,access
端口是只属于一个 VLAN 的交换机端口。
当将端口配置为access端口时,管理员也会指定该端口所属的VLAN编号。每当交换机在access端口上收到任何流量时,它就会将该流量转发到配置的VLAN中。
上面的例子中,两台交换机连接时,我们注意到VLAN #10
和VLAN #30
分别用网线进行了一次连接。
想象一下,如果我们的拓扑使用了十个VLAN,在一个有24个端口的交换机上,几乎有一半的端口会被用于交换机之间的链路。
这也太浪费了吧,能不能让两个交换机的所有VLAN流量,都通过一对端口来进行转发呢?
实际上,这种端口是存在的,称为trunk
端口,它允许单个交换机端口承载来自多个VLAN的流量。

采用trunk端口,我们的拓扑模型可以简化成这样。大大减少了端口的浪费,在实际应用中,通常,连接到终端设备(如工作站、打印机、服务器)的交换机端口配置为access端口。相反,连接到其他网络设备的交换机端口配置为trunk端口(如其他交换机、路由器)。
交换机上的一个trunk端口可以接收多个VLAN的流量。例如,在上面的图中,两个交换机之间的链路正在传输 VLAN 10 和 VLAN 30 的流量。
但在两种情况下,流量都是以一系列帧的形式离开一个交换机,并以一系列帧的形式到达另一个交换机。这就引出了一个问题:接收交换机将如何确定哪些帧属于 VLAN #10
,哪些帧属于 VLAN #30
?
这就引出了trunk端口的核心作用,“打标签”。
为了解决这个问题,每当交换机通过trunk端口发送帧时,它会在每个帧中添加一个标签,以告知另一端该帧属于哪个 VLAN。这使得接收交换机能够读取 VLAN 标签,从而确定传入流量应该关联到哪个 VLAN。
相比之下,access端口只能承载或接收单个 VLAN 的流量。因此,离开access端口的流量无需添加 VLAN 标签。换句话说,access端口根本不认识VLAN标签,由access端口发送的流量都是不带有VLAN标签的,看起来就好像是它做了“标签清零”的功效一样。
之前我们提到access端口通常用于终端主机设备,如工作站、打印机或服务器,这使得主机可以无需了解其连接的 VLAN 信息即可运行。从某种意义上说,主机有意地对 VLAN 的存在或使用完全不知情。主机无需关心交换机VLAN的使用情况,主机只是在网络上发送数据,而无需了解 VLAN 或它们可能连接的交换机。
因此,按通常的惯例来讲,到达主机的流量应该不能带有VLAN标签,有些主机能够接收带有 VLAN 标签的帧,而有些主机则不能——这取决于主机是否理解 802.1q VLAN 标签。(大部分主机都是不能的,部分服务器,虚拟机,专用网卡可以)(VLAN 标签的确切格式由 802.1Q 标准规定。这是一个开放式的 IEEE 标准,是当今普遍使用的 VLAN 标签方法。你可能也会见到 ISL 等,这属于较旧的 VLAN 标记方法,现在几乎已经不再使用了。)
比较特别的一个例子是,如果单个物理主机托管多个虚拟机(VMs)。某些情况下,这些 VM 中的每一个都需要存在于不同的 VLAN 中。因此,物理主机必须连接到一个 trunk 端口,并且必须发送和接收 VLAN 标签,以便将虚拟机流量限制在特定的 VLAN。
Native VLAN
这是一个很容易混淆的概念,前面我们说过,trunk端口在发送帧的时候, 会向帧中添加一个标签,但这里有个例外,当trunk端口收到了来自Native VLAN的数据帧的时候,不会为这个数据帧打标签,我们结合这个例子来看:

每个trunk都会有一个Native VLAN
,这样做的原因是如果trunk端口接收到了来自另外一个trunk端口的数据帧,但该数据帧又不带有VLAN标签,trunk端口就会难以判断这个数据帧要发送到哪个局域网内,此时,这个trunk端口将不会再为该数据帧打上标签,而是默认这个数据帧属于Native VLAN
,直接把它转发到Native VLAN
局域网中。
因此,确保中继端口的两端配置相同原生 VLAN 至关重要。如上图:
若A向C发送了一个数据帧,由于主机与交换机之间的端口是access,该数据帧不带有VLAN标签,当数据帧到达x交换机的trunk端口后,发现是从VLAN 22
传来的数据帧,该数据帧恰好是trunk端口的Native VLAN,于是trunk端口没有为这个数据帧打VLAN标签,就直接转发给了交换机y,交换机y收到了该数据帧,发现没有VLAN标签,前面说过,trunk接收到了来自trunk且没有VLAN标签的数据帧,则接受trunk认为这个数据帧是来自自己的Native VLAN的,即VLAN 33
,于是它只会在VLAN 33
内转发,此时,设备C就无法按照预期收到数据帧,甚至更为严重的是,设备D可能会意外的收到这份数据帧!
所以简单记忆:
- access去除标签
- trunk添加标签
- 例外:trunk收到来自Native VLAN的数据帧时不添加标签,trunk收到来自trunk且无标签的数据帧时默认它属于Native VLAN,在Native VLAN内转发
小练习

问题:如果A对所有设备发送广播,有哪些设备能收到?
答案:C,F,H,I,B
主机 J 和主机 K 也会收到广播,但当它们接收到帧时,该帧将包含 VLAN 标签。有些主机能够接收带有 VLAN 标签的帧,而有些主机则不能——这取决于主机是否理解 802.1q VLAN 标签。
解析:设备A发送的数据帧从A3发送,不带有标签,在swT内会被转发到A3和trunk端口,即A3,T7。因此设备C可以接收到,T7发送该数据帧到swV时,会为它带上VLAN 3
的标签,T5收到该数据帧,在swV内转发给A3端口和trunk端口,即A3。数据帧的标签在经过access时会被去掉,因此设备F可以正常接收到数据帧。同时,数据帧被swV从A3端口发送给swX,swX的A4端口接收到该数据帧,只能把它发送给A4和trunk端口,即A4,T4。此时设备H能正常接收到这个不带有标签的数据帧,数据帧被swX通过T4转发到swY,T4为数据帧添加了VLAN 4
标签,但到达swY时,该标签又被A6去除,A6把数据帧转发给A6和trunk,即T4,T6。T4会为该数据帧加上VLAN 6
标签,前面说过,绝大多数设备无法接收带有标签的数据帧,因此J无法正常接收。但T6的Native VLAN恰好是VLAN 6
,因此T6不会再为数据帧加上VLAN 6
标签,到达设备I的是不带有标签的数据帧,因此设备I可以正常接收。swY把数据帧由T6转发给swZ,swZ经A9接收后数据帧不带有标签,转发给A9和trunk,即A9,T8,由于T8会为数据帧添加上VLAN 9
的标签,设备K无法正常接收,而设备B连接的端口是access端口,到达设备B的数据帧不带有标签。综上,能正常收到数据的设备有C,F,H,I,B。
参考文献
Virtual Local Area Networks (VLANs)
感兴趣的友友可以去阅读一下原文,写的更详细。
说些什么吧!