第一章 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或者長度
};