前面简单介绍了使用交换机连接不同的服务器,这次我们看看怎么搞虚拟局域网。
虚拟局域网,也被称为VLAN(Virtual Local Area Network),是一个网络的划分概念,使得一组网络设备可以表现得像在同一个物理网络中,即使它们在地理上并不共享同一个物理网络连接。
在没有虚拟局域网的情况下,设备必须是物理连接在同一个网络交换机上才能形成局域网。而通过使用虚拟局域网,可以将设备虚拟组合在一起,无论它们在物理层面上是否彼此相连,使它们能够进行网络通信就好像它们是在同一个局域网中一样。
为什么要有虚拟局域网?
为了解决局域网广播域的问题,IEEE 协会专门设计规定了 802.1Q 的协议标准,这就是虚拟局域网 VLAN(Virtual Local Area Network,)技术,它利用软件实现了二层广播域的划分,在不增加成本的情况下,完美解决了路由器划分广播域的困难。
交换机为用户提供的一种服务,之所以称为“虚拟”局域网,是因为把物理上的局域网根据一定的原则划分为多个小的逻辑网络,这些小的逻辑网络形成各自的广播域,也就是虚拟局域网VLAN。
具有 VLAN 功能的交换机上会维护 VLAN 数据表,记录着哪些终端属于同一个 VLAN。同一个 VLAN 是一个广播域,不同的 VLAN 间的设备不能直接通信。
方式 | 优缺点 | 样式 |
---|---|---|
基于端口 | 1.定义简单 2.适合小型网络 3.适合稳定网络 | Port1 - Vlan5 |
基于MAC地址 | 1.初期配置复杂 2.后期维护简单 | MAC1 - Vlan5 |
基于子网 | 1.配置简单 2.后期维护简单 | IP 1.1.1.1/24 - Vlan5 |
基于协议 | 1.应用比较少 | IP协议 - Vlan5 |
Vlan比标准以太网帧多了tag,tag里有Vlan编号。交换机根据这个格式,就能做特殊的操作了。
交换机有两类端口,ACCESS端口和TRUNK端口,两个端口的作用和能力不同。
当“主机 A”向“主机 C”发送数据,交换机收到主机 A 发来的标准以太帧后,通过查询“vlan 表”确认该端口属于 vlan5,就在该数据帧打上 vlan5 的标签。 交换机通过查询 MAC 地址表确定转发端口为 port 7 而后通过查询 VLAN 表发现 port 7 端口也属于 VLAN5 和数据帧携带的 vlan id 一致,那么交换机在转发该数据帧前会剥去数据帧的 vlan tag 将其恢复为标准以太帧之后从 port5 转发给目的主 机 C。
当“主机 A”向“主机 D”发送数据,交换机收到主机 A 发来的标准以太帧 后通过查询“vlan 表”确认该端口属于 vlan5,就在该数据帧打上 vlan5 的标签。 交换机通过查询 MAC 地址表确定转发端口为 port 10,而后通过查询 VLAN 表发 现 port 10 端口属于 VLAN10 和数据帧携带的 vlan id 不一致,那么交换机就会将 该数据帧丢弃。
对于这种布局下的通信,需要使用Trunk口。
交换机默认的 access 链路类型端口在转发数据帧时需要将数据帧中的 vlan tag 剥离。如果交换机之间的链路能够传递带有 vlan tag 的数据帧,那么就能保证 vlan 信息不会丢失,实现跨交换机 vlan 通信。Trunk 链路类型端口可以接收和发送多个 vlan 的数据帧,并且在接收和发送过程中不对数据帧中的 vlan tag 进行任何操作。
当行政部的 PCA 发出标准以太帧,到达交换机 SW1 的端口 E1/0/2。Port2 属于 access 链路类型端口,所以 SW1 收到数据帧之后查询 vlan 表发现 E1/0/2 属于vlan10,那么就将数据帧打上 vlan10 的标签。然后 SW1 查询自己的 MAC 地址表,发现需要通过端口 E1/0/1 转发出去,而 E1/0/1 端口是 trunk 链路类型端口,允许 vlan10 通过,那么该数据帧就通过 port1 转发到交换机 SW2。
SW2 接收到该数据帧,根据数据帧中的目的 MAC 地址查询 MAC 地址表找到了转发端口 E1/0/5,之后在 vlan 表中查询发现 E1/0/5 所属 vlan 和数据帧携带的vlan id 一致。E1/0/5 端口为 access 链路类型端口,那么交换机在转发该数据帧前会剥去数据帧的vlan tag将其恢复为标准以太帧之后从端口E1/0/5转发给目的主机 PCC。
先用一个交换机,带三个PC,都是默认的Vlan1,互相是可以ping通的
ping 112.112.112.1
Ping 112.112.112.1 (112.112.112.1): 56 data bytes, press CTRL_C to break
56 bytes from 112.112.112.1: icmp_seq=0 ttl=255 time=10.898 ms
56 bytes from 112.112.112.1: icmp_seq=1 ttl=255 time=2.828 ms
56 bytes from 112.112.112.1: icmp_seq=2 ttl=255 time=2.286 ms
56 bytes from 112.112.112.1: icmp_seq=3 ttl=255 time=2.215 ms
56 bytes from 112.112.112.1: icmp_seq=4 ttl=255 time=2.290 ms
--- Ping statistics for 112.112.112.1 ---
5 packet(s) transmitted, 5 packet(s) received, 0.0% packet loss
round-trip min/avg/max/std-dev = 2.215/4.103/10.898/3.404 ms
把PC2\PC3连放到Vlan10,PC4放到Vlan20,测试连通性
[H3C]vlan 10
[H3C-vlan10]port GigabitEthernet1/0/1
[H3C-vlan10]port GigabitEthernet1/0/2
[H3C-vlan10]quit
[H3C]vlan 20
[H3C-vlan20]port GigabitEthernet1/0/3
[H3C]display vlan
[H3C]display vlan 10
[H3C]display vlan 20
从PC2 ping PC3可以,ping PC4失败
ping 112.112.112.2
Ping 112.112.112.2 (112.112.112.2): 56 data bytes, press CTRL_C to break
56 bytes from 112.112.112.2: icmp_seq=0 ttl=255
ping 112.112.112.3
Ping 112.112.112.3 (112.112.112.3): 56 data bytes, press CTRL_C to break
Request time out
再加一台交换机,两台交换机相连接口设置为TRUNK口,第二台交换机也有Vlan20,有PC5,试试PC4和PC5互不互通,PC2和PC5互不互通
[H3C]interface GigabitEthernet 1/0/10
[H3C-GigabitEthernet1/0/10]port link-type trunk
[H3C-GigabitEthernet1/0/10]port trunk permit vlan 20
[H3C-GigabitEthernet1/0/10]display this
#
interface GigabitEthernet1/0/10
port link-mode bridge
port link-type trunk
port trunk permit vlan 1 20
combo enable fiber
#
return
system-view
[H3C]sysname SW2
[SW2]vlan 20
[SW2-vlan20]port GigabitEthernet 1/0/1
[SW2-vlan20]quit
[SW2]interface GigabitEthernet 1/0/10
[SW2-GigabitEthernet1/0/10]port link-type trunk
[SW2-GigabitEthernet1/0/10]port trunk permit vlan 20
[SW2-GigabitEthernet1/0/10]display this
#
interface GigabitEthernet1/0/10
port link-mode bridge
port link-type trunk
port trunk permit vlan 1 20
combo enable fiber
#
return
从pc4 ping pc6就通了
ping 112.112.112.4
Ping 112.112.112.4 (112.112.112.4): 56 data bytes, press CTRL_C to break
56 bytes from 112.112.112.4: icmp_seq=0 ttl=255 time=26.016 ms
从pc2 ping pc6不通
ping 112.112.112.4
Ping 112.112.112.4 (112.112.112.4): 56 data bytes, press CTRL_C to break
Request time out
组网还是挺好玩的,实战比理论知识要简单一些
大家如果喜欢我的文章,可以关注我的公众号(程序员麻辣烫)
我的个人博客为:https://shidawuhen.github.io/
往期文章回顾: