Linux 网络协议栈开发(八)—— 基于VLAN的二层转发

时间:2024-03-30 10:55:45

一、VLAN是什么

       (这里不详细介绍VLAN,只做简单说明)

        VLAN(Vitual Local Area Network,虚拟局域网)是将物理网络划分成多个逻辑局域网的技术。一个VLAN就是一个广播域,亦即一个逻辑子网,在其内的站点可位于不同物理LAN上,但站点间像在同一个普通局域网上那样*通信而不受物理位置的限制。利用VLAN技术,网络管理者可根据实际应用需要,在二层交换机上把同一物理局域网中的用户逻辑划分成不同广播域,使具有相同需求或业务的用户处于同一广播域,不同需求或业务的用户处于不同的广播域。

         在未设置任何Vlan的二层交换机上,任何广播帧都会被转发给除接收端口外的所有其他端口。配置Vlan后,当交换机属于某Vlan的一个端口收到广播帧后,为保证同属一个Vlan的所有主机都收到该广播帧,交换机必须按照如下原则转发:

1) 发送给本交换机中同一个Vlan中的其它端口;

2) 发送给本交换机的包含该Vlan的所有汇聚链路,以便其它交换机上同一Vlan的端口也发送该帧

     下图给出交换机上创建两个Vlan后,主机发出的广播帧被转发的示例。为便于说明,以红、蓝两色识别不同Vlan(实际使用中以Vlan ID来区分)。其中端口1、2属于红色Vlan,端口3、4属于蓝色Vlan。

Linux 网络协议栈开发(八)—— 基于VLAN的二层转发

     Vlan分割广播域

    可见,从PC1发出的广播帧仅被转发给同一Vlan内的其他端口,即同属于红色Vlan的端口2,而不会再转发给属于蓝色Vlan的端口。就这样,Vlan通过限制广播帧转发的范围分割广播域,进而改善网络效率和安全性。

     Vlan可理解为在逻辑上将一台交换机分割成数台虚拟交换机,且这些虚拟交换机互不相通。Vlan是广播域,而通常两个广播域间由路由器连接,广播域间来往的数据帧由路由器中继。因此,Vlan间的通信也需要路由器(或三层交换机)提供中继服务,即“Vlan间路由”。在Vlan之间配置路由器,使Vlan内部流量仍通过原来Vlan的内部二层网络进行,从一个Vlan到另一Vlan的通信流量通过路由进行三层转发,转发到目的网络后再通过二层交换网络把数据帧最终发送给目的主机。路由器不转发以太网广播帧,故Vlan间配置的路由器不会改变划分Vlan所达到的隔离广播的目的。


二、基于VLAN的二层转发

       Vlan内通信的主机同属一个广播域,主机之间的流量通过二层网络直接转发;Vlan间通信的主机位于不同广播域,主机无法直接通过ARP广播请求到对方的地址,此时必须借助三层路由器来完成通信。

       路由器可视为各个Vlan的网关,因此通过路由器来互相通信的主机必须知道路由器的存在及其在本Vlan上的接口地址(默认网关)。在主机上配置默认网关后,对于跨Vlan的通信,主机会自动寻找默认网关,并把报文交给默认网关转发而不是直接发给目的主机。

       可见,当报文的目的MAC地址是网关地址(路由器或三层交换机MAC地址)时,该报文为三层报文。

       基于Vlan的二层转发流程主要包括:确定和查找Vlan查找和学习源MAC查找目的MAC并转发数据帧

1) 确定和查找Vlan

     交换机端口接收到一个数据帧时,首先通过TPID值判断该帧是否带标签[1]。

     若是tagged帧,且Vid≠0,则在端口所属的Vlan表中查找该帧标签中的Vid是否存在,若存在,则进入下一步,否则丢弃该帧(或提交CPU处理);

     若是tagged帧,且Vid=0(即priority帧[2]),则对该帧附加端口PVid使之成为tagged帧;

     若是untagged帧,则对该帧附加端口PVid并指定优先级使之成为tagged帧。

注:①为提高处理效率,交换机内部所有数据帧均携带Vlan标签,以统一方式处理。故需对输入交换机的数据帧进行标签检查并按需加上标签。

②802.1Q Vlan环境下,帧可分为tagged、untagged和priority-tagged三种。Tagged帧根据其携带的标签Vid进行MAC学习转发。Untagged和Priority-tagged帧进入交换机端口后根据PVid进行MAC学习转发。


2) 查找和学习源MAC

    交换机在MAC转发表(Mac+Vid+Port)中查找收帧Vid对应的源MAC表项,未找到则学习收帧源MAC (将“源MAC+Vid+Port”添加到MAC表中);若找到则更新该表项的老化时间。

注:MAC地址学习只学习单播地址,对于广播和组播地址不进行学习。组播MAC表项通过CPU配置建立。


3) 查找目的MAC

    若目的MAC是广播或组播,则在所属的Vlan中广播或组播;否则在MAC表中查找是否存在Vid对应的目的MAC表项。


4) 转发数据帧

     若在MAC表中查找到完全匹配的DMAC+Vid表项,则将该帧转发到表项中的相应端口(若相应端口为收帧端口,则应丢弃该帧);否则向所属Vlan内除收包端口外的其他所有端口洪泛该帧(洪泛广播的是未知单播帧而不是广播帧)。


图所示为二层转发的一般流程。

Linux 网络协议栈开发(八)—— 基于VLAN的二层转发

二层转发流程


【例】数据帧从PC1经过一台交换机转发到与另一台交换机相连的PC2并得到响应,如下图所示。

Linux 网络协议栈开发(八)—— 基于VLAN的二层转发

PC1向PC2发送信息


假设两台交换机刚刚开机(此时MAC地址表为空),其具体的转发过程如下:

①PC1发出的数据帧进入交换机SW1的Access端口后,按照端口PVid加上Vid=100的标签。交换机将该帧源MAC地址存入MAC地址表(学习),并将该帧洪泛到Vid=100的所有端口(除入端口外);

②SW1的Trunk端口属于Vid=100的Vlan,故接受这个标记为100的Tagged数据帧;而该端口在Vid=100上为Tagged port,因此在发送数据帧出交换机SW1时,不改变Tagged帧的结构;

③Tagged帧到达交换机SW2的Trunk端口,由于Trunk端口拥有VID=100的Vlan,故接受该帧;该Trunk端口不改变Tagged帧的结构,而是学习源MAC地址后把该数据帧洪泛给所有Vid=100的端口(除入端口外);

④SW2的Access端口接收到该帧,剥除该帧的Tag标签后发送给PC2。

⑤PC2收到PC1发送的数据帧,并发送响应帧给PC1。

⑥经过与前述过程类似的转发,响应帧到达交换机SW1。交换机发现该帧的目的MAC地址已在MAC地址表中,则仅转发给PC1。


可见,收发双方同属一个Vlan的通信,一切处理均在二层网络内完成。