VLAN数据帧格式
要使交换机能够分辨不同VLAN的报文,需要在报文中添加标识VLAN信息的字段。IEEE 802.1Q协议规定,在以太网数据帧的目的MAC地址和源MAC地址字段之后、协议类型字段之前加入4个字节的VLAN标签(又称VLAN Tag,简称Tag),用于标识数据帧所属的VLAN。VLAN标签在VLAN数据帧中的位置如下图1-1所示。
在一个VLAN交换网络中,以太网帧主要有以下两种形式:
有标记帧(Tagged帧):加入了4字节VLAN标签的帧。
无标记帧(Untagged帧):原始的、未加入4字节VLAN标签的帧。
以太网链路包括接入链路(Access Link)和干道链路(Trunk Link)。接入链路用于连接交换机和用户终端(如用户主机、服务器、傻瓜交换机等),只可以承载1个VLAN的数据帧。干道链路用于交换机间互连或连接交换机与路由器,可以承载多个不同VLAN的数据帧。在接入链路上传输的帧都是Untagged帧,在干道链路上传输的数据帧都是Tagged帧。
交换机内部处理的数据帧一律都是Tagged帧。从用户终端接收无标记帧后,交换机会为无标记帧添加VLAN标签,重新计算帧校验序列(FCS),然后通过干道链路发送帧;向用户终端发送帧前,交换机会去除VLAN标签,并通过接入链路向终端发送无标记帧。
字段 | 长度 | 含义 | 取值 |
TPID | 2Byte | Tag Protocol Identifier(标签协议标识符),表示数据帧类型。 | 取值为0x8100时表示IEEE 802.1Q的VLAN数据帧。如果不支持802.1Q的设备收到这样的帧,会将其丢弃。 各设备厂商可以自定义该字段的值。当邻居设备将TPID值配置为非0x8100时, 为了能够识别这样的报文,实现互通,必须在本设备上修改TPID值,确保和邻居设备的TPID值配置一致。 |
PRI | 3bit | Priority,表示数据帧的802.1p优先级。 | 取值范围为0~7,值越大优先级越高。当网络阻塞时,交换机优先发送优先级高的数据帧。 |
CFI | 1bit | Canonical Format Indicator(标准格式指示位),表示MAC地址在不同的传输介质中是否以标准格式进行封装,用于兼容以太网和令牌环网。 | CFI取值为0表示MAC地址以标准格式进行封装,为1表示以非标准格式封装。在以太网中,CFI的值为0。 |
VID | 12bit | VLAN ID,表示该数据帧所属VLAN的编号。 | VLAN ID取值范围是0~4095。由于0和4095为协议保留取值,所以VLAN ID的有效取值范围是1~4094。 |
在Linux上抓包展示
tcpdump直接查看
[secure@Michael ~]$ sudo tcpdump -i bond0 -e -v | grep vlan
tcpdump: listening on bond0, link-type EN10MB (Ethernet), capture size 262144 bytes
14:32:09.975521 e0:cc:7a:81:95:c4 (oui Unknown) > 00:50:56:ba:71:de (oui Unknown), ethertype 802.1Q (0x8100), length 214: vlan 150, p 0, ethertype IPv4, (tos 0x48, ttl 64, id 24489, offset 0, flags [DF], proto TCP (6), length 196)
14:32:09.975630 00:50:56:ba:71:de (oui Unknown) > e0:cc:7a:81:95:c5 (oui Unknown), ethertype 802.1Q (0x8100), length 70: vlan 150, p 0, ethertype IPv4, (tos 0x0, ttl 64, id 61228, offset 0, flags [DF], proto TCP (6), length 52)
...
WireShark查看
TPID
0x8100
PRI
CFI
上图往后数1位
VID
上图最后12位
注意
交换机内部处理的数据帧一律都是Tagged帧
服务器接口默认是无标记帧,接口可以配置为vlan口,接收和发送Tagged帧