浅浅分析一下二三层转发的原理


基础概念

都在说二三层转发,那这二层和三层是什么呢?

三层指的是网络层,二层指的是数据链路层

可见,二层转发指的是同一个网段下的设备进行通信的过程,而三层转发指的是跨网段设备之间的通讯过程。

如图,主机1和主机2之间的通讯属于二层转发,但主机1要与主机A通讯时,它们并不在同一个子网,因此他俩之间的通讯属于三层转发流程。

二三层转发

二层转发流程

普通的转发流程

一般的二层转发流程是比较好理解的,主要有以下几个步骤:

  1. 已知单播-转发:交换机在MAC地址表中查找数据帧中的目的MAC地址,如果找到,就将该数据帧发送到相应的端口
  2. 未知单播-泛洪:如果找不到,就向入端口以外的其它所有端口发送;
  3. 同端口-不转发:如果交换机收到的报文中源MAC地址和目的MAC地址所在的端口相同,则丢弃该报文;
  4. 组播和广播-泛洪:交换机向入端口以外的其它所有端口转发广播报文。

基于VLAN的转发流程

VLAN是什么?

每种技术的出现都是为了解决一个实际的问题,那vlan的出现是为了解决哪一类问题呢?首先我们从理解它的名字开始,VLAN(Virtual Local Area Network)中的LAN特指的是由路由器分割而成的广播域。既然已经有了广播域,那为什么还要“虚拟”它呢?

举个例子,假设一个广播域(局域网)下有1000台电脑,每台主机都可以通过IP协议进行通信,其中一个主机1要向主机2通信,假设主机1尚未学习到主机2的mac地址,那主机1就要向整个广播域发送ARP报文,如图:

ARP报文格式

当主机1一直没有找到主机2的mac地址时,ARP请求可能会被转发到同一网络中的所有电脑,这既消耗了带宽,又会对接收请求的主机CPU产生负担,造成了广播泛滥性能下降

在这种情况下出现了VLAN技术。这种技术可以把一个LAN划分成多个逻辑的VLAN,每个VLAN是一个广播域,VLAN内的主机间通信就和在一个LAN内一样,而VLAN间则不能直接互通,广播报文就被限制在一个VLAN内。

VLAN是如何划分的?

为了让交换机能够区分不同VLAN的报文,需要在报文中添加一些特殊字段:VLAN标签。

IEEE 802.1Q封装的VLAN数据帧格式

TPID:用于标记该帧是否带有VLAN标签。

如上图所示,VID就标明了VLAN的ID,其范围是0~4095,其中0和4095保留,也就是说同一个广播域下可以分成4094个VLAN。这些标记的存在,意味着但VLAN要与外部网络通讯时,交换机需要能够剥离和插入VLAN标签。

VLAN端口

要想知道VLAN是如何工作的,我们还需要了解一下些额外的知识

上文提到了交换机需要能够剥离和插入VLAN标签,执行哪些操作都根据其端口的类型(工作模式)确定。这些工作模式具体包括:Access、Trunk和Hybrid。

Access 端口:交换机上连接用户主机的端口,只能连接接入链路。Access 端口只属于一个 VLAN,且仅向该 VLAN 转发数据帧。该 VLAN 的 Vid = 端口 PVid,故 VLAN 内所有端口都处于 untagged 状态。Access 端口在从主机接收帧时,给帧加上 Tag 标签; 在向主机发送帧时,将帧中的 Tag 标签剥掉。

Trunk 端口:交换机上与其他交换机或路由器连接的端口,只能连接汇聚链路。Trunk 端口允许多个 VLAN 的带标签帧通过,在收发帧时保留 Tag 标签。在它所属的这些 VLAN 中,对于 Vid = 端口 PVid 的 VLAN,它处于 Untagged port 状态; 对于 Vid ≠ 端口 PVid 的 VLAN,它处于 Tagged port 状态。

Hybrid 端口:交换机上既可连接用户主机又可连接其他交换机的端口,它既可连接接入链路又可连接汇聚链路。Hybrid 端口允许多个 VLAN 的帧通过,并可在出端口方向将某些 VLAN 帧的 Tag 标签剥掉。

这张表虽然不太清晰,但是清晰地说明了三种端口的区别:

三类VLAN端口工作模式

基于VLAN的二层转发

基于VLAN的二层转发主要可以分为三个步骤,首先确定和查找VLAN,再查找和学习源MAC,最后查找目的MAC并转发数据帧

1) 确定和查找VLAN:

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

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

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

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

注: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的二层转发实例

VLAN下的二层转发

假设交换机1和2刚断电重启,现在两台机器的mac地址表都为空,现在主机A要和主机C通讯,也就是跨交换机的通讯,其具体过程为:

  1. A发送的数据帧进入到1的Access端口,根据该端口的工作模式,将该帧标记上PVid并进行转发。

  2. 交换机1将A的mac地址记入mac地址表,并将该帧泛洪到所有Vid=100的端口(除了入端口)。

    这里就体现了VLAN的作用

  3. 交换机1的Trunk端口属于Vid=100的VLAN,故该端口会接收到上述数据帧。同时,该端口在Vid=100上为Tagged port,因此在发送数据帧出交换机1时,不改变Tagged帧的结构。

  4. Tagged帧到达Vid=100的Trunk端口,被接收,同样不改变帧结构。

  5. 交换机2学习到源mac地址,并将其泛洪给所有Vid=100的端口(入口除外)。

  6. 交换机2的Access端口接收到Tagged帧,剥除其标签后查找目的mac(泛洪),在找到C的mac地址后,学习并记录,将数据帧发送给C。

    这里参考网页出错了,重启之后没有mac地址表,故不能之间将数据帧转发给C

  7. C收到A发送的数据帧,并发送响应帧给PC1。

  8. 响应帧经过类似的过程发送给A,由于A的mac记录已经被记录在了mac地址表中,故响应帧仅转发给A。

三层转发流程

ARP

三层转发的一个重要基础设施是ARP,即地址解析协议,实现通过IP地址到物理地址的映射。在以太网协议中规定,同一局域网中的一台主机要和另一台主机进行直接通信,必须要知道目标主机的MAC地址,而在TCP/IP协议栈中网络层和传输层只关心目标主机的IP地址。这就导致在以太网中使用IP协议时,数据链路层的以太网协议接到上层IP协议提供的数据中,只包含目的主机的IP地址。于是需要一种方法,根据目的主机的IP地址,获得其MAC地址。这就是ARP协议要做的事情。

三层转发实例

三层转发实例

再看这个拓扑,主机1和主机A通讯的过程,就属于三层转发。还原一下1和A通讯的过程:

  1. 主机1将数据封装到一个网络层包中,包源地址是主机1的ip192.168.1.1,目的地址是主机A的ip192.168.2.1,两者处于不同的网段之中。

  2. 在IP包封装完成之后,主机通过查询路由表,得知发往192.168.2.x网段的包要通过192.168.1.1转发。

    路由表是如何生成并且维护的呢?

  3. 主机1将ip包作为数据封装在数据帧中,通过数据链路层协议转发给转发设备R。帧源地址是1的mac地址,目的地址是转发设备的mac地址。目的mac地址通过查询主机内部ARP表获取。

  4. 转发设备接收到来自主机1的数据帧,从中取出ip包,检查包目的地址知道该包需要转发给主机 A。

  5. 转发设备将ip包封装到数据帧中,通过数据链路层转发给主机A,源地址为转发设备的mac地址,目的地址为主机A的mac地址。同样的,目的mac地址通过查询主机内部ARP表获取。

  6. 主机A收到数据帧,从中解析出ip包,从而获取相应的数据。

含有VLAN的三层转发

上面说了基于VLAN的二层转发,不同VLAN下的设备之间是相互隔离的,那当两个处于不同VLAN的设备之间需要通信时,如何进行转发呢?这个时候就需要用到路由器了,看下面这张拓扑图:

VLAN下的三层转发

交换机端口的基本信息如下:

PORT MAC VLAN
1 a 1
2 b 1
3 c 2
4 d 2
5
6 f 汇聚(TRUNK)
  1. 主机A要主机C通讯,发现两者并不属于同一个网段。

  2. 和一般的二层转发一样,此时主机A要借助路由表和ARP表将IP包封装到数据帧通过数据链路层转发出去。

  3. 端口1收到数据帧,要将其转发给所有端口中同属于VLAN_1的表现,因为端口6属于汇聚端口,因此它也会收到来自1的数据帧。

    检索后得知,要去往ip地址192.168.2.2的数据帧需要经由路由器R进行转发。

  4. 端口1转发时会给数据帧加上其PVid,也就是1。路由器通过检查数据帧的VID,来确认该帧需要由负责VLAN_1的接口接收。

  5. 路由器查询路由表来确定该数据帧应当向哪里转发,由于目标IP属于VLAN_2,只需要交给负责VLAN_2的接口转发即可。该接口转发时会将数据帧打上其PVid,也就是2。

  6. 交换机收到数据帧后,根据VLAN标签从MAC地址表中检索VLAN_2的表项。由于通信目标C连接在端口3上且该端口为接入端口,因此交换机剥除数据帧的VLAN标签后转发给端口3,最终PC2成功收到PC1发来的数据帧。

以上仅仅是本人学习笔记,可能存在纰漏。

参考

https://info.support.huawei.com/info-finder/encyclopedia/zh/VLAN.html

https://blog.csdn.net/jj1130050965/article/details/122463302

https://www.likecs.com/show-203734139.html

https://blog.csdn.net/yufen9987/article/details/124238541

https://blog.csdn.net/u013283985/article/details/119251658


文章作者: Hank
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Hank !
评论
  目录