基础概念
都在说二三层转发,那这二层和三层是什么呢?
三层指的是网络层,二层指的是数据链路层
可见,二层转发指的是同一个网段下的设备进行通信的过程,而三层转发指的是跨网段设备之间的通讯过程。
如图,主机1和主机2之间的通讯属于二层转发,但主机1要与主机A通讯时,它们并不在同一个子网,因此他俩之间的通讯属于三层转发流程。
二层转发流程
普通的转发流程
一般的二层转发流程是比较好理解的,主要有以下几个步骤:
- 已知单播-转发:交换机在MAC地址表中查找数据帧中的目的MAC地址,如果找到,就将该数据帧发送到相应的端口
- 未知单播-泛洪:如果找不到,就向入端口以外的其它所有端口发送;
- 同端口-不转发:如果交换机收到的报文中源MAC地址和目的MAC地址所在的端口相同,则丢弃该报文;
- 组播和广播-泛洪:交换机向入端口以外的其它所有端口转发广播报文。
基于VLAN的转发流程
VLAN是什么?
每种技术的出现都是为了解决一个实际的问题,那vlan的出现是为了解决哪一类问题呢?首先我们从理解它的名字开始,VLAN(Virtual Local Area Network)中的LAN特指的是由路由器分割而成的广播域。既然已经有了广播域,那为什么还要“虚拟”它呢?
举个例子,假设一个广播域(局域网)下有1000台电脑,每台主机都可以通过IP协议进行通信,其中一个主机1要向主机2通信,假设主机1尚未学习到主机2的mac地址,那主机1就要向整个广播域发送ARP报文,如图:
当主机1一直没有找到主机2的mac地址时,ARP请求可能会被转发到同一网络中的所有电脑,这既消耗了带宽,又会对接收请求的主机CPU产生负担,造成了广播泛滥和性能下降。
在这种情况下出现了VLAN技术。这种技术可以把一个LAN划分成多个逻辑的VLAN,每个VLAN是一个广播域,VLAN内的主机间通信就和在一个LAN内一样,而VLAN间则不能直接互通,广播报文就被限制在一个VLAN内。
VLAN是如何划分的?
为了让交换机能够区分不同VLAN的报文,需要在报文中添加一些特殊字段: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,再查找和学习源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的二层转发实例
假设交换机1和2刚断电重启,现在两台机器的mac地址表都为空,现在主机A要和主机C通讯,也就是跨交换机的通讯,其具体过程为:
A发送的数据帧进入到1的Access端口,根据该端口的工作模式,将该帧标记上PVid并进行转发。
交换机1将A的mac地址记入mac地址表,并将该帧泛洪到所有Vid=100的端口(除了入端口)。
这里就体现了VLAN的作用
交换机1的Trunk端口属于Vid=100的VLAN,故该端口会接收到上述数据帧。同时,该端口在Vid=100上为Tagged port,因此在发送数据帧出交换机1时,不改变Tagged帧的结构。
Tagged帧到达Vid=100的Trunk端口,被接收,同样不改变帧结构。
交换机2学习到源mac地址,并将其泛洪给所有Vid=100的端口(入口除外)。
交换机2的Access端口接收到Tagged帧,剥除其标签后查找目的mac(泛洪),在找到C的mac地址后,学习并记录,将数据帧发送给C。
这里参考网页出错了,重启之后没有mac地址表,故不能之间将数据帧转发给C
C收到A发送的数据帧,并发送响应帧给PC1。
响应帧经过类似的过程发送给A,由于A的mac记录已经被记录在了mac地址表中,故响应帧仅转发给A。
三层转发流程
ARP
三层转发的一个重要基础设施是ARP,即地址解析协议,实现通过IP地址到物理地址的映射。在以太网协议中规定,同一局域网中的一台主机要和另一台主机进行直接通信,必须要知道目标主机的MAC地址,而在TCP/IP协议栈中网络层和传输层只关心目标主机的IP地址。这就导致在以太网中使用IP协议时,数据链路层的以太网协议接到上层IP协议提供的数据中,只包含目的主机的IP地址。于是需要一种方法,根据目的主机的IP地址,获得其MAC地址。这就是ARP协议要做的事情。
三层转发实例
再看这个拓扑,主机1和主机A通讯的过程,就属于三层转发。还原一下1和A通讯的过程:
主机1将数据封装到一个网络层包中,包源地址是主机1的ip
192.168.1.1
,目的地址是主机A的ip192.168.2.1
,两者处于不同的网段之中。在IP包封装完成之后,主机通过查询路由表,得知发往192.168.2.x网段的包要通过192.168.1.1转发。
路由表是如何生成并且维护的呢?
主机1将ip包作为数据封装在数据帧中,通过数据链路层协议转发给转发设备R。帧源地址是1的mac地址,目的地址是转发设备的mac地址。目的mac地址通过查询主机内部ARP表获取。
转发设备接收到来自主机1的数据帧,从中取出ip包,检查包目的地址知道该包需要转发给主机 A。
转发设备将ip包封装到数据帧中,通过数据链路层转发给主机A,源地址为转发设备的mac地址,目的地址为主机A的mac地址。同样的,目的mac地址通过查询主机内部ARP表获取。
主机A收到数据帧,从中解析出ip包,从而获取相应的数据。
含有VLAN的三层转发
上面说了基于VLAN的二层转发,不同VLAN下的设备之间是相互隔离的,那当两个处于不同VLAN的设备之间需要通信时,如何进行转发呢?这个时候就需要用到路由器了,看下面这张拓扑图:
交换机端口的基本信息如下:
PORT | MAC | VLAN |
---|---|---|
1 | a | 1 |
2 | b | 1 |
3 | c | 2 |
4 | d | 2 |
5 | — | — |
6 | f | 汇聚(TRUNK) |
主机A要主机C通讯,发现两者并不属于同一个网段。
和一般的二层转发一样,此时主机A要借助路由表和ARP表将IP包封装到数据帧通过数据链路层转发出去。
端口1收到数据帧,要将其转发给所有端口中同属于VLAN_1的表现,因为端口6属于汇聚端口,因此它也会收到来自1的数据帧。
检索后得知,要去往ip地址192.168.2.2的数据帧需要经由路由器R进行转发。
端口1转发时会给数据帧加上其PVid,也就是1。路由器通过检查数据帧的VID,来确认该帧需要由负责VLAN_1的接口接收。
路由器查询路由表来确定该数据帧应当向哪里转发,由于目标IP属于VLAN_2,只需要交给负责VLAN_2的接口转发即可。该接口转发时会将数据帧打上其PVid,也就是2。
交换机收到数据帧后,根据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