IEEE 802.1Q封装的VLAN数据帧格式
VLAN
一. 前言
VLAN(Virtual Locl Area Network),中文称为虚拟局域网,VLAN是将不同的局域网划出来的方式。一般的应用在交换机和路由器上。在路由器的主控芯片上,通常会集成交换芯片,例如通信行业常用MT76xx系列。通过配置交换芯片,可以将交换芯片不同的端口配置为不同VLAN ID,并且配合vconfig命令,可以将交换芯片的端口划分到不同的局域网。
二. VLAN数据帧格式
非VLAN数据帧格式 (untagged) :
VLAN数据帧 (tagged) :
我们知道,普通的以太网二层包是由6 Byte的目的MAC,6 Byte的源MAC以及2 Byte的三层的协议类型号。但是VLAN数据帧是在6 Byte的目的MAC和6 Byte的源MAC后添加4 Byte的VLAN标签字段,标识这是一个带VLAN标签的包。下面解析VLAN标签四个字段的含义:
TPID :2 Byte,成为Tag Protocol Identifier(标签协议标识符),表示数据帧的类型。取值为 0x8100表示该帧是IEEE 802.1Q的VLAN数据帧。
PRI :Priority,表示数据帧的802.1p优先级。取值范围为0-7,值越大优先级越高,当交换机拥塞时,优先发送优先级高的数据帧。
CFI :Canonical Format Indicator(标准格式指示位),表示MAC地址在不同的传输介质中是否以标准格式封装,用于兼容以太网和令牌环网。1 - 以非标准格式封装,在以太网中,CFI为0。
VID :VLAN ID,数据帧所属的VLAN的编号,VLAN ID取值范围为0 - 4095。因为0和4095为协议保留值,所以VLAN ID的有效范围是1 - 4094。
PRI,CFI和VID统称为标签控制信息(Tag Control Infomation)。
三. C语言数据结构表示
struct vlan_ethhdr 结构体:
struct vlan_ethhdr {
unsigned char h_dest[ETH_ALEN];
unsigned char h_source[ETH_ALEN];
__be16 h_vlan_proto;
__be16 h_vlan_TCI;
__be16 h_vlan_encapsulated_proto;
};
本结构体来自Linux内核的include/linux/if_vlan.h,ETH_ALEN宏的值为6。
h_dest :目的MAC地址。
h_source :源MAC地址。
h_vlan_proto :TPID,802.1Q取值为0x8100。
h_vlan_TCI :PRI,CFI,VID三个值的组合。
h_vlan_encapsulated_proto :三层的协议号。
四. 总结
本文主要介绍了VLAN数据包和普通数据包的区别,以及介绍了VLAN数据包的VLAN tag字段的作用。
更多推荐
所有评论(0)