vlan详解之二层三层转发原理

前言曾经开发了二层交换机,对交换芯片的vlan处理比较熟悉,对vlan的原理自认为也是理解深刻;但是当进行到防火墙时,突然发现又不理解vlan了!
于是开始重新学习linux的vlan和桥接,更是发现不了解其含义和实现了;于是有了下面的学习结果 。
关于一些基本的概念(如广播域 冲突域 vlan)就不做说明了 。
以下内容摘抄自网上资料,出处用参考标记出来,方便大家参考,网上内容相对零散,为了方便由浅入深的方便理解,根据我自己学习过程,做了梳理 。
第一回 基于vlan的二层交换转发原理参考: https://www.jianshu.com/p/c930913948a8
普通转发流程交换机的二层转发涉及到两个关键的线程:mac地址学习流程和报文转发流程 。
MAC地址学习流程:

  1. MAC的学习:交换机接收网段上的所有数据帧,利用接收数据帧中的源MAC地址来建立MAC地址表;
  2. MAC的漂移:交换机如果发现一个包文的入端口和报文中源MAC地址的所在端口不同,就产生端口移动,将MAC地址重新学习到新的端口;
  3. MAC的老化: 如果交换机在很长一段时间之内没有收到某台主机发出的报文,在该主机对应的MAC地址就会被删除,等下次报文来的时候会重新学习 。
二层报文转发流程:
  1. 已知单播-转发:交换机在MAC地址表中查找数据帧中的目的MAC地址,如果找到,就将该数据帧发送到相应的端口
  2. 未知单播-泛洪:如果找不到,就向入端口以外的其它所有端口发送;
  3. 同端口-不转发:如果交换机收到的报文中源MAC地址和目的MAC地址所在的端口相同,则丢弃该报文;
  4. 组播和广播-泛洪:交换机向入端口以外的其它所有端口转发广播报文 。
上面流程是简单的桥交换流程,增加了VLAN以后,所有流量都在VLAN内部交换 。目前的二层交换芯片都支持vlan,如果想对二层转发有更深入了解,当然是阅读某些二层交换芯片的手册 。
参考:https://blog.csdn.net/weixin_42096901/article/details/104802047
基于vlan转发流程基于Vlan的二层转发流程主要包括:确定和查找Vlan、查找和学习源MAC、查找目的MAC并转发数据帧 。
1) 确定和查找Vlan:交换机端口接收到一个数据帧时,首先通过TPID值判断该帧是否带标签 。
若是tagged帧,且Vid≠0,则在端口所属的Vlan表中查找该帧标签中的Vid是否存在,若存在,则进入下一步,否则丢弃该帧(或提交CPU处理);
若是tagged帧,且Vid=0(即priority帧),则对该帧附加端口PVid(默认vlan)使之成为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内除收包端口外的其他所有端口洪泛该帧(洪泛广播的是未知单播帧而不是广播帧) 。
vlan详解之二层三层转发原理

文章插图
 
二层交换机转发流程实例数据帧从PC1经过一台交换机转发到与另一台交换机相连的PC2并得到响应,如下图所示 。
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帧的结构;


推荐阅读