VLAN(Virtual Local Area Network)即虚拟局域网,是将一个物理的LAN在逻辑上划分成多个广播域(多个VLAN)的通信技术。VLAN内的主机间可以直接通信,而VLAN间不能直接互通,从而将广播报文限制在一个VLAN内;由于VLAN间不能直接互访,因此提高了网络安全性;VLAN将一个物理的LAN在逻辑上划分成多个广播域(多个VLAN),组网灵活,易于扩展等特点。
IEEE 802.1Q标准对Ethernet帧格式进行了修改,在源MAC地址字段和协议类型字段之间加入4字节的802.1Q Tag,如图1所示。
802.1Q Tag包含4个字段,其含义如下:
l Type
长度为2字节,表示帧类型。取值为0x8100时表示802.1Q Tag帧。如果不支持802.1Q的设备收到这样的帧,会将其丢弃。
l PRI
Priority,长度为3比特,表示帧的优先级,取值范围为0~7,值越大优先级越高。用于当交换机阻塞时,优先发送优先级高的数据包。
l CFI
Canonical Format Indicator,长度为1比特,表示MAC地址是否是经典格式。CFI为0说明是经典格式,CFI为1表示为非经典格式。用于区分以太网帧、FDDI(Fiber Distributed Digital Interface)帧和令牌环网帧。在以太网中,CFI的值为0。
l VID
VLAN ID,长度为12比特,表示该帧所属的VLAN。在VRP中,可配置 的VLAN ID取值范围为0~4095,但是0和4095协议中规定为保留的VLAN ID,不能给用户使用。
VLAN内的链路可以分为:
l 接入链路(Access Link):连接用户主机和交换机的链路为接入链路。如图2所示,图中PC机和交换机之间的链路都是接入链路。接入链路上通过的帧为不带Tag的以太网帧。
l 干道链路(Trunk Link):连接交换机和交换机的链路称为干道链路。如图2所示,图中交换机之间的链路都是干道链路。干道链路上通过的帧一般为带Tag的VLAN帧。
在802.1Q中定义VLAN帧后,设备的有些端口可以识别VLAN帧,有些端口则不能识别VLAN帧。根据对VLAN帧的识别情况,将端口分为4类:
l Access端口
一般用于连接用户主机端口,作为入接口时,只允许不带VLAN Tag的帧通过;作为出接口时,将帧中的Tag标记剥掉。
l Trunk端口
一般用于连接其他交换机端口,不管是作为入接口还是出接口,都只允许带VLAN Tag的帧通过。允许多个VLAN的帧通过。
l Hybrid端口
Hybrid端口既可连接用户主机端口,又可连接其他交换机端口,作为入接口时既可以接收带Tag的帧又可以接收不带Tag的帧;作为出接口时,根据配置决定保留还是剥掉帧中的Tag标记。
l QinQ端口
QinQ即802.1Q-in-802.1Q(IEEE 802.1ad),端口用于连接其他交换机,能够处理携带双层Tag标记的VLAN帧。
由于IEEE802.1Q中定义的Tag字段只有12个bit,所以在同一个二层网络中最多可以支持4096个VLAN。在实际应用中,尤其是在城域网中,需要大量的VLAN来隔离用户,4096个VLAN远远不能满足需求。
交换机提供的QinQ端口,可以给以太网帧加上双重Tag。即在VLAN帧的源地址与802.1Q Tag之间,再加一个802.1Q Tag,从而可以支持多达4096 * 4096个VLAN,满足城域网对VLAN数量的需求。
QinQ帧的格式如图3所示。外层的标签通常被称作公网Tag,用来存放公网的VLAN ID。内层标签通常被称作私网Tag,用来存放私网的VLAN ID。
我司交换机设备启动时创建默认VLAN(一般默认vlan 1,可由产品定制),且不允许用户删除默认VLAN;路由器无默认VLAN。
X7系列交换机:按创建方式不同分为静态VLAN(命令行或VCMP创建)和动态VLAN(GVRP创建),两种VLAN创建后统一用全局BIT位数组存储。最多支持4094个VLAN,则该全局BIT位数组占用内存大小为(4094+7)/8个字节,其每位BIT对应某一VLAN,其值表示该VLAN是否存在(0:未创建 1:已创建)。
#define VLAN_BITMAP_LEN_BYCHAR (4094+7)/8
UCHAR *g_pucVLANBitmap = NULL; g_pucVLANBitmap = (UCHAR *)VOS_Malloc( VLAN_BITMAP_LEN_BYCHAR * sizeof(UCHAR));
|
所有设备:L2IF模块初始化时,为每个VLAN分配一块内存,用于存储VLAN的核心数据,所有VLAN数据块以数组方式管理。
|
在交换设备上,每个Access、Trunk、Hybrid、QinQ类型的端口可以配置一个缺省VLAN。端口类型不同,缺省VLAN的含义也有所不同。
2.2.1 Access端口
Access端口只能以untag方式加入缺省VLAN(PVID),交换机默认PVID=1,路由器无缺省PVID。Access端口只能配置一个PVID,相关命令配置如下:
# interface GigabitEthernet2/0/2 portswitch port link-type access port default vlan 10 // PVID = 10 # |
设备上任一端口和任一VLAN是否存在untag关系,用1bit来表示,总存储内存如下:
#define L2IF_MAX_VLAN_NUM 4096 #define VRP_MAX_L2IF_PORT L2IF_SH_GetMaxSwitchPortNum() //产品定制设备支持的二层口数目
UCHAR *g_ppucVlanPortMap = NULL;
/* 申请g_ucVlanPortMap的内存空间 */ ulMallocLen = (L2IF_MAX_VLAN_NUM * ((VRP_MAX_L2IF_PORT + 7) / 8) * sizeof(UCHAR)); g_ppucVlanPortMap = (UCHAR *)VOS_Malloc(ulMidL2if, ulMallocLen);
|
对于路由器设备(如8090):
l 当Access端口不配置PVID时:无论收到的帧是否带tag,都将直接丢弃;无论发送的帧是否带tag,都将直接丢弃。
l 当Access端口配置PVID时:收到的帧不带tag时,添加本端口的PVID,进行下一步处理;若收到的帧带tag时,则直接丢弃。
l 当Access端口配置PVID,发送带tag帧时:如果帧中VID和配置的PVID相同,则先剥离VLAN tag,然后再发送;如果帧中VID和配置的PVID不相同,则丢弃。
l 总结:Access端口使用时必须要配置本端口的PVID,否则将无法收发帧。
对于交换机设备(如S9300):
l 可配置PVID(port default vlan),PVID肯定存在,默认PVID=1,
l 当收到的帧不带tag时,添加本端口的PVID,进行下一步处理。
l 当收到的帧带tag时,则与本端口的PVID进行比较,如果相同则进行下一步处理,否则丢弃该帧。
l 发送帧时,如果tag中VID和配置PVID相同,则首先剥掉该Vlan tag后发送
l 发送帧时,如果tag中VID和配置PVID不相同,则丢弃
2.2.2 Trunk端口
Trunk端口以tag方式加入多个VLAN,相关命令配置如下:
# interface GigabitEthernet2/0/2 portswitch port link-type trunk port trunk allow-pass vlan 2 to 3000 # |
设备上任一端口和任一VLAN是否存在tag关系,用1bit来表示,总存储内存如下:
#define L2IF_MAX_VLAN_NUM 4096 #define VRP_MAX_L2IF_PORT L2IF_SH_GetMaxSwitchPortNum() //产品定制设备支持的二层口数目
UCHAR * g_ppucVlanTrunkPortMap = NULL;
/* 申请g_ppucVlanTrunkPortMap的内存空间 */ ulMallocLen = (L2IF_MAX_VLAN_NUM * ((VRP_MAX_L2IF_PORT + 7) / 8) * sizeof(UCHAR)); g_ppucVlanTrunkPortMap = (UCHAR *)VOS_Malloc(ulMidL2if, ulMallocLen);
|
对于路由器设备(如8090):
l 当端口配置为Trunk端口类型时无法配置PVID。
l 当收到的帧不带tag时,则直接丢弃该帧
l 当收到的帧带tag时,判断是否该Trunk端口允许该tag进入,如果允许则进行下一步处理,不允许则丢弃。
l 发送帧时,判断Trunk端口是否允许该带tag的帧通过,允许则直接发送,不允许则丢弃
对于交换机设备(如S9300):
l 可配置PVID(port trunk pvid vlan),PVID肯定存在,默认PVID=1,且端口默认加入VLAN 1(port trunk allow-pass vlan 1)
l 收到不带tag的帧,首先直接添加PVID(因为trunk口至少有一个PVID),然后判断是否配置了port trunk allow-pass,如果配置了则允许进来,否则会直接丢弃。
l 收到带tag的帧,如果没有配置port trunk allow-pass则直接丢弃 (与PVID无关)
l 发送的帧带tag时
a) 首先判断是否为本端口的PVID(=X),如果是然后再判断是否配置了port trunk allow-pass vlan PVID, 如果配置了则剥掉该tag后直接发送
b) 如果发送的帧的不是PVID,然判断是否配置了port trunk allow-pass vlan X,如果配置了则,直接发送;如果没配置则直接丢弃。
2.2.3 Hybrid端口
对于路由器设备(如8090):
l 收到的帧不带tag时:当不配PVID,则直接丢弃该帧;如果配置PVID后则加上PVID进行下一步处理
l 当收到帧带tag时,判断是否允许该帧通过(即PVID等于该帧中的vlan,或者port trunk allow-pass vlan 等于该帧中的vlan即可),如果允许则进行下一步处理,否则丢弃。
l 当发送帧时,则首先比较是否与本端口的PVID相等,如果相等,则剥掉该tag后发送;如果不相等,判断是否允许通过,如果允许则直接发送。不允许则丢弃。如果Hybrid口要发送的帧的vlanid是3,而且Hybrid口既配置了PVID=3,而且又配置了port trunk allow-pass vlan 3,那么将先比较是否与PVID相等,此处相等则剥掉该帧的tag后直接发送,所以PVID优先级要高于port trunk allow-pass vlan。
对于交换机设备(如S9300):
l 当收到的帧不带tag时,判断是否指定了port hybrid tag/untag vlan,如果指定了则会添加本端口的PVID继续处理,否则丢弃该帧 。
l 当收到的帧带tag时,直接判断是否指定了port hybrid tag/untag vlan,如果指定了则允许进入,否则直接丢弃。与PVID无关。
l 发送帧的情况:
Hybrid端口发送帧时,也必须指定该hybrid端口允许通过的vlan是tagged还是untagged(port hybrid tagged/untagged vlan vlanid),如果不指定,数据帧将会被丢弃,而不会被发送。如果指定通过的vlan的属性是tagged,那么,发送该帧时将直接带着tag发送。如果指定通过的vlan的属性是untagged的,那么将会将该帧的tag剥掉后发送。
l PVID和指定的tagged和untagged的vlan的关系:
(a) 如果设置了VLAN2 是 tagged的,那么从Hybrid口发出的VLAN2帧就是tagged,跟当前的pvid 没有任何关系。
(b) 如果设置了VLAN3是untagged的,那么从Hybrid口发出的VLAN3的帧也与当前的pvid没有任何关系。
(c) Hybrid口设置的PVID的作用只是在于当Hybrid口收到一个不带tag的帧时,加上一个PVID后作后续处理,当Hybrid口发送数据帧的时候PVID并未起作用。
2.2.4 QinQ端口
l 对于从QinQ端口接收的帧,无论该帧是否带Tag标记,都会在帧中再加一外层Tag,并将Tag中的VID字段的值设置为端口所属的缺省VLAN编号。
l 对于QinQ端口发送的帧,如果最外层Tag的VID字段的值等于缺省VLAN编号,将帧中最外层的Tag剥掉。
一个端口可以加入多个VLAN,多个端口也可以加入同一个VLAN。VLAN中只要有一个成员端口物理UP,则VLAN状态UP;VLAN状态UP,则该VLAN对应的VlanIf口物理状态UP。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/21754115/viewspace-1584693/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/21754115/viewspace-1584693/