二层、三层转发
1 二层转发
1.1 概念
二层转发中二层指的是OSI七层模型中的第二层(数据链路层),二层转发是指在同一网段中,基于MAC地址转发数据包。
1.2 相关机制
- ARP
-
概述:ARP(Address Resolution Protocol),即地址解析协议,主要作用是把IP地址解析成MAC地址。主机或三层转发设备上维护有ARP表。
-
工作原理:主机在给目的主机发送数据包时,需要先查询本机ARP表,找出与目的IP地址匹配的IP-MAC表项,把表项中的MAC地址填入以太网帧的目的MAC域,然后进行发送。若表中没有匹配项,则发送ARP请求广播报文,等待目的主机响应并发回ARP应答报文,主机在接收到应答报文后学习目的主机的MAC地址并记录到ARP表中。
-
ARP表:
| IP地址 | MAC地址 | 类型 | VLAN | 端口 | | ------------ | ------------ | ------------ | ------------ | ------------ | | 192.168.1.10 | 0x1010-1010-1010 | Dynamic | 100 | 1 | | 192.168.1.20 | 0x2020-2020-2020 | Static | 100 | 1 | - IP地址:目的主机的IP地址 - MAC地址:目的主机的MAC地址 - 类型:ARP表项类型,动态,主机自主学习,可被更新或老化;静态,主机管理者手动配置,不会被更新或老化 - VLAN:ARP表项所属VLAN(跨网段ARP表项VLAN字段为空) - 端口:ARP表项出接口 -
以太网帧格式:
+------------------+------------------+------------------+------------------+
| 目的MAC地址 (6B) | 源MAC地址 (6B) | 帧类型 (2B) | ARP报文 (N字节) |
+------------------+------------------+------------------+------------------+
- 帧类型 (EtherType): 2字节,表示以太网帧的上层协议类型。对于ARP报文,值通常为0x0806。
- ARP报文以太帧格式:
+------------------+------------------+------------------+------------------+
| 硬件类型 (2B) | 协议类型 (2B) | 硬件地址长度 (1B) | 协议地址长度 (1B) |
+------------------+------------------+------------------+------------------+
| 操作码 (2B) | 源硬件地址 (6B) | 源协议地址 (4B) | 目的硬件地址 (6B) |
+------------------+------------------+------------------+------------------+
| 目的协议地址 (4B) |
+------------------+
- 硬件类型 (HTYPE): 2字节,表示硬件类型(例如,以太网)。
- 协议类型 (PTYPE): 2字节,表示上层协议类型(例如,IPv4)。
- 硬件地址长度 (HLEN): 1字节,表示硬件地址的长度(例如,以太网MAC地址的长度)。
- 协议地址长度 (PLEN): 1字节,表示协议地址的长度(例如,IPv4地址的长度)。
- 操作码 (OPER): 2字节,表示ARP报文的操作类型(1 请求,2 应答)。
- 源硬件地址 (SHA): 6字节,表示发送者的MAC地址。
- 源协议地址 (SPA): 4字节,表示发送者的IP地址。
- 目的硬件地址 (THA): 6字节,表示目标设备的MAC地址(在请求中通常是全零)。
- 目的协议地址 (TPA): 4字节,表示目标IP地址。
- MAC地址表
-
概述:交换机中保存的一张表,用于记录到达交换机的报文的发送方的MAC地址、接收端口以及所属VLAN
-
MAC地址表:
| MAC地址 | VLAN | 端口 | | ------------ | ------------ | ------------ | ------------ | | 0x1010-1010-1010 | 100 | 1 | | 0x2020-2020-2020 | 200 | 2 |-
学习机制:当交换机接收到一个数据包时,就会对该数据包的源MAC地址进行学习
-
当表中没有与源MAC地址匹配的表项时,增加一条新的表项,记录MAC地址以及对应的VLAN和端口
-
当表中有与源MAC地址匹配的表项,但信息不一致时,则以数据包信息为准,更新表项
-
当表中有与源MAC地址匹配的表项并且信息一致时,刷新表项的老化时间
-
老化机制: 当交换机MAC地址表中某个表项的生存时间结束,并且在结束之前没有再接收到该表项所对应主机发出的数据包,则把该表项删除,等待该主机下次发送数据包时再重新学习。
-
1.3 转发过程
以下图局域网模型中Host A首次给Host C发送数据包为例说明二层转发过程。

- 查询 ARP 表
IP地址 MAC地址 192.168.1.20 0x2020-2020-2020 表中没有与 Host C的 IP 地址匹配的表项 - 发送 ARP 广播报文获取目的地址
目的MAC地址 源MAC地址 帧类型 … OPER 源MAC地址 源IP地址 目的MAC地址 目的IP地址 0xFFFF-FFFF-FFFF 0x1010-1010-1010 0x0806 … 1 0x1010-1010-1010 192.168.1.10 0x0000-0000-0000 192.168.1.40 - 更新 MAC 地址表项
- 交换机接收到该广播报文后,先学习
Host A的MAC地址,新增或更新MAC地址表的表项,然后把该报文转发给Host B、Host C、Host D Host B和Host D接收到 ARP 请求后,判断目的IP地址与自身IP地址不一致,则丢弃报文,不做回应Host C接收到ARP请求后,判断报文中目的IP地址与自身IP地址一致,则先学习报文中Host A的地址信息,在Host C的ARP表中新增Host A的IP-MAC对应关系表项
- 发送 ARP 应答报文
目的MAC地址 源MAC地址 帧类型 … OPER 源MAC地址 源IP地址 目的MAC地址 目的IP地址 0x1010-1010-1010 0x4040-4040-4040 0x0806 … 2 0x4040-4040-4040 192.168.1.40 0x1010-1010-1010 192.168.1.10 - 转发报文
- 交换机接收到
Host C的ARP应答报文后,通过该报文学习Host C的MAC地址 - 根据第3步中记录的
Host A的MAC,找到对应端口并转发该报文
1.4 VLAN 的二层转发
主要的区别在于ARP广播报文的广播域受到了VLAN的限制,如下图所示,Host A在发送ARP广播报文时,只有同属于一个VLAN的Host B才会收到ARP请求,Host C和Host D因为不在同一个VLAN,因此无法收到ARP请求。那么此时Host A和Host C就没法进行通信,若Host A确实需要给Host C发信息,那么就要使用到三层转发技术。

2 三层转发
2.1 概念
三层指OSI七层模型中的第三层(网络层),主要用于不同网段间的通信。
2.2 相关机制
-
路由表(RIB) 路由器中存储的一张表,记录跨网段路由跳转路径,并挑选最佳路由跳转路径下载到转发表中。 路由表主要作用是路由路径的决策,即挑选最优的路径(优先级高,开销小),不会直接指导路由转发。
Destination Mask Pre Cost NextHop Interface 10.10.10.0 24 0 0 10.10.10.10 1 - Destination:目的网络或目的地址
- Mask:目的网络或目的地址的子网掩码
- Pre:路由优先级
- Cost:路径开销,一条路径需要跳转节点越多,则开销越大,路由决策时优先级低
- NextHop:路由下一跳节点
- Interface:路由器转发出接口
-
转发表(FIB) 转发表是直接指导路由跳转的表,从路由表中下载最优跳转路径,路由器根据最长匹配原则,从转发表中选择匹配的表项, 把报文从对应接口转发出去。
Destination/Mask Flag NextHop Interface 10.10.10.0/24 U 10.10.10.10 1 - Flag:对转发消息性质的描述
- U:路由UP,可用
- G/H:网关路由/本机路由
- B:黑洞路由
- D/S:动态路由/静态路由
- R:被拒绝路由,不可用
- E:多路径等价路由
- L:ARP或ESIS生成的路由
- NextHop:路由下一跳节点
- Interface:路由器转发出接口
2.3 转发过程

以上图Host A给Host C发送数据包为例说明三层转发过程,图中Host A、Host B和Interface 1都属于VLAN100,Host C、Host D和Interface 2都属于VLAN200,Host A到Host C属于跨VLAN、跨网段通信。
一个三层设备(如三层交换机或路由器)可以充当网关。网关的概念不仅是物理的,也包括逻辑上的功能。若一个三层设备下连接了多个网段,它实际上在逻辑上充当多个网关。每个网段都有一个对应的虚拟接口(如SVI或子接口),每个接口充当那个网段的默认网关。
-
Host A把Host C的IP地址与本机的IP地址和子网掩码进行比较,采用IP地址与子网掩码二进制按位与逻辑计算获取网段地址,根据计算得出Host A和Host C不在同一网段,Host A采取路由代理转发的策略。Host A Host C IP地址 11000000.10101000.00000001.00001010 11000000.10101000.00000010.00001010 子网掩码 11111111.11111111.11111111.00000000 11111111.11111111.11111111.00000000 网段地址 11000000.10101000.00000001.00000000 11000000.10101000.00000010.00000000 -
Host A需要把数据包发送给默认网关(Interface 1),首先查找本机ARP表,获取网关的MAC地址,若表中没有网关的IP-MAC对应关系表项,则需要发送ARP广播获取默认网关的MAC地址,此过程为VLAN 100内的二层转发过程,具体执行过程和原理可参考二层转发。 -
Host A已获取默认网关的MAC地址,随后封装一个数据包发送给默认网关(Interface 1),数据包以太帧头部如下表1,目的MAC地址是默认网关的MAC地址,IP头部源IP地址和目的IP地址如下表2,目的IP地址是Host C的IP地址。
表 1
+------------------+------------------+------------------+
| 目的MAC地址 (6B) | 源MAC地址 (6B) | 帧类型 (2B) |
+------------------+------------------+------------------+
| 0x0012-0012-0012 | 0x0001-0001-0001 | 0x0800 |
+------------------+------------------+------------------+
表 2
+------------------+------------------+
| 源IP地址 (4B) | 目的IP地址 (4B) |
+------------------+------------------+
| 192.168.1.10 | 192.168.2.10 |
+------------------+------------------+
Interface 1接收到数据包后,判断数据包中以太帧头部目的MAC地址是否和自身MAC地址一致,一致则走三层转发;不一致则走二层转发。当前数据包的MAC与Interface 1的MAC地址一致,因此走三层转发。Interface 1查询Route的FIB表(转发表),根据最长匹配原则选择Interface 2转发数据包。
+------------------+------------------+------------------+
| 目的地址/子网掩码 | 下一跳 | 接口 |
+------------------+------------------+------------------+
| 192.168.1.0/24 | 192.168.1.1 | Interface 1 |
+------------------+------------------+------------------+
| 192.168.2.0/24 | 192.168.2.1 | Interface 2 |
+------------------+------------------+------------------+
Interface 2接收到数据包后,根据IP头部的目的IP地址(Host C的IP地址),查询自身ARP表是否存在匹配的IP-MAC映射关系表项,若没有则进行ARP广播,通过Switch 2进行二层转发,最终获取到Host C的MAC地址(0x0003-0003-0003)。随后Interface 2对Host A出发的数据报包进行重新封装,以太帧头部目的MAC改为Host C的MAC地址,源MAC地址改为自身的MAC地址IP头部不变。
表 1
+------------------+------------------+------------------+
| 目的MAC地址 (6B) | 源MAC地址 (6B) | 帧类型 (2B) |
+------------------+------------------+------------------+
| 0x0003-0003-0003 | 0x0034-0034-0034 | 0x0800 |
+------------------+------------------+------------------+
Interface 2发出数据包,通过Switch 2进行二层转发,数据包最终到达Host C。