返回

快速理解网络协议(六)VLAN

本文概览

本文概览
本文概览

VLAN

Virtual Local Area Network,即虚拟局域网,用于将局域网的物理拓扑与逻辑拓扑解耦。将一个物理的局域网在逻辑上划分成多个广播域,VLAN 内的网络设备可以直接通信,跨 VLAN 不能直接通信,必须经由路由器等路由设备,从而将广播报文限制在单个广播域内。

VLAN 出现的背景

随着以太网的迅猛发展,网络接入设备呈指数级增长。而以太网在节点间传输数据基于共享物理介质,局域网中的网络设备越多,冲突的概率就会越高,性能会显著下降。其次,广播帧传递的范围太大,导致局域网的带宽资源、网络设备处理广播帧的 CPU 资源等资源的无谓消耗,影响整个局域网的性能。除此之外,在企业管理中,随着人员的变动,添加新设备时常常需要重新布线。而且通常会将不同部门划分不同的网络,以提高安全性。 虽然路由器也可以分割广播域,但由于路由器设备的价格较贵,而且分割的局域网个数受限于路由器的端口,而路由器本身的端口数量较少。在这种环境下,用于在交换机(特指二层交换机)上分割局域网的 VLAN 技术应运而生。

总结一下局域网物理拓扑的缺点:

  1. 网络设备越多,冲突概率越高,导致性能下降
  2. 广播风暴消耗资源,影响局域网的整体性能
  3. 扩展性低,无法灵活的分割网络

VLAN 的作用

VLAN 的出现解决了局域网物理拓扑带来的限制,其作用说白了只有一点,按需分割广播域。将一个物理网络划分成多个逻辑网络,可以理解为将一台真实的交换机在逻辑上分为了多个交换机。

VLAN 数据帧格式

重新复习一遍传统以太网帧的格式的解析

传统以太网帧
传统以太网帧

IEEE 802.1Q 标准协议1的 VLAN 数据帧格式,是在传统以太网帧的目的 MAC 地址和源 MAC 地址字段之后,协议类型字段之前加入 4 个字节的 VLAN 标签(VLAN Tag 简称 Tag),用于标识数据帧所属的 VLAN。下图中的红色部分表示 VLAN 标签。

VLAN 帧
VLAN 帧

以下仅对 VLAN 标签作出解释,其他字段的含义可查看传统以太网帧的格式

  • TPID:Tag protocol identifier 标签协议标识符,表示数据帧类型,0x8100 表示 IEEE 802.1Q 帧,长度为 2 个字节
  • TCI:Tag control information,包含了数据帧控制信息,同样由 2 个字节组成
    • PCP(PRI):Priority code point,表示数据帧的优先级。之前的名称为 PRI,具体含义没变。PCP 占 3 bits,所以取值范围为 0 ~ 8,值越大表示优先级越高。如果发生拥塞,交换机首先发送优先级最高的数据包
    • DEI(CFI):Drop eligible indicator 丢弃资格标识符,表示 MAC 地址封装是否符合规范格式,之前的名称为 CFI。DEI 占 1 bit,0 表示 MAC 地址以标准格式进行封装
    • VID:VLAN identifier,表示帧所属的 VLAN。一般情况下在 TCI 中,只关心 VID。VID 占 12 bits,取值范围为 0 ~ 4095,总计可以标识 4096 个 VLAN

在一个 VLAN 网络中,数据帧由两种类型,有标记帧(tagged frame)和无标记帧(untagged frame)。交换设备的端口按照处理数据帧的能力,分为 Access 接口、Trunk 接口和 Hybrid 接口。每个接口都可以配置一个默认的 VLAN ID,用于为 untagged frame 添加 VLAN Tag。称为缺省 VLAN ID,即 PVID(Port Default VLAN ID)。

接口类型 作用 可处理的数据帧
Access 连接终端设备,如计算机或 IP 电话 单个 VLAN 的数据帧,即 untagged frame。
Trunk 连接交换机之间或交换机与路由器之间 多个 VLAN 的数据帧,通过 VLAN 标签区分。
即可同时收发 tagged、untagged frame。
untagged frame 仅存在于发送数据帧时剥离 VLAN 标签,转发给特定 VLAN
Hybrid 结合 Access 和 Trunk 的功能,可连接终端设备,同时处理多个 VLAN 单个或多个 VLAN 的数据帧,根据配置确定

VLAN 的优缺点

  1. 优点
    • 按需分割广播域
    • 减少广播流量
    • 提高安全性
    • 简化管理成本
  2. 缺点
    • VLAN ID 仅有 4096 个,在大型网络中不够用,
    • 虽然可以从逻辑上划分成多个网络,但真实的数据帧无法脱离物理网络,即全部是 underlay 网络,会带来以下问题
      • 交换机需要学习转发多个 VLAN 的数据帧,而交换机的内存有限且比较宝贵。当交换机 MAC 地址表不足以支持存储网络中的所有设备时,未存储 MAC 地址的设备的数据帧的转发,需要泛洪
      • 不同的 VLAN ID 通常会分配不同的 IP 地址段,当业务集中在某个 IP 段内时,会导致网络资源分配不均
      • 若局域网内使用 STP/RSTP 协议避免环路,则整个网络中的多个 VLAN 仅构造一颗树

VLAN 通信过程解析

为了更好的理解 VLAN 的实际通信过程,我们将分别从 VLAN 内通信、跨 VLAN 通信两个方面来详细描述及实践,其中又分别包括了同设备和跨设备两种类型,注意这里的设备指的是交换机等二层交换设备。

VLAN 内通信

同设备

同设备同 VLAN
同设备同 VLAN

同设备同 VLAN 内通信,交换机与网络中的其他设备的连接如上图所示。A 想要与 B 通信。

  1. 数据帧传输:A 判断 B 和自己同属于一个网段,发送一个 ARP 报文获取 B 的 MAC 地址。A 发送 untagged 数据帧至交换机
  2. 交换机学习:交换机接收到一个 untagged 数据帧,将 PVID(缺省 VLAN ID)作为 VID,生成 Tag 添加至数据帧。并根据数据帧的源 MAC 地址、VID 和接收数据帧的端口,生成 MAC 表项(交换机自学习详细过程
  3. 交换机转发交换机根据数据帧的源 MAC 地址 和 VID 查找 MAC 表项,此时交换机 MAC 表项中还没有 B 的信息,于是交换机会在 A 所属 VID 的 VLAN 中广播报文。在发出广播报文前,会剥离 Tag,即 B 收到的也是 untagged 数据帧。B 响应 A 发出的 ARP 报文,交换机重复步骤 2,学习到 B 的 MAC 地址、VID 和接收数据帧的端口
  4. 直接通信:此时交换机 MAC 表项中已经包含了 A、B 的 MAC 地址、VID、接收端口,后续 A、B 通信时,交换机会查找 MAC 表,从表项所对应的端口发出单播报文

同设备同 VLAN 内实践

  1. gns3 网络拓扑及配置

    GNS3
    GNS3

    • 按照图中所示分别配置 A、B 的 IP 地址为 10.1.1.10、10.1.1.20,可以自定义 VLAN,不配置的话默认是 VLAN 1

      配置 A
      配置 A
      配置 B
      配置 B

      • A:ip 10.1.1.10/24 10.1.1.1
      • B:ip 10.1.1.20/24 10.1.1.1
  2. 查看交换机 VLAN 信息,包括 VID 对应的端口信息,和 MAC 表项。可以看到,e0/0 和 e1/1 都属于 VLAN 1,且此时还无任何表项

    • show vlan
      Switch
      Switch
  3. A、B 互 ping 后,查看交换机 MAC 表。可以看到 MAC 表项中包含 VID、MAC 地址及对应的端口。

    • show mac address-table
      MAC Table
      MAC Table

跨设备

跨设备同 VLAN
跨设备同 VLAN

跨设备同 VLAN 内通信,交换机与网络中的其他设备的连接如上图所示。A 想要与 B 通信。

  1. 交换机连接端口 PVID 与数据帧 VID 相同,即 IF1 与设备 A VID 相同

    • 与同设备同 VLAN 内通信步骤相同
    • 由于 VID 与交换机 IF1 的 PVID 相同,因此交换机在发出数据帧前,会将数据帧的 tag 剥离
    • IF1 发出的数据帧为 untagged 数据帧
  2. 交换机连接端口 PVID 与数据帧 VID 不同,即 IF1 与设备 A VID 不同

    • 与同设备同 VLAN 内通信步骤相似
    • 由于 VID 与交换机 IF1 的 PVID 不同,因此交换机在发出数据帧前,不会将数据帧的 tag 剥离,直接透传该数据帧
    • IF1 发出的数据帧为 tagged 数据帧

跨设备同 VLAN 内实践

  1. gns3 网络拓扑及配置

    GNS3
    GNS3

  2. 配置 A、B 的 IP 地址为 10.1.1.10、10.1.1.20,和同设备同 VLAN 的配置命令一样

交换机连接端口 PVID 与数据帧 VID 相同

在不对交换机端口做特殊配置 VLAN 的情况下,所有设备和端口都是默认 VLAN 1,满足交换机连接端口 PVID 与 VID 相同的条件。

  • 查看 Switch 1 VLAN 信息,可以看到所有的端口都属于 VLAN 1

    Switch 1
    Switch 1

  • 在 B 上执行 ping A 的命令,并且在 Switch 1 和 Switch 2 之间抓包,可以看到 Switch 1 发往 Switch 2 的数据帧都是 untagged 数据帧

    Switch 1
    Switch 1

交换机连接端口 PVID 与数据帧 VID 不同
  • 将 Switch 1 e1/1 端口的 PVID 改为 VLAN 10

    e1/1 配置 VLAN 10
    e1/1 配置 VLAN 10

    • conf term
    • int e1/1
    • switchport trunk encapsulation dot1q (使用 IEEE 802.1Q 标准协议)
    • switchport mode trunk
    • switchport trunk native vlan 10
  • 查看 Switch 1 VLAN 信息

    • show vlan (端口 e1/1 已经不在 vlan 1 中)
      Switch 1 VLAN 信息
      Switch 1 VLAN 信息
    • show int e1/1 switchport (Trunking Native Mode VLAN 为 10)
      Switch 1 e1/1 VLAN 信息
      Switch 1 e1/1 VLAN 信息
  • 在 A 上执行 ping B 的命令,并且在 Switch 1 和 Switch 2 之间抓包,可以看到 Switch 1 发往 Switch 2 的数据帧都是 tagged 数据帧

    Switch 1
    Switch 1

跨 VLAN 通信

在文章开头处我们就说过,跨 VLAN 不能直接通信,必须经由路由器、三层交换机等路由设备,所以在后续的实践中我们需要使用三层交换机。三层交换机,本质上就是“带有路由功能的(二层)交换机”,三层交换机可以想象成一个路由器 + 一个(二层)交换机。

同设备

同设备跨 VLAN
同设备跨 VLAN

同设备跨 VLAN 通信,三层交换机与网络中的其他设备的连接如上图所示。A 想要与 B 通信。

  1. 数据帧传输:A 判断 B 和自己不属于一个网段,发送一个 ARP 报文获取网关的 MAC 地址,目的 IP 为网关的地址 10.1.1.1。A 发送 untagged 数据帧至交换机
  2. 交换机学习:交换机接收到一个 untagged 数据帧,将 PVID(缺省 VLAN ID)作为 VID,生成 Tag 添加至数据帧。并根据数据帧的源 MAC 地址、VID 和接收数据帧的端口,生成 MAC 表项
  3. 交换机回复:交换机发现目的 IP 地址是自己,附上自己的 MAC 地址,回复 ARP 应答报文
  4. 数据帧传输:A 收到交换机回复的 ARP 应答报文,记录 IP、MAC 地址的对应关系至 arp 表中,重新封装数据帧,将目的 MAC 地址填为交换机回复的 MAC 地址,目的 IP 填为 B 的 IP 地址
  5. 查找路由表:交换机接收到一个 untagged 数据帧,添加 VLAN Tag。发现数据帧中的目的 MAC 地址是自己,则需要进行三层转发。根据目的 IP 地址查找三层转发表,此时 B 的相关信息还不存在与此表中,于是继续查找路由表
  6. 交换机转发:在路由表中发现目的 IP 地址属于另一个直连网段,在此网段中广播 ARP 报文以获取 B 的 MAC 地址。在发出广播报文前,同样会剥离 Tag,即发出 untagged 数据帧
  7. 数据帧传输:B 接收到 ARP 报文后,回复 ARP 应答报文,并记录 IP、MAC 地址至自己的 arp 表中,交换机重复步骤 2,学习到 B 的 IP、MAC、VID 对应关系,并记录到三层转发表中
  8. 直接通信:后续 A、B 通信时,发送数据帧至网关并匹配三层转发表进行三层转发

同设备跨 VLAN 抓包实践

  1. gns3 网络拓扑及配置

    GNS3
    GNS3

  2. 配置 A、B 的 IP 地址为 10.1.1.10、10.1.2.10,和同设备同 VLAN 的配置命令相似,这里不再赘述

  3. 配置三层交换机

    • 配置三层交换机

      配置三层交换机
      配置三层交换机

      • conf term
      • int e0/0
      • switchport mode access
      • switchport access vlan 10
      • int vlan 10
      • ip address 10.1.1.1 255.255.255.0
      • no shut
      • vlan 20 同上
      • ip routing 这步必需,否则无法联通
    • 查看 VLAN 信息

      • show vlan

        VLAN 信息
        VLAN 信息

    • 查看路由信息

      • show ip route

        route 信息
        route 信息

    • 查看 e0/0、e1/1 MAC 地址

      e0/0 MAC 地址
      e0/0 MAC 地址
      e1/1 MAC 地址
      e1/1 MAC 地址

  4. 在 A 上执行 ping B 的命令,并且在 A 与 L3Switch、B 与 L3Switch之间抓包

    A 与 L3Switch
    A 与 L3Switch

    • A 发出的是 untagged 数据帧
    • A 请求的目的 MAC 地址是网关的 MAC 地址

    B 与 L3Switch
    B 与 L3Switch

    • B 回复的是 untagged 数据帧
    • B 请求的目的 MAC 地址是请求时的源 MAC 地址,即 e0/0 的 MAC 地址

跨设备

跨设备跨 VLAN
跨设备跨 VLAN

跨设备跨 VLAN 通信,三层交换机与网络中的其他设备的连接如上图所示。A 想要与 B 通信。

通信过程与同设备跨 VLAN 基本相似,同设备跨 VLAN 的过程中 A → 交换机 → B,相当于跨设备跨 VLAN 过程中的 A → 交换机 1 → 交换机 2,是整个跨设备跨 VLAN 通信过程的一半,剩余的半段通信过程类似。

跨设备跨 VLAN 抓包实践

  1. gns3 网络拓扑及配置

    GNS3
    GNS3

  2. 配置 A、B 的 IP 地址为 10.1.1.10、10.1.2.10

  3. 配置三层交换机

    • L3Switch-1
      L3Switch-1

      • conf term
      • 配置 A 和 L3Switch-1 之间为 access 链路
        • int e0/0
        • switchport mode access
        • switchport access vlan 10
        • no shut
      • 配置 VLAN 10、VLAN 20 IP 分别为 10.1.1.1、10.1.2.1
        • int vlan 10
        • ip address 10.1.1.1 255.255.255.0
        • no shut
        • vlan 20 同理
      • 配置 L3Switch-1 和 L3Switch-2 之间为 trunk 链路
        • int e1/1
        • switchport trunk encapsulation dot1q
        • switchport mode trunk
        • switchport trunk native vlan 10
        • no shut
    • L3Switch-2
      L3Switch-2

  4. A ping B,并在 L3Switch-1 和 L3Switch-2 之间抓包

    L3Switch-1 与 L3Switch-2
    L3Switch-1 与 L3Switch-2

    可以看到第一个 icmp 报文是不携带 VLAN ID,因为此时 L3Switch-1 的端口 PVID 和 报文中的 VID 一样,都是 10,所以发出的数据帧是 untagged 数据帧。在 L3Switch-2 发送 icmp reply 报文时,L3Switch-1 的端口 PVID 和 报文中的 VID 不同,于是 L3Switch-2 发出的是 tagged 数据帧,L3Switch-1 学习到 VID 是 20,后续的报文都会携带 VLAN ID。

VLAN 的常见应用

应用场景 描述
部门划分 企业内不同部门间相互隔离,但共享同一个物理网络
客户和内部流量隔离 云服务提供商将客户的网络流量隔离,确保安全性
楼层或建筑划分 大型企业或学校拥有多个楼层或建筑,每个楼层独立管理
无线网络划分 为企业活学校的无线网络划分多个虚拟网络
虚拟化环境中的隔离 在虚拟化环境中,为虚拟机隔离网络环境
多租户数据中心 云计算环境或数据中心需要为多个租户提供独立的网络环境

就像我们在 VLAN 的作用 中提到的,任何需要在共用物理网络的基础上,划分多个逻辑网络的小型网络,都可使用 VLAN 实现。


  1. 除了 IEEE 802.1Q 还有 ISL,两者都可在数据帧中附加 VLAN 信息。唯一的区别是 ISL 是 Cisco 产品独有的,仅能在 Cisco 网络设备间使用。 ↩︎

© Licensed Under CC BY-NC-SA 4.0