技术背景
- 在部署一个企业的园区网络时,可能会将该企业不同的部门规划到不同的VLAN,而且不同的VLAN会分配不同的IP网段,那么每个部门在网络中就会成为单个逻辑单元,管理起来十分方便。
- 由于每个部门被规划在了不同的VLAN内,因此二层通信被限制在部门内部。但是在实际的网络中时常需要在部门之间实现数据通信,那么这就涉及到VLAN之间的通信问题了。
- 不同的VLAN之间是无法进行二层通信的,如下图所示,因此要实现VLAN之间的通信,就需要通过三层设备(具备三层功能,也就是路由功能的设备)来实现了。

实现VLAN之间通信的方法
通过以太网子接口实现VLAN之间的通信
不同的VLAN属于不同的广播域,通常也使用不同的IP网段,所以VLAN之间无法直接进行二层通信,为了实现VLAN之间的互通,可以在网络中增加路由器来实现,因为路由器是具备路由功能的,它能够连接不同的广播域,并且实现数据的三层转发。
示例
- 如下图所示的网络拓扑中,交换机创建了两个VLAN:VLAN10及20。将GE0/0/1接口加入VLAN10,将GE0/0/2接口加入VLAN20,那么PC1及PC2就处于两个不同的VLAN,它们互不影响,也无法进行二层通信。
- 现在网络中增加了一台路由器,由于要连接两个广播域(VLAN),因此路由器需要两个物理接口(三层接口)与交换机对接,其中GE0/0/1接口配置与PC1相同网段的IP地址,GE0/0/0接口则配置与PC2相同网段的IP地址。
- 同时交换机将GE0/0/23接口配置为Access类型并且加入VLAN10,将GE0/0/24接口配置为Access类型并且加入VLAN20。基于上述配置由于PC1与路由器的GE0/0/1接口同属一个广播域,因此它们可以直接进行二层通信,PC2与路由器的GE0/0/0接口同样如此。
- 最后PC1将默认网关设置为路由器GE0/0/1接口的地址,而PC2则将默认网关设置为路由器GE0/0/0接口的地址。

当PC1发送数据给PC2时,过程如下:
(1)PC1封装单播数据帧:
- PC1的上层协议产生的数据载荷到了网络层,数据载荷在网络层被封装一个IP头部,在IP头部中,源IP地址填写的是192.168.10.1(PC1地址),而目的IP地址则填写的是192.168.20.1(PC2地址)。
- 携带IP头部的数据包会被继续封装成帧,PC1发现数据包的目的IP地址与本地网卡的IP地址并不在同一网段,因此它判断需要将这个数据包先转发到默认网关,由默认网关将其转发到目的地。
- PC1通过网卡配置信息得到网关的IP地址192.168.10.254,然后在ARP表中查询这个IP地址对应的MAC地址。初始情况下,PC1并没有相应的ARP表项,因此它以广播的方式发送一个ARP Request数据帧,该数据帧用于请求192.168.10.254对应的MAC地址。
(2)交换机处理PC1发送广播ARP Request数据帧:
- PC1发送的广播ARP Request数据帧到达了交换机,交换机读取数据帧目的MAC地址,发现这是一个广播数据帧,而接收这个数据帧的接口GE0/0/1又加入了VLAN 10,因此交换机在VLAN 10内泛洪这个数据帧,另外GE0/0/23接口也加入了VLAN 10,因此交换机也会从这个接口发送一份拷贝出去。
- 交换机还会学习数据帧的源MAC地址,并将该地址与GE0/0/1接口绑定。
(3)路由器处理交换机泛洪的广播ARP Request数据帧:
- 路由器的GE0/0/1接口收到了这个ARP Request数据帧,由于ARP Request中填充着发送者PC1的IP地址及MAC地址,因此路由器为PC1创建一个ARP表项,
- 解封装后ARP Request数据帧,发现请求Mac地址的IP目的地址是192.168.10.254,也就是GE0/0/1接口的IP地址,因此会构造一个单播的ARP Reply数据帧回复给PC1。
(4)交换机处理路由器发送单播ARP Reply数据帧:
- ARP Reply数据帧到达交换机后,交换机在MAC地址表中查询这个数据帧的目的MAC地址,发现MAC地址表中已经有匹配的表项,且该表项的出接口为GE0/0/1(之前通过ARP Request广播报文学习的),因此它将该数据帧从GE0/0/1接口发送出去。
- 另外交换机还会学习数据帧的源MAC地址(路由器GE0/0/1接口对应的Mac地址),并将该地址与GE0/0/23接口绑定。
(5)PC1处理交换机转发路由器发送的单播ARP Reply数据帧:
- PC1收到了ARP Reply数据帧,根据报文中的内容形成192.168.10.254以及相应MAC地址的ARP表项,
- 然后将待发送给PC2的数据包封装成数据帧,帧头中目的MAC地址为路由器GE0/0/1接口的MAC地址。
- 最后将数据帧从网卡发出。
(6)交换机处理PC1发送的单播数据帧:
- 数据帧到达交换机后,交换机通过MAC地址表查询,发现该帧的目的MAC地址在表中存在匹配的表项,而且出接口为GE0/0/23,因此它将数据帧从该接口发出。
(7)路由器处理交换机转发PC1发送的单播数据帧:
- 路由器收到这个数据帧后,读取数据帧的目的MAC地址,发现目的MAC地址正是GE0/0/1接口的MAC地址,它意识到这个数据帧是发送给自己的,
- 通过帧头里的“类型”字段,路由器发现数据帧里封装的是一个IP报文,于是它将数据帧解除封装,然后将里面的IP报文交给IP协议模块去处理。
- 上层IP协议模块检查报文的IP头部中的目的IP地址,发现目的IP地址为192.168.20.1,并非本设备的IP地址,于是它在路由表中查询这个IP地址,发现该地址匹配本地直连路由192.168.20.0/24,出接口为GE0/0/0,它意识到这个数据包是要发往本地直连的一个网段。
- 因此它重新将数据包封装成帧,帧头里源MAC地址填写的是路由器GE0/0/0接口的MAC地址(数据包将从这个接口发出),目的MAC地址是PC2(192.168.20.1)的网卡MAC地址(初始时路由器可能并不知道PC2的IP地址对应的MAC地址,因此将触发ARP解析过程,和过程2-5类似,此处不再赘述)。
- 最后将数据帧从GE0/0/0接口发出。
(8)交换机处理路由器转发的单播数据帧:
- 数据帧到达交换机后,交换机通过MAC地址表查询,发现该帧的目的MAC地址在表中存在匹配的表项,而且出接口为GE0/0/2(路由器触发ARP解析PC2 Mac地址过程中,交换机可以学习PC2的Mac地址),因此它将数据帧从该接口发出。
(9)PC2处理交换机转发的单播数据帧:
- PC2收到了这个数据帧,它检查数据帧的目的MAC地址,发现填写的是本地网卡的MAC地址,于是将数据帧解除封装,将里面的载荷上交给IP协议模块,
- IP协议模块检查数据包头部,发现目的IP地址填写的正是本地网卡的IP地址,因此确认该报文是发送给自己的,它通过IP包头的“协议”字段判断IP头部里包裹的上层数据类型,再将其上交给对应的协议去处理。
- 经过上述过程,PC1发送给PC2的数据最终就完成了转发过程,到达了目的地。
引入问题
基于上述分析过程,通过路由器实现VLAN间通信的方案的确是可行的,但是有一个问题却不得不被考虑:
- 一个园区网内的VLAN数量往往不止两个,规模大一点的网络中,数十上百个VLAN的场景是很常见的,如果一个VLAN就需要占用路由器的一个物理接口,那么十个VLAN的话,路由器岂不是要拿出十个物理接口。
- 需要注意的是,路由器的接口资源是有限的,也是非常宝贵的,对于上述应用场景,这显然是不太合理的。
解决方法
- 通过路由器的以太网子接口(Sub-Interface)可以解决这个问题。
- 以太网子接口,指的是基于以太网物理接口所创建的逻辑接口。子接口是软件的、逻辑的接口,是物理上并不存在的,它的状态又依赖于对应的物理接口。
- 可以在一个物理接口上创建多个子接口,而每一个子接口即可与一个VLAN对接,从而缓解上文提出的问题。
- 在物理接口上创建子接口,可以理解为在一个大管道里开设许多小管道,这些小管道都依赖于大管道,但是彼此之间互不干扰。
示例2
如下图所示的网络拓扑中,路由器仅使用一条链路与交换机直连:
- 在路由器的物理接口GE0/0/1上创建两个子接口:GE0/0/1.10及GE0/0/1.20。
- 路由器的GE0/0/1.10子接口被指定了VLAN-ID 10,而GE0/0/1.20则被指定了VLAN-ID 20。
- 需要注意的是,子接口是逻辑接口,这两个子接口的状态与物理接口GE0/0/1息息相关,当GE0/0/1被关闭或者发生故障时,基于该物理接口所创建的所有子接口都将无法正常工作。
- 另外,子接口被创建后,需指定其对接的VLAN-ID,当该子接口向外发送数据帧时,数据帧将会被打上相应VLAN的Tag。
- 为了能够与交换机顺利对接,路由器GE0/0/1对端的交换机接口必须配置为Trunk类型(或Hybrid类型),而且要放通相应的VLAN并以标记帧的形式处理相关数据。
- 路由器会把子接口当成是一个普通接口来对待。通过子接口的方式可以大大节省硬件成本。
- 子接口的标识问题,以“GE0/0/1.10”为例,GE0/0/1指的是物理接口类型及编号,而小数点“.”后面的数字则是子接口的编号,这个编号是自定义的,没有特殊的含义。(HW交换机,在一个千兆以太网接口上最多可以创建4096个子接口)。

如下图所示,在路由器部署了子接口之后,分析PC1与PC2的数据通信过程,以PC1发往PC2的数据为例:

(1) PC1给PC2发送一个单播数据帧:
- PC1要发送数据给PC2,它判断出PC2并不在本地网段,因此将数据发往网关192.168.10.254。
- PC1发往PC2的数据帧(无标记帧)从PC1的网卡发出,其目的IP地址是192.168.20.1,但是目的MAC地址是路由器的接口MAC地址(假设此时它已经知晓了网关的MAC地址)。
(2)交换机处理PC1发送的单播数据帧:
- 交换机收到了这个数据帧,由于该帧在GE0/0/1接口到达,而该接口加入了VLAN 10,因此它在VLAN10的MAC地址表项中查询这个数据帧的目的MAC地址,假设交换机找到一个匹配的表项,并且该表项的出接口为GE0/0/24。
- 于是它将数据帧从GE0/0/24接口发出,由于该接口为Trunk类型,并且放通了VLAN10的流量,因此数据帧以标记帧的形式发出。
(3)路由器处理交换机转发的单播数据帧:
- 路由器在GE0/0/1接口上收到这个标记帧,根据数据帧携带的Tag,路由器判断出这个标记帧来源于VLAN 10,这意味着这个数据帧需要交给子接口GE0/0/1.10处理,
- 路由器将数据帧的Tag剥除,将帧头解封装,发现目的Mac地址正是本身,然后读取IP头部,发现目的IP地址并非本地所有,于是在路由表中查询目的IP地址。
- 路由器发现目的IP地址匹配本地直连路由192.168.20.0/24,而且该直连路由的出接口是GE0/0/1.20,于是它重新将数据包封装成帧,此时帧头中的源MAC地址是路由器GE0/0/1接口的MAC地址,而目的MAC地址则是PC2的MAC地址。
- 由于数据将要从子接口GE0/0/1.20送出,而该子接口又指定了VLAN-ID 20,因此路由器在数据帧中插入Tag,其中VLAN-ID为20,最后将这个标记帧发送出去。
(4)交换机处理路由器转发的单播标记数据帧:
- 交换机收到这个标记帧,从Tag中读取VLAN-ID,发现该帧来源于VLAN20,随后在MAC地址表中查询目的MAC地址,交换机只会在VLAN20中查询该MAC地址,最终,它查询到匹配表项的出接口为GE0/0/2。
- 最后将数据帧的Tag剥除,然后将无标记帧从GE0/0/2接口转发出去。
(5)PC2处理交换机转发的单播数据帧:
- PC2收到了这个数据帧,它检查数据帧的目的MAC地址,发现填写的是本地网卡的MAC地址,于是将数据帧解除封装,将里面的载荷上交给IP协议模块,
- IP协议模块检查数据包头部,发现目的IP地址填写的正是本地网卡的IP地址,因此确认该报文是发送给自己的,它通过IP包头的“协议”字段判断IP头部里包裹的上层数据类型,再将其上交给对应的协议去处理。
- 经过上述过程,PC1发送给PC2的数据最终就完成了转发过程,到达了目的地。
在许多场合中,路由器在一个物理接口上部署子接口从而实现多个VLAN互通的场景,也被称为“单臂路由”,其中单臂指的是路由器的一个物理接口,或者一条物理链路。而当路由器使用多个物理接口,并且每个物理接口单独与某个VLAN对接的场景,则被称为“多臂路由”。
717



被折叠的 条评论
为什么被折叠?



