[TOC]
### **为什么需要VLAN**
VLAN全称叫Virtual Local Area Network(虚拟局域网),它的两个主要作用是
* 提高网络效率
在上一节中,我们讲到,交换机在转发数据帧时,如果帧的目的MAC地址没有在转发表中匹配到,交换机便会把数据帧从交换机的所有端口(除接收端口)转发出去,这很容易造成网络拥塞。
* 增加安全性
如果一个公司所有部门的个人电脑都连在一个交换机上,而不同部门之间不允午进行通信,那么通过VLAN就可以做到网络隔离,增加安全性。
### **VLAN的协议头**
VLAN 技术通过给数据帧插入**VLAN 标签**(又叫`VLAN TAG`)的方式,让交换机能够分辨出各个数据帧所属的 VLAN 。
VLAN 标签是用来区分数据帧所属 VLAN 的,是 4 个字节长度的字段,插入到以太网帧头部上。VLAN 标签会插入到源 MAC 地址后面,**IEEE 802.1Q**标准有这个格式定义和字段构成说明。
![](https://img.kancloud.cn/86/25/86258e103ae811592d55afbe246b3cf1_704x413.png)
* TPID (标签协议标识符):长度 2 个字节,值为`0x8100`,用来表示这个数据帧携带了 802.1Q 标签。不支持 802.1Q 标准的设备收到这类数据帧,会把它丢弃。
* TCI (标签控制信息):
长度 2 个字节,又分为三个子字段,用来表示数据帧的控制信息:
* 优先级( Priority ):长度为 3 比特,取值范围`0 ~ 7`,用来表示数据帧的优先级。取值越大,优先级越高。当交换机发送拥塞是,优先转发优先级高的数据帧。
* CFI (规范格式指示器):长度为 1 比特,取值非 0 即 1 。
* **VLAN ID**( VLAN 标识符):长度为 12 比特,用来表示 VLAN 标签的数值。取值范围是`0 ~ 4093`。
### **交换机端口类型及数据帧的转发**
在介绍这交接机的端口类型前,我们需要了解以下的知识:
1、带VLAN-TAG的数据帧只存在于交换机内,主机是识别不了这类数据帧的;当交换机把数据帧从端口发送给宿主机时,必须去掉VLAN-TAG转换成普通的数据帧
2、交换机内部的数据帧是一定带有VLAN-TAG的;从交换机发送出去(可以发给主机可能发给交换机)的数据帧可以带或不带VLAN-TAG
3、交换机的每个端口都有一个默认VLAN
接下来,我们来介绍下交换机的端口类型,有三类:Access、Trunk、Hyprid。三种类型的端口对数据包的详细处理流程,可以参考[此文](https://yq.aliyun.com/articles/557175),我们来详细分析一下。
* Access端口
Access端口一般用于连接PC,这类端口只能设置一个VLAN-ID,这个VLAN-ID就是它的默认VLAN。一般它的配置命令如下:
```
port link-type access
port default 1
```
当端口接收到数据帧时,判断这个数据帧是否带有VLAN-ID:如果没有则打上自己的默认VLAN,然后给交换机进行转发;如果有则判断是否和自己的默认VLAN是否一致,不一致则丢弃,一致则转发。
当端口要发送数据帧时,判断这个数据帧的VLAN-ID(交换机内部的数据帧一定有VLAN-ID)是否与自己的默认VLAN是否一致:不一致则丢弃;一致则去掉VLAN-ID(就是去掉VLAN-TAG那两个字节,转换为普通数据帧),然后发送出去。
比如说,如下一台交换机连了四台PC,我们把交换机的四个端口都设置为Access端口,A、C端口的默认VLAN设置为1,B、D端口的默认VLAN设置为2。接下来,我们看一下数据帧的转发流程。
![](https://img.kancloud.cn/ed/03/ed03a68d04967a55db70a277cf2f1781_531x144.png)
当PC1向PC3发送一个数据帧时,数据帧到达交换机端口A处,端口A发现数据帧没有VLAN信息,于是给它添加上自己的默认VLAN,然后交由交换机进行转发;交换机查询转发表,如果没有找到转发条目,则把数据帧从交给BCD端口进行转发;C端口收到需要发送的数据帧,发现这个数据帧的VLAN-ID和自己的默认VLAN一致,于是去掉数据帧的VLAN信息转换为普通帧再发送出去;BD端口收到需要发送的数据帧,发现这个数据帧的VLAN-ID和自己的默认VLAN不一致,于是就丢弃这个数据帧。
* Trunk端口
Trunk端口一般用来连接交换机,这类端口可以允许多个VLAN的数据帧通过。这类端口的配置命令一般为
```
port link-type trunk
port default 1
port allow-pass 2 3 4
```
当端口接收到数据帧时,判断数据帧是否携带VLAN信息:(1)如果数据帧未携带VLAN信息,则为数据帧添加自己的默认VLAN,然后交由交换机进行转发(2)如果数据帧的VLAN-ID如果不在自己的白名单(default与allow-pass)则丢弃;否则进行转发(注意:接收操作是不会更改数据帧的VLAN-ID)
当端口发送数据帧时,判断数据帧的VLAN-ID:(1)如果数据帧的VLAN-ID不在自己的白名单中,则丢丢弃(2)如果数据帧的VLAN-ID和自己的默认VLAN一致,则去掉数据帧的VLAN信息再进行发送(3)如果数据帧的VLAN-ID与自己的默认VLAN不一致,而在自己的allow-pass中,则直接发送。
比如说,如下两台交换机,连接了四台PC;A1、A2、B1、B2为Access类型端口,A3、B3为Trunk类型接口,A3、B3的默认VLAN为3,允许通过VLAN 1和2的数据帧。接下来,我们来分析一下数据帧的转发流程。
![](https://img.kancloud.cn/6e/0c/6e0cd7efdce31e5d9e75969e2d621d8a_690x143.png)
比PC1向PC3发送数据帧,当数据帧到达A1时,A1端口为数据帧添加VLAN-ID 1,然后交给交换机进行转发;交换机查找转发表,如果没有找到转发条目,则将数据帧发给A2 A3端口;A3端口在发送前,发现这个数据帧的VLAN-ID和自己的默认VLAN不一样但在自己的allow-paas中,于是原封不动地发送出去;B3接收到后,发现数据帧在自己的allow-paas中,于是交给交换机B转发;交换机B检查转发表,如果没有匹配上转发条目则发给端口B1 B2;B1发送前,发现数据帧的VLAN-ID为1,与自己的默认VLAN一致,于是去掉数据帧的VLAN信息后,再发送出去。
另外,如果把上面的A3B3的默认VLAN设置为2,我们会发现PC1和PC3是没有办法正常通信的。
* Hyprid端口
。。。
* 总结
。。。
### **参考**
* https://mp.weixin.qq.com/s/vyyFHSL2aWgSr3APXL8x6g
* https://yq.aliyun.com/articles/400955?spm=a2c4e.11153940.0.0.7a1a1a2ecLhtCV
* https://zhuanlan.zhihu.com/p/82913168
* https://www.html.cn/qa/other/20107.html
* https://yq.aliyun.com/articles/557175
- 应用层
- HTTP
- Cookie
- Session
- HTTP报文格式
- HTTP的Header字段
- HTTPS
- 简介
- 原理
- RSA加密与解密
- 证书签名与验证
- TLS双向认证
- openssl命令汇总
- DNS
- DNS的记录类型
- DNS的报文格式
- FAQ
- 传输层
- TCP
- CloseWait
- 网络层
- IPv6
- 链路层
- 链接层基础知识
- VLAN
- FAQ
- Linux网络收发包
- 网卡收包
- 网卡发包
- 收发包FAQ
- LVS
- 安装-DR模式
- 基本原理
- Ipvsadm命令
- Netfilter
- Netfilter简介
- 注册钩子函数
- Netfilter中数据包流向
- Iptables的数据结构
- 连接跟踪
- 初识连接跟踪
- 连接跟踪详解
- 连接跟踪数据结构
- 数据包与连接的状态
- NAT
- IPVS
- KubeProxy的IPVS模式
- Linux虚拟网络设备
- 虚拟网络设备简介
- Tap
- VethPair
- Vlan
- Vxlan
- Flannel的VXLAN原理
- Openstack的VXLAN原理
- VXLAN总结
- Bridge
- 给容器设置主机网段IP
- Macvlan
- Ipvlan
- IPIP
- IPIP使用介绍
- IPIP源码分析
- Limdiag网络
- 详细设计
- kubeovn
- IP命令
- Calico
- Calico常见问题
- ARP无响应
- 其他