1. 二层转发概述
数据链路层,位于OSI模型中的第二层,所以称之为二层。本文我们讨论的转发过程,就是在数据链路层上的转发过程,即二层转发。
1.1 MAC地址
为了唯一的表示一台网络设备,网络设备都有自己的MAC地址。IEEE 802.3标准中,MAC地址被定义为48位(6字节)的地址。MAC地址的前24位称为组织唯一标识符(OUI),由IEEE分配给厂商,剩下的24位是网络接口标识符,表示厂商生产的网络设备的序列号。在前面的文章中,我们已经讲述过MAC地址,此处不再赘述。
1.2 帧
数据链路层上转发的数据叫帧,帧中包含了源设备的MAC地址(源MAC,SMAC)和目的设备的MAC地址(目的MAC,DMAC)。根据数据帧中DMAC的差异,分为单播帧、多播帧和广播帧,这里我们只分析单播帧和广播帧。在前面的文章中,我们已经讲述过帧,此处不再赘述。
了解完这些基础概念后,我们来分析二层转发过程。
更多文章也可以参看:
https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzk1NzU5MTE1OA==&action=getalbum&album_id=3768926401970290692#wechat_redirect
2. 基于MAC的二层转发
假设设备A~C在同一个局域网,他们三者的MAC地址已经列出来了,那么A和B之间的数据转发过程如何呢?下面,我们在设备C的内部详细分析一下。
2.1 已知单播的二层转发
如果设备A已经知道设备B的MAC地址,那么发出的数据帧中的DMAC填的就是设备B的MAC地址,源MAC地址填的是自己的地址,那么具体的转发流程如下所示。
(1)源MAC学习。设备C从PORT 1收到设备A发送的数据帧,根据数据帧的SMAC学习到一条MAC地址表的条目,上图中紫色虚线所指的条目。(同理,如果从PORT 2收到设备B发送的数据帧,也会学习到相应的MAC地址表条目。)
(2)目的MAC转发。设备C根据数据帧的DMAC去MAC地址表中查找,找到对应的出端口是PORT 2,上图中绿色虚线框中的条目。那么就会将该数据帧从PORT 2转发出去,这样就完成了转发过程。
2.2 ARP协议
在上文中,我们描述的是设备A已知设备B的MAC地址的场景下的转发过程,那么我们怎么能知道设备B的MAC地址呢?这时候就需要请出我们的ARP协议了。
ARP报文的格式如下:
报文中的各个字段的含义如下:
字段 | 长度 | 含义 |
DMAC | 6字节 | 目的MAC地址 |
SMAC | 6字节 | 源MAC地址 |
Type | 2字节 | Type:指链路直接封装的上层协议类型,对于ARP请求或应答来说,该字段的值为0x0806。 |
802.1Q Tag | 4字节 | 802.1Q Tag |
Hardware Type | 16比特 | 表示硬件地址的类型。对于以太网,该类型的值为“1”。 |
Protocol Type | 16比特 | 表示发送方要映射的协议地址类型。对于IP地址,该值为0x0800。 |
Hardware Length | 8比特 | 表示硬件地址的长度,单位是字节。对于ARP请求或应答来说,该值为6。 |
Protocol Length | 8比特 | 表示协议地址的长度,单位是字节。对于ARP请求或应答来说,该值为4。 |
OP | 16比特 | 操作类型: 1 ARP请求 2 ARP应答 3 RARP请求 4 RARP应答 |
Ethernet Address of Sender | 48比特 | 发送方以太网地址。这个字段和ARP报文首部的源以太网地址字段是重复信息。 |
IP Address of Sender | 32比特 | 发送方的IP地址。 |
Ethernet Address of Destination | 48比特 | 接收方的以太网地址。发送ARP请求时,该处填充值为0x00.00.00.00.00.00。 |
IP Address of Destination | 32比特 | 接收方的IP地址。 |
FCS | 4字节 | 帧校验序列FCS(Frame Check Sequence)是为接收者提供判断是否传输错误的一种方法,如果发现错误,丢弃此帧。 FCS只是通用叫法,具体的FCS还可以细分多种校验方法。在以太帧中,FCS通常采用循环冗余码校验CRC(Cyclical Redundancy Check)。 |
如下图,A~J在同一个局域网,这时候A要和B通信,但是A不知道B的MAC地址,那么该怎么办呢?
这时,A可以发送ARP请求广播报文到整个广播域去扩散,等待B的应答,具体过程如下。(ARP报文中包含了发送方和接收方的MAC地址和IP地址,ARP请求报文中,接收方的MAC地址填全0。)
(1)A发送ARP请求广播报文到C和D,图中的橙色箭头。这时,C和D会进行源MAC学习,图中橙色的MAC地址表条目。(这里只列出了D,C与之类似。)
(2)D收到ARP请求广播报文,检查目的IP不是自己,将ARP请求广播报文泛洪到E和H,图中的橙色箭头。这时,E和H会进行源MAC学习,图中橙色的MAC地址表条目。(这里只列出了H,E与之类似。)
(3)E收到ARP请求广播报文,检查目的IP不是自己,将ARP请求广播报文泛洪到F;H收到ARP请求广播报文,检查目的IP不是自己,将ARP请求广播报文泛洪到B、G和I,图中的橙色箭头。这时,F、B、G和I会进行源MAC学习,图中橙色的MAC地址表条目。(这里只列出了B,F、G和I与之类似。)
(4)B收到ARP请求广播报文,检查目的IP是自己,查询MAC地址表,将ARP应答报文发送到H,图中的绿色箭头。同样的,这时,B会进行源MAC学习,图中橙色的MAC地址表条目。
(5)H收到ARP应答报文,检查目的IP不是自己,查询MAC地址表,将ARP应答报文发送到D,图中的绿色箭头。同样的,这时,H会进行源MAC学习,图中绿色的MAC地址表条目。
(6)D收到ARP应答报文,检查目的IP不是自己,查询MAC地址表,将ARP应答报文发送到A,图中的绿色箭头。同样的,这时,D会进行源MAC学习,图中绿色的MAC地址表条目。
(7)A收到ARP应答报文,检查目的IP是自己,这样A就知道了B的MAC地址。同样的,这时,A会进行源MAC学习,图中绿色的MAC地址表条目。
2.3 未知单播的二层转发
如果设备C上收到的报文是未知单播,又是怎样的转发过程呢?
(1)源MAC学习。设备C从PORT 1收到设备A发送的数据帧,根据数据帧的SMAC学习到一条MAC地址表的条目,上图中紫色虚线所指的条目。(同理,如果从PORT 2收到设备B发送的数据帧,也会学习到相应的MAC地址表条目。)
(2)泛洪转发。设备C根据数据帧的DMAC去MAC地址表中查找,发现并没有找到对应的MAC地址表条目。那么就会将该数据帧从除源端口外的其他所有端口转发出去,即泛洪转发。
2.4 广播的二层转发
如果设备C上收到的报文是广播帧,又是怎样的转发过程呢?
(1)源MAC学习。设备C从PORT 1收到设备A发送的数据帧,根据数据帧的SMAC学习到一条MAC地址表的条目,上图中紫色虚线所指的条目。(同理,如果从PORT 2收到设备B发送的数据帧,也会学习到相应的MAC地址表条目。)
(2)泛洪转发。设备C发现数据帧的DMAC是全F,说明是广播帧,那么就会将该数据帧从除源端口外的其他所有端口转发出去。
3. 基于VLAN的二层转发
根据前面的文章,我们知道,早期的局域网存在广播帧泛滥,信息安全等问题。而VLAN技术可以将物理局域网划分为一个一个的逻辑子网(每个逻辑子网是一个广播域),一定程度上解决了这些问题。下文,我们还是以上文的拓扑为基础(设备A~C在同一个VLAN广播域),基于VLAN内的不同类型的端口,来讲述VLAN的二层转发。
3.1 Access口的二层转发
设备C的PORT 1和PORT 2均配置成Access口,PVID配置成10。
(1)如果设备C收到的是Untagged帧,需要先插入一层802.1Q Tag,Tag中的VID值是10。如果设备C收到的Tagged帧中VID值是10,则可以接收且不需要插入802.1Q Tag。
(2)源MAC学习。设备C根据数据帧的SMAC学习到一条MAC地址表的条目,上图中紫色虚线所指的条目,MAC地址表也保存了VLAN信息。(同理,如果从PORT 2收到设备B发送的数据帧,也会学习到相应的MAC地址表条目。)
(3)目的MAC转发。设备C根据数据帧的DMAC+VLAN去MAC地址表中查找,找到对应的出端口是PORT 2,上图中绿色虚线框中的条目,那么就会将该数据帧从PORT 2转发。
(4)设备C在出口将数据帧的802.1Q Tag剥除掉,这样就完成了转发过程。
3.2 Trunk口的二层转发
设备C的PORT 1和PORT 2均配置成Trunk口,PVID配置成10,Allowed VLAN配置成20。
3.2.1 Trunk口PVID的二层转发
Trunk口PVID的二层转发与Access口PVID的二层转发一致,此处不再赘述,只简单以图片说明。
3.2.2 Trunk口Allowed VLAN的二层转发
设备C的PORT 1和PORT 2均配置成Trunk口,Allowed VLAN配置成20。
(1)如果设备C收到的Tagged帧中VID值是20,则可以接收且不需要插入802.1Q Tag。
(2)源MAC学习。设备C根据数据帧的SMAC学习到一条MAC地址表的条目,上图中紫色虚线所指的条目,MAC地址表也保存了VLAN信息。(同理,如果从PORT 2收到设备B发送的数据帧,也会学习到相应的MAC地址表条目。)
(3)目的MAC转发。设备C根据数据帧的DMAC+VLAN去MAC地址表中查找,找到对应的出端口是PORT 2,上图中绿色虚线框中的条目,那么就会将该数据帧从PORT 2转发。
(4)设备C在出口不需要剥除数据帧中的802.1Q Tag即可转发,这样就完成了转发过程。
3.3 Hybrid口的二层转发
设备C的PORT 1和PORT 2均配置成Hybrid口,PVID配置成10,Untagged VLAN配置成20,Tagged VLAN配置成30。
3.3.1 Hybrid口PVID的二层转发
Hybrid口PVID的二层转发与Access口PVID的二层转发一致,此处不再赘述,只简单以图片说明。
3.3.2 Hybrid口Untagged VLAN的二层转发
设备C的PORT 1和PORT 2均配置成Hybrid口,Untagged VLAN配置成20。
(1)如果设备C收到的Tagged帧中VID值是20,则可以接收且不需要插入802.1Q Tag。
(2)源MAC学习。设备C根据数据帧的SMAC学习到一条MAC地址表的条目,上图中紫色虚线所指的条目,MAC地址表也保存了VLAN信息。(同理,如果从PORT 2收到设备B发送的数据帧,也会学习到相应的MAC地址表条目。)
(3)目的MAC转发。设备C根据数据帧的DMAC+VLAN去MAC地址表中查找,找到对应的出端口是PORT 2,上图中绿色虚线框中的条目,那么就会将该数据帧从PORT 2转发。
(4)设备C在出口将数据帧的802.1Q Tag剥除掉,这样就完成了转发过程。
3.3.3 Hybrid口Tagged VLAN的二层转发
Hybrid口Tagged VLAN的二层转发与Trunk口Allowed VLAN的二层转发一致,此处不再赘述,只简单以图片说明。
3.4 VLAN的泛洪转发
VLAN的泛洪转发和MAC的泛洪转发差异不大,未知单播和广播都会泛洪,主要区别是只在VLAN域内泛洪。如下图中的PORT 4,因为不在VLAN 10内,所以不会泛洪到这个端口。整体实现原理差异不大,此处不再赘述,只简单以图片说明。
4. VLAN的二层转发方式(扩展介绍)
4.1 独立式VLAN学习
通过上文,我们可以看出,设备在查MAC地址表转发的时候,索引是MAC+VLAN,这样的转发方式称为独立式VLAN学习(Independent VLAN Learning,IVL)。这种方式的VLAN学习,VLAN之间不会互相影响,目前实际应用中的二层交换机大多也都采用这种方式。
4.2 共享式VLAN学习
此外,我们也可以将MAC作为索引,去查表转发,这样的转发方式称为共享式VLAN学习(Shared VLAN Learning,SVL)。具体的转发过程如下所示。
设备C的PORT 1和PORT 2均配置成Trunk口,PVID配置成10。
(1)如果设备C收到的是Untagged帧,需要先插入一层802.1Q Tag,Tag中的VID值是10。如果设备C收到的Tagged帧中VID值是10,则可以接收且不需要插入802.1Q Tag。
(2)源MAC学习。设备C根据数据帧的SMAC学习到一条MAC地址表的条目,上图中紫色虚线所指的条目,MAC地址表也保存了VLAN信息。(同理,如果从PORT 2收到设备B发送的数据帧,也会学习到相应的MAC地址表条目。)
(3)目的MAC转发。设备C根据数据帧的DMAC去MAC地址表中查找,找到之后,检查该条目的VLAN是10,满足要求。所以对应的出端口是PORT 2,上图中绿色虚线框中的条目,那么就会将该数据帧从PORT 2转发。
(4)设备C在出口将数据帧的802.1Q Tag剥除掉,这样就完成了转发过程。
看起来,这样的转发方式似乎也没有什么问题,真的是这样的吗?我们继续分析。
设备C的PORT 1和PORT 2均配置成Trunk口,Allowed VLAN配置成20,30。
如果此时,设备C从PORT 1同时收到Tagged 20和Tagged 30的数据帧,那么此时MAC地址表就会不停地变化,即00-0C-88-00-00-0A这一条MAC地址表条目的VLAN在20和30之间不断地变化。同理,00-0C-88-00-00-0B这一条目也是类似的。
如果在某一时刻下,00-0C-88-00-00-0B这一MAC地址表条目的VLAN变成了30,那么此时就只有Tagged 30的报文能够从PORT 2转发出去,而Tagged 20的就会被丢弃掉。所以,在实际的应用中,SVL方式的二层交换机已经比较少见了。