作者:网络之路一天 首发公众号:网络之路博客(ID:NetworkBlog)
单臂路由的形式虽然解决了VLAN间互通的问题,但是呢,里面存在几个比较明显的弊端。
由于早期的路由器只有两个接口,所以只能一根线接到一个二层交换机上面,造成了路径是次优的,比如client2要去Server的流量,它是先从核心交换机到出口路由器,在从出口路由器回到核心交换机,等于是绕路一圈。-
随着VLAN流量的增多,这条链路就会成为瓶颈,不管是去外网的流量还是内网互访的流量都要经过这个链路。
单点线路故障,如果线路出现问题,不管内网的还是去外网的流量都会中断,只有同一个网段内的可以互访。
早期的路由器的性能很差,交换机相对来说发展的快速很多,导致两边设备性能的不对称,比如路由器接口是10M,交换机已经发展到100M了,VLAN间互访的话流量就会被限制在10M。(模拟器是以现在的设备形态出现的,所以支持百兆千兆)
三层交换机的出现(主流解决方案)
由于早期的流量主要在于局域网之间流动,交换机的硬件发展比路由器快,出现了交换专用的处理芯片,专门来实现高速局域网转发,而当时候的路由器是依靠CPU来处理流量的,从VLAN间互访早期的解决方案来看,只要设备里面能够配置这些VLAN所在的网段,并且具有路由功能,那么这个VLAN间互访就可以实现,所以早期网络厂商在交换芯片上面集成了简单的路由功能,让交换机能够有拥有路由转发的功能,并且通过芯片能够实现快速转发,这种交换机被叫做三层交换机,因为它具备处理三层的能力(IP层的内容)。
三层交换机如何来实现的呢?(配置记得保存,后面会重复用到)
路由器通过子接口的形式,形成了多个逻辑的接口来终结对应的VLAN以及打上对应的ID,交换机就是采用了类似的形式,交换机本身就支持VLAN,在VLAN的基础上面也提出了一个逻辑接口,叫做vlanif接口(思科叫做SVI),交换机比路由器智能的地方在于,它可以一个vlan支持一个vlanif接口,等于4095个vlan,可以有4095个vlanif,每个一个vlanif id 处理对应vlan id的流量,先来体验下VLANIF,看看它是如何实现的。
(注意,配置是引用上一篇的,这里只是把路由器的线去掉了,所以VLAN什么的都是创建好的,接口也是配置好的)
如果VLAN间有了互访的需求,那该如何实现呢?(华为华三早期解决方案)【上一篇链接】
核心交换机配置
[Core]interface vlanif 10
[Core-Vlanif10]ip address 192.168.255.254 24
[Core-Vlanif10]interface vlanif 20
[Core-Vlanif20]ip address 192.168.254.254 24
[Core-Vlanif20]int vlanif 30
[Core-Vlanif30]ip address 192.168.253.254 24
[Core-Vlanif30]q
看配置是不是非常简单,创建对应VLAN的vlanif接口,配置一个网关地址,就完事了
访问也是可以的,来了解下通信过程。
(1)client 2通过查询发现目的地192.168.255.6与自己不在一个网段,于是将数据交给自己的网关处理,但是ARP表里面没有网关的对应缓存,于是发出去ARP查询,经过办公区二交换机进行二层转发(入E0/0/2接口打上vlan20 tag,记录源MAC+VID+源接口、进行泛洪,从trunk发出)。
(2)核心交换机从G0/0/2口收到该请求包后,记录源MAC+VID+源接口,发现目的MAC是全F,这个时候处理过程就不太一样了,二层交换机它是直接学习源MAC,然后泛洪,但是三层交换机由于配置了对应的vlanif,相当于启用了对应该VLAN的三层路由功能,在执行二层转发的同时,它还会监听是否有找自己的,它会把这个请求包给解除二层头部以及vlan tag,查看ARP的内容,因为这完全有可能是找的自己,所以会执行这个操作。
(3)核心发现是找的自己,于是进行ARP回应,回应的时候,由于是从vlanif20响应的,打上vlan 20的tag,然后通过MAC表从对应接口发送出去,同时在ARP缓存记录记录client 2的IP与MAC地址对应关系,还会将信息添加进三层转发表(client2的IP、MAC、对应VLANIF、出接口)
(4)办公区二通过二层转发(记录源MAC+VID,源接口的,去掉标签)交给client 2,得到网关的MAC地址。
(5)client 2的SYN发出,办公区二进行二层转发(之前已经学习过了,直接查找MAC表),最终抵达核心交换机,交换机一看目的MAC找到是自己,说明需要执行三层转发,于是交换机会查询芯片的三层表项(这里跟路由不一样,路由是直接查询路由表),发现三层表项里面没有对应表项,送往CPU查询路由表。
(6)发现匹配直连网段vlan10(server所在的),继续查找ARP表,发现没有关于服务器的缓存,于是向vlan10里面所有存在的接口发送ARP请求,办公区三二层转发(trunk接口进入,出去的时候access剥离标签),服务器收到请求后,进行回应。
核心交换机到以后,会把服务器的IP与MAC地址记录在ARP表项里面,接着把client 2发送给server的SYN重新封装二层头部(源为出接口,vlanif10的MAC,目的为服务器)发出去,同时会将信息添加进三层转发表(服务器的IP、MAC、对应VLANIF、出接口),有了这个表项,后续client2在发送给服务器的报文直接通过芯片中三层表项直接转发,实现快速转发功能。
办公区三交换机二层转发(trunk接口进入,出去的时候access剥离标签),服务器收到后,进行SYN+ACK回应。
后续的交互就跟上面这些流程一样,完成了整个通信,只是对应的设备都有响应的表项,不用在学习。
同一设备VLAN间路由核心内容总结
1、不管是单臂路由形式还是VLANIF形式,都是依靠路由表来实现,路由表的产生就是依靠在设备的接口上面配置对应的网段地址,这个地址通常作为对应VLAN的网关,路由器依靠逻辑子接口,交换机依靠VLANIF逻辑接口。
2、中间二层交换机通过二层机制进行学习记录源MAC+vid+源接口,从不同接口进入以及出去的数据帧,根据接口的链路类型进行对应的处理,对于全F广播、组播MAC以及未知单播帧进行泛洪,后续表项里面有的直接从对应记录转发出去。
3、路由器或者三层交换机这样拥有路由转发功能的设备,会有多个操作
通常下面的终端发起对其他网段的访问的时候会ARP请求,在这请求跟回应的过程中,三层设备会把该终端的IP以及MAC记录在ARP表项中
路由器在转发的时候通过路由表进行转发,同时会重新封装二层头部信息(重新的内容为该二层链路上面对应的信息),从对应的物理口或者子接口发出。
三层交换机在转发的时候,先查询三层表项,如果有,直接转发,如果没有则通过路由表查询,然后把学习到的信息记录到三层表项中,三层表项通常在缓存进ARP表项后就更新进三层表项,同时也会重新封装二层头部信息,从对应三层表项发出(或者路由表)
三层表项的作用实现的是芯片硬件转发,也就是当交换机查询三层表项没有,会进行路由查询(交由CPU处理),得到表项后,存入三层表项,后续转发通过三层表项直接硬件芯片转发,提高转发效率,节省CPU资源,这个就是现在主流厂商实现的方式,一次路由(首包由CPU处理并且建立三层硬件表项,包含终端的IP、MAC、VLANIF、物理出接口),多次交换(后续包硬件芯片转发),三层表在华为华三设备里面看不到。
4、整体下来是不是感觉,不管是二层设备也好,三层设备也好,都是通过对应的表项进行转发数据,第一次的时候需要进行学习并且记录到对应的表项里面,后续的数据转发直接通过对应的表项进行转发,核心的处理流程就是这样,二层负责打标签、传递标签、剥离标签,记录MAC表,数据到了三层设备,VLAN被终结,去往其他VLAN则通过三层转发来实现。
5、从VLAN、链路类型开始、经过了单臂路由以及三层交换转发,一直在重复的说整个数据包的传递过程,这个是为了大家加深印象,因为这些规则就是设备的工作机制,懂了这些,如果遇到某一个问题,就知道了排查的方向,比如到网关不通,你懂了整个转发的流程,就会去排查中间经过的设备,是不是VLAN没创建、接口类型不对,trunk是不是有放行,只有这些对了,数据才能正常的抵达网关进行通信,同样如果三层之间通信不通,也可以通过查询路由表,网关地址是不是配置对了,以及ARP表项是否学习到了等方面去排查, 这个就是我的初衷,通过反复的去讲解整个的通信过程,大家对于二层到三层转发都有一个很深入的了解,这样不管从学习技术原理的角度、还是排查故障的方向都有很大的帮助,这也是博主我作为这个课程开发的初衷,希望达到的效果。
6、只要二层设备的链路类型、VLAN对了,三层VLANIF以及接口类型对了,路由表、ARP表项正常,那VLAN间的通信就可以正常通信,但是见过很多朋友会去问不用写路由吗,同一个设备上面的VLANIF,配置后就自动产生了直连路由,肯定是不需要的。
华三交换机配置(配置记得保存,后续会用到)
核心交换机
[H3C]sysname Core
[Core]vlan 10
[Core-vlan10]vlan 11
[Core-vlan11]vlan 12
[Core-vlan12]q
//创建VLAN
[Core]interface g1/0/2
[Core-GigabitEthernet1/0/2]port access vlan 12
[Core-GigabitEthernet1/0/2]int g1/0/1
[Core-GigabitEthernet1/0/1]port link-type t
[Core-GigabitEthernet1/0/1]port trunk permit vlan 10 11
//接口类型配置
[Core]interface Vlan-interface 10
[Core-Vlan-interface10]ip add 192.168.10.254 24
[Core-Vlan-interface10]int Vlan-interface 11
[Core-Vlan-interface11]ip add 192.168.11.254 24
[Core-Vlan-interface11]int vlan 12
[Core-Vlan-interface12]iip add 192.168.12.254 24
[Core-Vlan-interface12]q
//VLANIF配置
接入交换机
[H3C]sysname SW1
#
[SW1]vlan 10
[SW1-vlan10]vlan 11
[SW1-vlan11]quit
#
[SW1]interface g1/0/1
[SW1-GigabitEthernet1/0/1]port link-type trunk
[SW1-GigabitEthernet1/0/1]port trunk permit vlan 10 11
[SW1-GigabitEthernet1/0/1]interface g1/0/2
[SW1-GigabitEthernet1/0/2]port access vlan 10
[SW1-GigabitEthernet1/0/2]interface g1/0/3
[SW1-GigabitEthernet1/0/3]port access vlan 11
[SW1-GigabitEthernet1/0/3]quit-
互访的过程跟上面介绍一样,这个主流厂商都是一样的实现机制,包括处理方式
-
三层交换机需要查询 路由表、缓存ARP表项、MAC表 把数据发送出去,为什么说要弄一个三层硬件的转发表项呢,可以想象下,一个设备在转发一个数据包的时候,同时查完路由表,又要查ARP缓存表,然后又查MAC表在转发出去,同时查询三个表项,而三层表项把这些信息汇总到一起,通过硬件芯片维护并且实现快速匹配来减少查询次数,来提高转发的效率。二层交换机则这查询MAC表来转发到对应的接口。
“承上启下”
对于同一个设备间的VLAN转发,我们从最早的解决方案到目前主流的都讲解过了,包括中间的整个转发流程,但是对于新手或者没经验的朋友来说,可能还会存在很多困惑,不知道在实际中如何去使用这个,出现故障后该如何处理,下一篇开始,进入实战环节。