简介
VLAN
(虚拟局域网 Virtual Local Area Network)是对连接到的第二层交换机端口的网络用户的逻辑分段,不受网络用户的物理位置限制而根据用户需求进行网络分段。
一个VLAN
可以在一个交换机或者跨交换机实现。VLAN
可以根据网络用户的位置、作用、部门或者根据网络用户所使用的应用程序和协议来进行分组。基于交换机的虚拟局域网能够为局域网解决冲突域、广播域、带宽问题
我们知道两台计算机即使连接在同一台交换机上,只要所属的VLAN
不同就无法直接通信
在LAN
内的通信,必须在数据帧头中指定通信目标的MAC
地址。而为了获取MAC
地址,TCP/IP
协议下使用的是ARP
。ARP
解析MAC
地址的方法,则是通过广播。
也就是说,如果广播报文无法到达,那么就无从解析MAC
地址,亦即无法直接通信
计算机分属不同的VLAN
,也就意味着分属不同的广播域,自然收不到彼此的广播报文。因此,属于不同VLAN
的计算机之间无法直接互相通信。
为了能够在VLAN
间通信,需要利用OSI
参照模型中更高一层——网络层的信息(IP地址)来进行路由
路由功能,一般主要由路由器提供。但在今天的局域网里,我们也经常利用带有路由功能的交换机(三层交换机 Layer 3 Switch)来实现
使用路由器进行VLAN间路由
路由器和交换机的接线方式,大致有以下两种:
- 将路由器与交换机上的每个
VLAN
分别连接 - 不论
VLAN
有多少个,路由器与交换机都只用一条网线连接
如下图所示,交换机上有2个VLAN
,那么就需要在交换机上预留2个端口用于与路由器互联,路由器上同样需要有2个端口,两者之间用2条网线分别连接
如果采用这个办法,大家应该不难想象它的扩展性很成问题。每增加一个新的VLAN
,都需要消耗路由器的端口和交换机上的访问链接,而且还需要重新布设一条网线。
而路由器通常不会带有太多LAN
接口。新建VLAN
时,为了对应增加的VLAN
所需的端口,就必须将路由器升级成带有多个LAN
接口的高端产品,这部分成本、还有重新布线所带来的开销,都使得这种接线法成为一种不受欢迎的办法
第二种办法“不论VLAN
数目多少,都只用一条网线连接路由器与交换机”。当使用一条网线连接路由器与交换机、进行VLAN
间路由时,需要用到汇聚链接
首先将用于连接路由器的交换机端口设为汇聚链接
,而路由器上的端口也必须支持汇聚链路。双方用于汇聚链路的协议自然也必须相同。接着在路由器上定义对应各个VLAN
的子接口(Sub Interface)。
尽管实际与交换机连接的物理端口只有一个,但在理论上我们可以把它分割为多个虚拟端口
VLAN
将交换机从逻辑上分割成了多台,因而用于VLAN
间路由的路由器,也必须拥有分别对应各个VLAN
的虚拟接口
采用这种方法的话,即使之后在交换机上新建VLAN
,仍只需要一条网线连接交换机和路由器。用户只需要在路由器上新设一个对应新VLAN
的子接口就可以了。与前面的方法相比,扩展性要强得多,也不用担心需要升级LAN
接口数不足的路由器或是重新布线
汇聚链路连接交换机与路由器示例
下面是6端口的交换机,划分两个VLAN
,每个VLAN
连接两台计算机
端口 | MAC | VLAN |
---|---|---|
1 | A | 1 |
2 | B | 1 |
3 | C | 2 |
4 | D | 2 |
5 | - | - |
6 | R | 汇聚 |
红色VLAN
(ID=1)的网络地址为192.168.1.0/24
,蓝色VLAN
(ID=2)的网络地址为192.168.2.0/24
。各计算机的MAC
地址分别为A/B/C/D
,路由器汇聚链接端口的MAC
地址为R
。
交换机通过对各端口所连计算机MAC
地址的学习,生成如下的MAC
地址列表
下面分两种情况来讨论计算机之间是如何通信的,一种是VLAN
内通信,一种是跨VLAN
通信
- 计算机A与同一
VLAN
内的计算机B之间通信
计算机A发出
ARP
请求信息,请求解析B的MAC
地址。交换机收到数据帧后,检索MAC
地址列表中与收信端口同属一个VLAN
的表项。结果发现,计算机B连接在端口2上,于是交换机将数据帧转发给端口2,最终计算机B收到该帧。收发信双方同属一个VLAN
之内的通信,一切处理均在交换机内完成
- 计算机A与不同
VLAN
计算机C之间通信
- 计算机A从通信目标的IP地址(
192.168.2.1
)得出C与本机不属于同一个网段。因此会向设定的默认网关
(Default Gateway,GW)转发数据帧。在发送数据帧之前,需要先用ARP
获取路由器的MAC地址 - 得到路由器的MAC地址R后,接下来就是按图中所示的步骤发送往C去的数据帧。①的数据帧中,目标MAC地址是路由器的地址R、但内含的目标IP地址仍是最终要通信的对象C的地址
- 交换机在端口1上收到①的数据帧后,检索MAC地址列表中与端口1同属一个
VLAN
的表项。由于汇聚链路会被看作属于所有的VLAN
,因此这时交换机的端口6也属于被参照对象。这样交换机就知道往MAC地址R发送数据帧,需要经过端口6转发 - 从端口6发送数据帧时,由于它是汇聚链接,因此会被附加上
VLAN
识别信息。由于原先是来自红色VLAN
的数据帧,因此如图中②所示,会被加上红色VLAN
的识别信息后进入汇聚链路。路由器收到②的数据帧后,确认其VLAN
识别信息,由于它是属于红色VLAN
的数据帧,因此交由负责红色VLAN
的子接口接收 - 接着,根据路由器内部的路由表,判断该向哪里中继
- 由于目标网络
192.168.2.0/24
是蓝色VLAN
,且该网络通过子接口与路由器直连,因此只要从负责蓝色VLAN
的子接口转发就可以了。这时,数据帧的目标MAC地址被改写成计算机C的目标地址;并且由于需要经过汇聚链路转发,因此被附加了属于蓝色VLAN
的识别信息。这就是图中③的数据帧 - 交换机收到③的数据帧后,根据
VLAN
标识信息从MAC地址列表中检索属于蓝色VLAN
的表项。由于通信目标——计算机C连接在端口3上、且端口3为普通的访问链接,因此交换机会将数据帧除去VLAN
识别信息后(数据帧④)转发给端口3,最终计算机C才能成功地收到这个数据帧
进行VLAN
间通信时,即使通信双方都连接在同一台交换机上,也必须经过:发送方—>交换机—>路由器—>交换机—>接收方
这样一个流程
三层交换机(Layer 3 Switch)
使用路由器进行VLAN间路由时的问题
我们知道只要能提供VLAN
间路由,就能够使分属不同VLAN
的计算机互相通信。但是,如果使用路由器进行VLAN
间路由的话,随着VLAN
之间流量的不断增加,很可能导致路由器成为整个网络的瓶颈
交换机使用ASIC
(Application Specified Integrated Circuit)专用硬件芯片处理数据帧的交换操作,在很多机型上都能实现以缆线速度
(Wired Speed)交换
而路由器,则基本上是基于软件处理的。即使以缆线速度接收到数据包,也无法在不限速的条件下转发出去,因此会成为速度瓶颈
就VLAN
间路由而言,流量会集中到路由器和交换机互联的汇聚链路部分,这一部分尤其特别容易成为速度瓶颈。并且从硬件上看,由于需要分别设置路由器和交换机,在一些空间狭小的环境里可能连设置的场所都成问题
三层交换机应用
为了解决上述问题,三层交换机
应运而生。三层交换机
本质上就是“带有路由功能的(二层)交换机”。路由属于OSI
参照模型中第三层网络层的功能,因此带有第三层路由功能的交换机才被称为“三层交换机”。
关于三层交换机的内部结构,可以参照下面的简图:
在一台本体内,分别设置了交换机模块和路由器模块;而内置的路由模块与交换模块相同,使用ASIC
硬件处理路由。因此,与传统的路由器相比,可以实现高速路由。并且,路由与交换模块是汇聚链接的,由于是内部连接,可以确保相当大的带宽
- 三层交换机内部数据通信
它和使用汇聚链路连接路由器与交换机时的情形相同。
假设有如下图所示的4台计算机与三层交换机互联。当使用路由器连接时,一般需要在LAN
接口上设置对应各VLAN
的子接口;而三层交换机则是在内部生成VLAN接口
(VLAN Interface)。VLAN接口
,是用于各VLAN
收发数据的接口
- 同一VLAN通信
首先是目标地址为B的数据帧被发到交换机,通过检索同一VLAN
的MAC地址列表发现计算机B连在交换机的端口2上,因此将数据帧转发给端口2
- 不同VLAN通信
接下来设想一下计算机A与计算机C间通信时的情形。
- 针对目标IP地址,计算机A可以判断出通信对象不属于同一个网络,因此向默认网关发送数据
Frame 1
- 交换机通过检索MAC地址列表后,经由内部汇聚链接,将数据帧转发给路由模块。在通过内部汇聚链路时,数据帧被附加了属于
红色VLAN
的VLAN
识别信息Frame 2
- 路由模块在收到数据帧时,先由数据帧附加的
VLAN识别信息
分辨出它属于红色VLAN
,据此判断由红色VLAN
接口负责接收并进行路由处理 - 因为目标网络
192.168.2.0/24
是直连路由器的网络、且对应蓝色VLAN
;因此,接下来就会从蓝色VLAN
接口经由内部汇聚链路转发回交换模块 - 在通过汇聚链路时,这次数据帧被附加上属于
蓝色VLAN
的识别信息Frame 3
- 交换机收到这个帧后,检索
蓝色VLAN
的MAC地址列表,确认需要将它转发给端口3 - 由于端口3是通常的访问链接,因此转发前会先将
VLAN识别信息
除去Frame 4
。最终,计算机C成功地收到交换机转发来的数据帧
整体的流程,与使用外部路由器时的情况十分相似——都需要经过发送方->交换模块->路由模块->交换模块->接收方