V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
atuocn
V2EX  ›  分享发现

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

  •  
  •   atuocn · 2018-12-10 10:59:34 +08:00 · 5670 次点击
    这是一个创建于 2186 天前的主题,其中的信息可能已经有所发展或是发生改变。

    折腾家里的路由器和交换机,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 》

    11 条回复    2018-12-13 11:21:39 +08:00
    iwtbauh
        1
    iwtbauh  
       2018-12-10 20:48:16 +08:00 via Android
    其实 vlan 说白了就是将单一接口映射到多个网络。
    goodryb
        2
    goodryb  
       2018-12-11 08:34:51 +08:00 via iPhone
    和终端没关系呀,为啥说手机电脑不支持 vlan,搞笑了
    楼主可以先去了解下 osi 七层模型

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

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

    我初次接触 pvid, untag 概念,读了几篇文章也没懂。我说过,这是我读了几篇文章总结。
    也许你很强,也没有必要用“搞笑”,“似乎”这样的词汇来沟通吧。
    benmaowang
        6
    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
        7
    nfroot  
       2018-12-12 10:35:39 +08:00
    最近接触了三层交换机,也看了下 Openwrt,虽然有图解,也有点难记。。不过慢慢也接受了。。。其实好简单的。。。
    atuocn
        8
    atuocn  
    OP
       2018-12-12 12:09:37 +08:00
    @nfroot 是的,我也是弄 Openwrt,再百度 pvid tag 啥意思。如果没有系统的学习,网上各种零散信息,难理解。弄清楚了是很简单的。
    atuocn
        9
    atuocn  
    OP
       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
        10
    benmaowang  
       2018-12-13 08:32:19 +08:00   ❤️ 1
    @atuocn 端口 07 和 08 没有什么 pvid,它们相当于 trunk 口。假如这两个端口进来的一个广播或未知单播报文,会向所有 VLAN 1、2、3 的端口广播。

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

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

    还有个可能性,毕竟是 soho 级的简单网管交换机。概念太复杂了不好用。也许他就是简单按端口分组,内部都没有 tag。然后,直接按端口分组,划在一组的就广播。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   6019 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 02:06 · PVG 10:06 · LAX 18:06 · JFK 21:06
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.