第一章 vlan的基本概念
1.1 vlan的作用
虚拟局域网VLAN是一组逻辑上的设备和用户,这些设备和用户并不受物理网段的限制,可以根据功能、部门及应用等因素将它们组织起来,相互之间的通信就好像它们在同一个网段中一样,由此得名虚拟局域网。VLAN是一种比较新的技术,工作在OSI参考模型的第2层和第3层,一个VLAN就是一个广播域,VLAN之间的通信是通过第3层的路由器来完成的。
1.2 vlan的实现原理
当VLAN交换机接收到数据后,会对数据的部分内容进行检查,并与一个VLAN配置数据库(该数据库含有静态配置的或者动态学习而得到的MAC地址等信息)中的内容进行比较后,确定数据去向,如果数据要发往一个VLAN设备(VLAN-aware),一个标记(Tag)或者VLAN标识就被加到这个数据上,根据VLAN标识和目的地址,VLAN交换机就可以将该数据转发到同一VLAN上适当的目的地;如果数据发往非VLAN设备(VLAN-unaware),则VLAN交换机发送不带VLAN标识的数据。
1.3 vlan的分类
a.基于端口的VLAN
b.基于MAC地址的VLAN
c.基于路由的VLAN
d.基于策略的VLAN
1.4 vlan帧结构
每一个支持802.1Q协议的主机,在发送数据包时,都在原来的以太网桢头中的源地址后增加了一个4字节的802.1Q桢头,之后接原来以太网的长度或类型域,关于以太网桢头的封装格式,参见以太网方面的培训教材。
这4个字节的802.1Q标签头包含了2个字节的标签协议标(TPID--Tag Protocol Identifier,它的值是8100),和两个字节的标签控制信息(TCI--Tag Control Information),TPID是IEEE定义的新的类型,表明这是一个加了802.1Q标签的本文,图2显示了802.1Q标签头的详细内容。
LAN Identified( VLAN ID ): 这是一个12位的域,指明VLAN的ID,一共4096个,每个支持802.1Q协议的主机发送出来的数据包都会包含这个域,以指明自己属于哪一个VLAN,目前TNETX 3270只支持32个VLAN。
Canonical Format Indicator( cfi ):这一位主要用于总线型的以太网与FDDI、令牌环网交换数据时的桢格式,TNETX 3270忽略此位。
Priority:这3 位指明桢的优先级。一共有8种优先级,主要用于当交换机阻塞时,优先发送哪个数据包。TNETX 3270和TNETX 4090只支持一种优先级,所以这一位也没有用,
第二章 重要结构
2.1 /include/linux/if_vlan.h
在/include/linux/if_vlan.h中定义vlan相关的基本数据结构
//每一个支持802.1q协议的主机,在发送数据包时,都在原来的以太网帧头中的源地址后增加了一个4字节的802.1q帧头
#define VLAN_HLEN 4 /* The additional bytes (on top of the Ethernet header)
* that VLAN requires.
*/
//VLAN以太网头部的地址长度字节
#define VLAN_ETH_ALEN 6 /* Octets in one ethernet addr */
//VLAN以太网头部的长度字节
#define VLAN_ETH_HLEN 18 /* Total octets in header. */
//VLAN以太网不含CRC校验的数据最小长度
#define VLAN_ETH_ZLEN 64 /* Min. octets in frame sans FCS */
/*备注以太网的情况
#define ETH_ALEN 6 /*以太网地址,即MAC地址,6字节*/
#define ETH_HLEN 14 /*以太网头部的总长度*/
#define ETH_ZLEN 60 /*不含CRC校验的数据最小长度*/
#define ETH_DATA_LEN 1500 /*帧内数据的最大长度*/
#define ETH_FRAME_LEN 1514 /*不含CRC校验和的最大以太网数据长度*/
*/
/*
* According to 802.3ac, the packet can be 4 bytes longer. --Klika Jan
*/
//VLAN帧内数据的最大长度
#define VLAN_ETH_DATA_LEN 1500 /* Max. octets in payload */
//VLAN中不含CRC校验和的最大以太网数据长度
#define VLAN_ETH_FRAME_LEN 1518 /* Max. octets in frame sans FCS */
/*
* struct vlan_hdr - vlan header
* @h_vlan_TCI: priority and VLAN ID
* @h_vlan_encapsulated_proto: packet type ID or len
*/
struct vlan_hdr {
__be16 h_vlan_TCI; //TCI:802.1q标签头部分的priority and vlan id,标签控制信息
__be16 h_vlan_encapsulated_proto; //包类型ID或者长度
};
/**
* struct vlan_ethhdr - vlan ethernet header (ethhdr + vlan_hdr)
* @h_dest: destination ethernet address
* @h_source: source ethernet address
* @h_vlan_proto: ethernet protocol (always 0x8100)
* @h_vlan_TCI: priority and VLAN ID
* @h_vlan_encapsulated_proto: packet type ID or len
*/
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;//包类型ID或者长度
};