VLAN, PVID, VID, Tag, Untag 一锅粥

2018-12-10 10:59:34 +08:00
 atuocn

折腾家里的路由器和交换机,VLAN 相关的概念看似容易,然而 pvid, vid, tag 啥的不太清楚具体作用,网上查的文章越看越一团粥。有些过于细节拉拉杂杂一堆,非专业的难于读懂;有些也许自己搞明白了文字表述不清;还有些也许写的人自己也搞不明白。拜读下来,这两篇算是讲得清楚一点的。

802.1Q VLAN 技术原理---理解 PVID 和 VID --注 1

Trunk、Hybrid、Access、Tag、Untag、Pvid 的关系

自己总结一下,希望能简单,通俗易懂,结果可能是又做了个混乱的解读。

VLAN,虚拟局域网络,是交换机一项功能,可以在逻辑上把交换机端口划分为不同的局域网,这些逻辑上的局域网就是 VLAN, 每个 VLAN 用唯一的标识数字 VID 来区分。

VLAN 的实现原理很简单,就是在原有的网络底层的的每个数据帧上附加一个 VID 的标记,这就是所谓的 Tag。交换机根据数据帧里的 VID,和端口属于哪个 VLAN,决定数据帧是否可以进出那个端口。

然而悲催的是,传统局域网先于 VLAN 出现。所以大量的设备不打 Tag。首先是所有终端设备,例如 PC, 移动设备等不会打 Tag ;其次交换机之间,有些交换机也不支持 VLAN。另外,交换机也需要一个机制管理端口和 VLAN 的关系。所以,问题就在于怎样打 Tag, 怎样移除 Tag。

数据帧上打过 VID 标记的,叫 TAGED 数据帧,携带有 VLAN 信息;没有 VID 的,叫 UNTAGED 数据帧,没有携带 VLAN 信息。正常和 PC 等终端设备通信的数据帧,都是 UNTAGED 的,没有 VLAN 信息。交换机内部、交换机之间、交换机和路由器之间,才会有 TAGED 的数据帧。交换机之间、交换机和路由器之间也可以用 UNTAGED 的数据帧。

交换机的端口可以分为内外两侧,对外侧,通过网线连接其他设备,收发外部的数据;对内侧,抛给交换机内部的处理芯片,把数据转发到目标端口。

一个端口可以归属多个不同的 VLAN,但是只能选一个做缺省 VLAN。端口在外部收发的 UNTAGED 的数据帧,没有 VLAN 信息,交换机自动分配到缺省 VLAN。因为缺省 VLAN 的设计,PC 电脑可以正常的和交换机通信,而不需要理解 VLAN 的存在。

对于缺省 VLAN,由于端口从外部接收的数据是没有 VID 信息,所以端口对内抛送数据帧到交换机内部电路时,需要添加一个 VID 后参与内部交换。这个 VID 就是缺省 VLAN 的 ID,通过端口的 PVID 属性来指定,也就是说端口的 PVID 属性要和端口的缺省 VLAN 的 ID 一致。

另一个方面,缺省 VLAN 数据帧,端口对外部发送出时都没有 VID 信息。而交换机内部数据帧都是有 TAG 的,所以端口往外部发送缺省 VLAN 的数据帧时,原有的 TAG 需要移除。端口另外有一个属性 TAGED/UNTAGED,端口可按 VLAN 控制某个 VLAN 的数据帧往外部发送时是否保留 TAG。端口在缺省 VLAN 上的属性值设为 UNTAGED,表示端口对外发送数据要移除 VID 信息。通常一个端口只能在缺省 VLAN 设置为 UNTAGED,其余 VLAN 设置为 TAGED。

另外有说法,端口往外部发送数据帧时,先判断数据帧的 VID 是否等于端口的 PVID,若 VID==PVID,则移除数据帧的 TAG 再发送。这并不矛盾,端口的 PVID 为缺省 VLAN 的 VID,缺省 VLAN 是 UNTAGED 的。某些设备支持 Hybrid 端口类型,允许多个 VLAN 外发数据帧不打 TAG,这种情况下多个 VLAN 设置了 UNTAGED。

综上:

  1. 若端口只和 PC 等终端设备连接。端口只属于一个缺省 VLAN,终端设备的数据在进出端口时,自动打上 /移除缺省 VLAN 的 VID。这是一般的 Access 端口。
  2. 若端口和其他交换机连接,一个端口可以汇集多个 VLAN 的数据。端口可以属于多个 VLAN,但只能有一个缺省 VLAN。端口的 PVID 为缺省 VLAN 的 VID,同时缺省 VLAN 上也要设为 UNTAGED。数据在进出端口时,缺省 VLAN 的数据自动添加 /移除缺省 VLAN 的 VID。其他 VLAN 的数据,检查数据帧里的 VID 是否包含在端口归属 VLAN 的列表,是允许通过,携带原有 TAG 信息;不是则丢弃。这是 Trunk 口。
  3. Hybrid 口是一种特殊的端口类型。接收数据和 Trunk 相同;往外发送数据,允许多个 VLAN 的数据帧不打 TAG。

最后,以上为仅为拉拉杂杂的学习后的纸面总结。因为 802.1Q 标准的存在,有了学习的方向。各设备厂商具体实现各显神通。没接触过专业设备,就家用和 Soho 级的交换机而言,能有几分按标准支持呢。譬如网件的这个说明《简单网管交换机的 VLAN 功能设置及应用》其中的“一、端口 VLAN ”, 我没法用上面理论解释。只能解释,他是另外一个机制 :joy:

注 1:许多内容来自这篇不知出处的文章《关于 VLAN-Tag 》

5688 次点击
所在节点    分享发现
11 条回复
iwtbauh
2018-12-10 20:48:16 +08:00
其实 vlan 说白了就是将单一接口映射到多个网络。
goodryb
2018-12-11 08:34:51 +08:00
和终端没关系呀,为啥说手机电脑不支持 vlan,搞笑了
楼主可以先去了解下 osi 七层模型

vlan 简单来说就是通过逻辑划分来复用交换机
atuocn
2018-12-11 12:33:17 +08:00
@goodryb 我说了终端不支持 vlan 了么?我说的是终端不会打 tag。 终端设备是 VLAN-unaware,不感知 vlan 存在的。如果你了解 osi 七层模型的精神的话,就会知道上层设备是不需要了解下层设备的实现细节。终端是不需要理解 vlan 的存在的,只需交换机提供链路服务就好了。

vlan 的的原理和概念是很简单。我只是读了一些文章,讲不清 pvid,vid, tag, untag,和为什么有这些东西存在。自行总结一下而已。
goodryb
2018-12-11 12:44:05 +08:00
@atuocn #3 看你这答复似乎是了解一些网络的知识,那强调终端不会打 tag 是什么意思? 这个难道不是 vlan 才需要的?
atuocn
2018-12-11 14:15:53 +08:00
@goodryb 好吧。我只是总结一下,设计缺省网络的一个原因是有许多不打 tag 设备。毕竟大家都会打 tag 的话,就没有 tag, untag 之说了。就不会有 pvid, 端口的 untag 属性存在的必要了。我强调的是“因为缺省 VLAN 的设计,PC 电脑可以正常的和交换机通信,而不需要理解 VLAN 的存在”

我初次接触 pvid, untag 概念,读了几篇文章也没懂。我说过,这是我读了几篇文章总结。
也许你很强,也没有必要用“搞笑”,“似乎”这样的词汇来沟通吧。
benmaowang
2018-12-11 23:00:38 +08:00
终端也可以打 tag,但没有意义。因为 VLAN 是为了隔离二层广播域的,在交换机这种有多个端口用来二层交换的设备上才有意义。

其实除了 VLAN 和 VID,其它那一大堆名词都是设备厂商搞出来的。比如思科交换机只有 trunk 和 access 模式,而华为的就多了一个 hybrid 模式,大概算是那两个的混合体。

本质上,对交换芯片来说,从一个端口收到报文后,转发处理的逻辑很简单,同一 VLAN 的可转发,报文从端口发出去时,根据配置决定去不去 tag。

网件的“一、端口 VLAN ”就很好理解了。
端口 7 和 8 属于 VLAN 1、2、3。所有这三个 VLAN 的报文都可以从两个端口过。
端口 1~3 属于 VLAN 2,所以这三个端口之间可通信,也可与端口 7 和 8 通信(同属于 VLAN 2 )。
端口 4~6 属于 VLAN 3,所以这三个端口之间可通信,也可与端口 7 和 8 通信(同属于 VLAN 3 )。
这个场景中,交换机连接的都是终端,所以出去的报文肯定都是 untag 的。
如果按照思科的配法,那就是端口 1~3 是 access 模式,pvid 2。端口 4~6 也是 access 模式,pvid 3。端口 7 和 8 是 trunk 模式,允许 1、2、3,且 untag 1、2、3。
nfroot
2018-12-12 10:35:39 +08:00
最近接触了三层交换机,也看了下 Openwrt,虽然有图解,也有点难记。。不过慢慢也接受了。。。其实好简单的。。。
atuocn
2018-12-12 12:09:37 +08:00
@nfroot 是的,我也是弄 Openwrt,再百度 pvid tag 啥意思。如果没有系统的学习,网上各种零散信息,难理解。弄清楚了是很简单的。
atuocn
2018-12-12 12:49:17 +08:00
@benmaowang 感谢!
我的疑惑是,按网件手册解释:

vlan id | 端口成员
------------------------------------------
01 | 07 08
02 | 01 02 03 07 08
03 | 04 05 07 08

就象你说的,所有端口,肯定出去的报文都是 untag 的。端口 07,08 的 pvid 应该是 1 吧,那么从 07,08 口流入的数据,就应该是 vlan 01 的,交换机为啥会把报文交换给属于 vlan 02 的 01 口呢?这边并没有明显的地方,暗示 01 端口允许 vlan 02 的数据。当然反过来,按上表的示意,01 口进入的数据,可以交换到 07,08 口。但是通信应该是双向的啊,不能单边嘛。
我注意到他的配置界面上,这种叫端口 VLAN ;另外有单独的 802.1Q VLAN 配置界面。所以猜测,它的端口 VLAN 是另一个机制。
benmaowang
2018-12-13 08:32:19 +08:00
@atuocn 端口 07 和 08 没有什么 pvid,它们相当于 trunk 口。假如这两个端口进来的一个广播或未知单播报文,会向所有 VLAN 1、2、3 的端口广播。

另外那个 802.1Q VLAN 配置界面,是指的交换机级联的应用场景,这时从端口 08 出去的报文是带 tag 的。
atuocn
2018-12-13 11:21:39 +08:00
@benmaowang 感谢!
这可以解释结果。

但是我想,pvid 应该还是会有的吧。因为交换机内部,不会有的帧打 tag,有的帧不打 tag,这对内部交换逻辑太复杂了。可能在这里他特殊处理了,象你说的,这两个端口进来的一个广播或未知单播报文,会向所有 VLAN 1、2、3 的端口广播。

还有个可能性,毕竟是 soho 级的简单网管交换机。概念太复杂了不好用。也许他就是简单按端口分组,内部都没有 tag。然后,直接按端口分组,划在一组的就广播。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/516039

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX