写在前面
作者工作中经常需要用到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连接网线的物理接口信息。
inien8: 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连接网线的物理接口信息。
iniemac0: 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
-
ifconfig vlan10 create
- 这个命令创建一个新的 VLAN 接口,并命名为
vlan10
。这个接口在初始状态下不会绑定到任何物理接口。
- 这个命令创建一个新的 VLAN 接口,并命名为
-
ifconfig vlan10 vlan 10 vlandev en8
- 这个命令配置 VLAN 接口
vlan10
,设置其 VLAN ID 为10
,这里的VLAN ID就是前面介绍到的VID。 vlandev en8
表示vlan10
接口会绑定到物理接口en8
。这意味着vlan10
接口会处理通过en8
传输且带有 VLAN ID 为10
的数据包。
- 这个命令配置 VLAN 接口
-
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。