当我谈VLAN时,我谈些什么

写在前面

作者工作中经常需要用到VLAN,尽管自己初略学习过VLAN,但纸上得来终觉浅,所以当vlan出现问题时往往是一脸懵,于是决心好好学习下VLAN,遂有了这篇文章。

本篇文章会着重关注于VLAN的知识点,对于其它计算机网络相关的知识点,如子网,链路层协议,更多只是一笔带过,所以需要读者有一定的计算机网络基础。

vlan理论知识

VLAN(虚拟局域网)技术允许在同一物理网络上创建多个隔离的逻辑网络,通过配置 VLAN,可以控制不同网络设备间的通信,即使它们连接到同一物理网络。

上图是常见的tcp/ip模型,VLAN作用于链路层,在以太网和无限局域网的实现有所区别,本文会介绍VLAN在以太网中的实现。

在以太网中,VLAN使用802.1Q VLAN标记协议实现。

相比于传统的以太网帧,802.1Q协议帧多了一个32bit大小的802.1Q头,包含以下字段:

  • 标签协议表示符 (TPID)。

    一个16位字段,值固定为0x8100,用来标识802.1Q协议帧。

  • 标签控制信息 (TCI)

    一个16位字段,包含以下子字段:

    • Priority code point (PCP)

      一个3位字段用来标识帧的优先级。

    • Drop eligible indicator (DEI)

      一个1位字段,在拥塞情况下,可以与PCP结合或单独标识该帧是否可丢弃。

    • VLAN identifier (VID)

      1个12位字段,用来标识该帧是属于哪个VLAN的。

上述字段中,需要留意的有VID,后续配置VLAN时会用到该字段。

此外,与传统的局域网 (LAN) 类似,VLAN具有虚拟接口,这个接口拥有IP地址和MAC地址。然而,VLAN接口是基于物理接口创建的,该物理接口即VLAN的父接口。VLAN通信是通过这个父接口进行的,这意味着VLAN的数据包会经过父接口来进行网络通信。

下面就以配置mac和qnx的vlan作为实战例子展开讲讲。

mac与qnx VLAN通信实战

mac和qnx ifconfig配置

  • mac连接网线的物理接口信息。

    ini 复制代码
    en8: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
         options=400<CHANNEL_IO>
         ...
         inet 169.254.234.130 netmask 0xffff0000 broadcast 169.254.255.255
         nd6 options=201<PERFORMNUD,DAD>
         media: autoselect (100baseTX <full-duplex>)
         status: active
  • qnx连接网线的物理接口信息。

    ini 复制代码
    emac0: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 1522
      capabilities rx=1f<IP4CSUM,TCP4CSUM,UDP4CSUM,TCP6CSUM,UDP6CSUM>
      capabilities tx=7f<IP4CSUM,TCP4CSUM,UDP4CSUM,TCP6CSUM,UDP6CSUM,TSO4,TSO6>
      enabled=0
      media: Ethernet autoselect (1000baseT full-duplex)
      status: active
      inet 172.20.0.11 netmask 0xffffff00 broadcast 172.20.0.255
      inet6 fe80::72b3:d5ff:fe20:391%emac0 prefixlen 64 scopeid 0x22

从上述信息可以发现两个物理接口处于不同一子网下,因此是无法直接通信的,需要配置vlan。

当然除此之外,还可以手动修改mac连接网线的物理接口的ip地址和子网掩码来达到这个目的,但该方法不是本文的重点,就不细嗦了。

如何建立vlan

前面提到过VLAN有虚拟接口,其有一个父物理接口,有一个VID字段来区分帧是属于哪个VLAN,再结合上述拿到的mac和qnx物理接口信息,很容易想到一个搭建vlan的方案:

分别在mac和qnx都创建一个VLAN,要求如下:

  • mac的VLAN虚拟接口基于en8物理接口,qnx的VLAN虚拟接口基于emac0物理接口。
  • 将两台设备VLAN的VID设置成一样。
  • 虚拟接口属于同一个子网,这可以通过设置其ip地址和子网掩码来实现。

在mac执行以下命令:

lua 复制代码
ifconfig vlan10 create
ifconfig vlan10 vlan 10 vlandev en8
ifconfig vlan10 inet 172.20.10.1 netmask 255.255.255.0
  1. ifconfig vlan10 create

    • 这个命令创建一个新的 VLAN 接口,并命名为 vlan10。这个接口在初始状态下不会绑定到任何物理接口。
  2. ifconfig vlan10 vlan 10 vlandev en8

    • 这个命令配置 VLAN 接口 vlan10 ,设置其 VLAN ID 为 10,这里的VLAN ID就是前面介绍到的VID。
    • vlandev en8 表示 vlan10 接口会绑定到物理接口 en8 。这意味着 vlan10 接口会处理通过 en8 传输且带有 VLAN ID 为 10 的数据包。
  3. ifconfig vlan10 inet 172.20.10.1 netmask 255.255.255.0

    • 这个命令会给 vlan10 接口分配 IP 地址 172.20.10.1 ,并设置子网掩码为 255.255.255.0 。这样配置后,vlan10 接口就可以在指定的 IP 地址和子网上通信。

mac执行时可能会报权限不够的错,可以通过sudo命令解决。

在qnx执行以下命令

lua 复制代码
ifconfig vlan10 create
ifconfig vlan10 vlan 10 vlandev emac0
ifconfig vlan10 inet 172.20.10.2 netmask 255.255.255.0

从ip地址和子网掩码可以看到qnx的vlan和mac的vlan是属于同一子网的。

到这,mac就可以愉快地ssh连接到qnx系统啦。

css 复制代码
ssh root@172.20.10.2

如何看VLAN配置

当我们配置好vlan后,可以通过ifconfig命令来查询VLAN配置,下面是mac里VLAN的配置信息。

yaml 复制代码
vlan10: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1496
				...
        inet 172.20.10.112 netmask 0xffffff00 broadcast 172.20.10.255
        vlan: 10 parent interface: en8
        media: autoselect (100baseTX <full-duplex>)
        status: active
  • inet 172.20.10.112 netmask 0xffffff00 broadcast 172.20.10.255 : 这表示接口的IPv4配置。inet 是分配给接口的IP地址,netmask 是子网掩码,broadcast 是广播地址。这里的IP地址属于私有地址范围,通常用于局域网内部。
  • vlan: 10 parent interface: en8 : 这表明这是VLAN编号为10的接口,其父接口是 en8
  • status: active: 表示接口处于活动状态。

背景

说完理论知识和实操,再来说点背景题外话。

作者本人现在在一家车厂做车机软件开发,给没有在车厂工作过的小伙伴简单介绍下vlan的工作背景。

目前,我们在汽车的中控屏幕所看到的系统大都是基于Android系统进行开发的,但其实车机不止一个系统(至少在我目前工作的车厂是这样的)。

我们在日常开发中,会使用一个大小约1m * 1m * 1m(这里不得不吐槽一句,如此硕大的机器让原本就不大的工位雪上加霜)的机器进行开发,机器挂载着一个类似上图所示的屏幕。

机器里有Anroid系统,qnx系统,以及其他或大或小的基于linux的系统,这些系统与Android系统是息息相关,如有一个系统是与蜂窝网络强相关的,当该系统出现问题时,Android系统的蜂窝网络也无法正常使用。

机器会延伸出多条线,其中比较重要的有:

  • 一条普通的数据线用于连接Android系统。
  • 一条网线用于ssh连接到机器的其他系统。

到这文章就结束啦,peace。

参考资料

1.IEEE 802.1Q

2.What is TCP/IP Model

相关推荐
速盾cdn2 小时前
速盾:CDN是否支持屏蔽IP?
网络·网络协议·tcp/ip
Lws12 小时前
CS144 lab0(个人理解)
网络协议
C++忠实粉丝16 小时前
计算机网络socket编程(2)_UDP网络编程实现网络字典
linux·网络·c++·网络协议·计算机网络·udp
添砖java_85716 小时前
UDP数据报套接字编程
网络·网络协议·udp
lxkj_202418 小时前
修改ffmpeg实现https-flv内容加密
网络协议·https·ffmpeg
千羽星弦19 小时前
Apache和HTTPS证书的生成与安装
网络协议·https·apache
程序猿小D1 天前
第三百三十节 Java网络教程 - Java网络UDP服务器
java·开发语言·网络·网络协议·udp·多线程
是理不是里_1 天前
常见的网络协议汇总(涵盖了不同的网络层次)
网络·网络协议
Peter_chq1 天前
【计算机网络】HTTP协议
linux·c语言·开发语言·网络·c++·后端·网络协议
琢瑜1 天前
TCP 三次握手和四次挥手
网络·网络协议·tcp/ip·linux网络编程