VLAN(Virtual Local Area Network)的中文名为 "虚拟局域网".VLAN 是一种将局域网设备从逻辑上划分成一个个网段, 从而实现虚拟工作组的数据交换技术. 这一技术主要应用于交换机和路由器中, 但主流应用还是在交换机之中. 但又不是所有交换机都具有此功能, 只有 VLAN 协议的第二层以上交换机才具有此功能. 802.1Q 的标准的出现打破了虚拟网依赖于单一厂商的僵局, 从一个侧面推动了 VLAN 的迅速发展.
1, 交换机端口工作模式简介
交换机端口有三种工作模式, 分别是 Access,Hybrid,Trunk.
Access 类型的端口只能属于 1 个 VLAN, 一般用于连接计算机的端口;
Trunk 类型的端口可以允许多个 VLAN 通过, 可以接收和发送多个 VLAN 的报文, 一般用于交换机之间连接的端口;
Hybrid 类型的端口可以允许多个 VLAN 通过, 可以接收和发送多个 VLAN 的报文, 可以用于交换机之间连接, 也可以用于连接用户的计算机.
Hybrid 端口和 Trunk 端口在接收数据时, 处理方法是一样的, 唯一不同之处在于发送数据时: Hybrid 端口可以允许多个 VLAN 的报文发送时不打标签, 而 Trunk 端口只允许缺省 VLAN 的报文发送时不打标签.
2, 基本概念(tag,untag,802.1Q)
untag 就是普通的 ethernet 报文, 普通 PC 机的网卡是可以识别这样的报文进行通讯;
tag 报文结构的变化是在源 Mac 地址和目的 Mac 地址之后, 加上了 4bytes 的 vlan 信息, 也就是 vlan tag 头; 一般来说这样的报文普通 PC 机的网卡是不能识别的
下图说明了 802.1Q 封装 tag 报文帧结构
带 802.1Q 的帧是在标准以太网帧上插入了 4 个字节的标识. 其中包含:
2 个字节的协议标识符(TPID), 当前置 0x8100 的固定值, 表明该帧带有 802.1Q 的标记信息.
2 个字节的标记控制信息(TCI), 包含了三个域.
Priority 域, 占 3bits, 表示报文的优先级, 取值 0 到 7,7 为最高优先级, 0 为最低优先级. 该域被 802.1p 采用.
规范格式指示符 (CFI) 域, 占 1bit,0 表示规范格式, 应用于以太网; 1 表示非规范格式, 应用于 Token Ring.
VLAN ID 域, 占 12bit, 用于标示 VLAN 的归属.
3, 交换机接口出入数据处理过程
3-1, 端口接收报文时的处理:
Acess 端口收报文:
收到一个报文, 判断是否有 VLAN 信息: 如果没有则打上端口的 PVID, 并进行交换转发, 如果有则直接丢弃(缺省)
trunk 端口收报文:
收到一个报文, 判断是否有 VLAN 信息: 如果没有则打上端口的 PVID, 并进行交换转发, 如果有判断该 trunk 端口是否允许该 VLAN 的数据进入: 如果允许则报文携带原有 VLAN 标记进行转发, 否则丢弃该报文.
hybrid 端口收报文:
收到一个报文, 判断是否有 VLAN 信息: 如果没有则打上端口的 PVID, 并进行交换转发, 如果有则判断该 hybrid 端口是否允许该 VLAN 的数据进入: 如果可以则转发, 否则丢弃.
备注: PVID 为 Port-base Vlan ID, 也就是端口的虚拟局域网 ID 号, 关系到端口收发数据帧时的 VLAN TAG 标记.
3-2, 端口发送报文时的处理
Acess 端口发报文:
将报文的 VLAN 信息剥离, 直接发送出去
trunk 端口发报文:
比较端口的 PVID 和将要发送报文的 VLAN 信息, 如果两者相等则剥离 VLAN 信息, 再发送, 否则报文将携带原有的 VLAN 标记进行转发.
hybrid 端口发报文:
判断该 VLAN 在本端口的属性
如果是 untag 则剥离 VLAN 信息, 再发送, 如果是 tag 则比较端口的 PVID 和将要发送报文的 VLAN 信息, 如果两者相等则剥离 VLAN 信息, 再发送, 否则报文将携带原有的 VLAN 标记进行转发.
4, 示例讲解
多交换机的情况下, VLAN 是怎么工作的呢? 下图所示的这种情况, 两个交换机 VLAN 相同, 都是默认 VLAN 1, 即两个交换机之间的联系同在 VLAN 1 之内. 路由器是所有节点的出口.
这时单播, 多播和广播数据自由传输, 所有节点属于同一 IP 地址. 这时节点之间的通信不会有问题, 因为交换机的 SAT 显示它们在同一 VLAN.
而下面这种连接方式就会有问题. 由于 VLAN 在连接端口的主机之间创建了三层边界, 它们将无法通信.
仔细看上图, 这里有很多问题. 第一, 所有主机都在同一 IP 网, 尽管连接到不同的 VLAN. 第二, 路由器在 VLAN 1, 因此与所有节点隔离. 最后, 两台交换机通过不同的 VLAN 互连. 每一点都会造成通信阻碍, 合在一起, 网络各元素之间会完全无法通信.
交换机用满或同一管理单元物理上彼此分离的情形是很常见的. 这种情况下, VLAN 需要通过 trunk 延伸至相邻交换机. trunk 能够连接交换机, 在网络间传载 VLAN 信息. 如下图所示:
对之前的拓扑的改进包括:
PC 1 和 PC 2 分配到 192.168.1.0 网段以及 VLAN 2.
PC 3 和 PC 4 分配到 192.168.2.0 网段以及 VLAN 3.
路由器接口连接到 VLAN 2 和 VLAN 3.
交换机间通过 trunk 线互连.
注意到 trunk 端口出现在 VLAN 1, 他们没有用字母 T 来标识. trunk 在任何 VLAN 都没有成员. 现在 VLAN 跨越多交换机, 同一 VLAN 下的节点可以物理上位于任何地方.
再次解释下什么是 Trunk:
Trunk 是在两个网络设备之间承载多于一种 VLAN 的端到端的连接, 将 VLAN 延伸至整个网络. 没有 VLAN Trunk,VLAN 也不会非常有用. VLAN Trunk 允许 VLAN 数据流在交换机间传输, 所以设备在同一 VLAN, 但连接到不同交换机, 能够不通过路由器来进行通信.
一个 VLAN trunk 不属于某一特定 VLAN, 而是交换机和路由器间多个 VLAN 的通道. 如下图所示, 交换机 S1 和 S2, 以及 S1 和 S3 之间的链路, 配置为传输从 VLAN10,20,30 以及 90 的数据流. 该网络没有 VLAN trunk 就无法工作.
当安装好 trunk 线之后, 帧在 trunk 线传输是就可以使用 trunk 协议来修改以太网帧. 这也意味着交换机端口有不止一种操作模式. 缺省情况下, 所有端口都称为接入端口. 当一个端口用于交换机间互连传输 VLAN 信息时, 这种端口模式改变为 trunk, 节点也路由器通常不知道 VLAN 的存在并使用标准以太网帧或 "untagged" 帧. trunk 线能够使用 "tagged" 帧来标记 VLAN 或优先级.
因此, 在 trunk 端口, 运行 trunk 协议来允许帧中包含 trunk 信息. 如下图所示:
PC 1 在经过路由表处理后向 PC 2 发送数据流. 这两个节点在同一 VLAN 但不同交换机. 步骤如下:
以太网帧离开 PC 1 到达 Switch 1.
Switch 1 的 SAT 表明目的地是 trunk 线的另一端.
Switch 1 使用 trunk 协议在以太网帧中添加 VLAN id.
新帧离开 Switch 1 的 trunk 端口被 Switch 2 接收.
Switch 2 读取 trunk id 并解析 trunk 协议.
源帧按照 Switch 2 的 SAT 转发至目的地(端口 4).
5, 工程实践
我们利用 cisco packet trace 工具来对上述描述的 vlan 的技术点进行工程实践, 内容包括通过四台 PC, 两台交换机, 通过一个 trunk 链路建立两个 vlan 的过程.
1, 通过 cisco packet trace 我们首先建立一个如下图的网络拓扑结果. pc1 接 switch1 的 0/1 端口; pc2 接 switch1 的 0/2 端口; laptop0 接 switch2 的 0/1 端口; laptop1 接 switch2 的 0/2 端口; trunk 链路有两台交换机的普通端口 0/3 互联.
2, 分别为四台 PC 分配静态的 IP. 如图所示 PC3 为 192168.10.1; 根据 vlan 规划, PC2 的 IP 为 192.168.20.1;laptop0 的 IP192.168.20.1;laptop1 的 IP192.168.20.2;
3, 配置 switch1, 命令如下
- Switch>enable
- Switch#configure terminal
- Switch(config)#hostname SA
- SA(config)#vlan 10
- SA(config-vlan)#exit
- SA(config)#vlan 20
- SA(config-vlan)#exit
- SA(config)#interface fa0/1
- SA(config-if)#switchport access vlan 10
- SA(config-if)#exit
- SA(config)#interface fa0/2
- SA(config-if)#switchport access vlan 20
- SA(config-if)#exit
- SA(config)#interface fa0/3
- SA(config-if)#switchport mode trunk
- SA(config-if)#switchport trunk allowed vlan all
通过测试
4, 配置 switch2, 命令如下
- Switch>enable
- Switch#configure terminal
- Switch(config)#hostname SB
- SB(config)#vlan 10
- SB(config-vlan)#exit
- SB(config)#vlan 20
- SB(config-vlan)#exit
- SB(config)#interface fa0/1
- SB(config-if)#switchport access vlan 10
- SB(config-if)#exit
- SB(config)#interface fa0/2
- SB(config-if)#switchport access vlan 20
- SB(config-if)#exit
- SB(config)#interface fa0/3
- SB(config-if)#switchport mode trunk
- SB(config-if)#switchport trunk allowed vlan all
通过测试
5, 检查 vlan 间的互通性, 从 PC3(192.168.10.1)ping PClaptop0 和 laptop1 情况如下:
来源: http://virtual.51cto.com/art/201901/590900.htm