二三层转发
2. 二层转发
2.1. 简介
- 一种基于OSI中的数据链路层(第二层)的数据帧的存储转发技术,二层交换是依靠MAC地址和VID号来确定转发方向的。
- 二层转发通过维护MAC地址表以及根据目的MAC查表转发,有效的利用了网络带宽,改善了网络性能。
- 二层转发使得二层交换机各端口属于不同的冲突域,不同端口发送和接收的数据独立,因此有效地隔离了网络中物理层冲突域,使得通过它互连的主机(或网络)之间不必再担心流量大小对于数据发送冲突的影响。
- 二层转发通过专用集成电路(Application Specific Integrated Circuit,ASIC)来实现硬件转发,其转发性能非常高。
2.2. 二层转发流程介绍
2.2.1. 基础二层转发
二层交换机通过解析和学习以太网帧的源MAC地址来维护MAC地址与端口的对应关系到MAC地址表。转发时,根据目的MAC地址检索 MAC地址表 来决定向哪个端口转发。
- 二层交换机记录各端口接收到的以太帧的,将其 源MAC地址与接收的端口 的映射关系添加(或覆盖已有,并刷新老化时间)到MAC地址表中,作为以后的二层转发依据。
- 转发时,根据以太帧的目的MAC地址检索MAC地址表:
- 若无法查到表项,则向除接收端口的所有端口转发;
- 若可查到表项,
- 但端口与太网帧的接收端口相同,则丢弃该帧;
- 反之,则向记录端口转发;
备注: 二层交换机虽然能够隔离冲突域,但是它并不能有效的划分广播域,广播报文以及目的MAC查找失败的报文会向所有端口转发。当网络中主机数量增多时,这种情况会消耗大量的网络带宽,并且也会带来安全性相关问题。当然,通过路由器来隔离广播域是一个办法,但是由于路由器的高成本以及转发性能低的特点使得这一方法应用有限。基于这些情况,二层交换中出现了虚拟局域网(Virtual Local Area Network,VLAN)技术。
2.2.2. 带VLAN的二层转发
VLAN技术主要根据MAC地址将局域网从逻辑上划分为不同网段,从而实现虚拟工作组的一种交换技术。根据MAC地址维护方式的不同,可分为两种方式的二层转发:共享VLAN的MAC地址学习(Shared VLAN Learning,SVL)和独立VLAN的MAC地址学习(Independent VLAN Learning,IVL)。由于SVL只以MAC地址作为表项,学习后存表时不存储VLAN信息,故SVL方式具有 在不同VLAN中相同MAC地址的多个主机存在通信冲突 的问题。SVL现已比较少见,这里主要讨论IVL方式的二层转发,其将MAC地址 + VLAN-ID作为查找表项(也可理解为——每个VLAN都有自己独立的MAC地址表)。
- 二层交换机记录各个端口接收到以太帧的 源MAC地址 + VLAN-ID 信息,并将其与对应端口的映射关系添加(或覆盖已有)到MAC地址表中
- 转发时,根据以太帧的目的MAC地址 + VLAN-ID检索MAC地址表:
- 若无表项,则在VLAN-ID内广播;
- 若存在表项,
- 且记录端口与接收端口相同,则丢弃该帧;
- 反之,则将该以太帧转发到表项记录端口;
2.3. MAC地址表的老化
二层交换机的MAC地址老化和刷新通常直接由硬件ASIC芯片来完成,其老化机制如下:
- 在芯片中储存的每一个动态添加的MAC地址表项都有一个 1 bit 的老化标志(1——保留;0——删除),同时芯片有一个老化定时器用于控制地址老化;
- 在学到MAC地址表项时:
- 对于新学到的MAC地址表项,将其老化标志位置1;
- 对于学到MAC地址中已有的表项(更新),将其老化标志位 置1;
- 在芯片的老化定时器超时触发时:
- 对于老化标志位为1的表项,修改老化标志位为0;
- 对于老化标志位为0的表项,删除该条表项记录。
备注: 由于新学到表项的时刻随机分布,故对每条表项,其实际老化时间为 1~2 倍的老化定时器周期。
3. 三层转发
3.1. 简介
- 一种基于OSI七层模型中 第三层网络层 的数据帧的存储转发技术,三层交换是主要依靠 IP地址 来确定转发方向,以实现不同网络间的通信。
3.2. 三层转发特点
- IP报文每经过一次三层转发,其源/目的MAC地址都会变化,但是其源/目的IP始终不变。
- 一次路由,多次交换。即首包通过CPU参与转发过程,同时建立交换芯片硬件表项,后续包由交换芯片直接硬件转发
- 交换芯片的硬件转发并不关心路由的具体下一跳IP,硬件三层表项只包含:目的IP地址/网段、目的IP(或下一跳IP)对应的MAC地址、出口VLAN、出端口
3.3. 路由器与交换机三层转发对比
路由器 | 交换机 | |
---|---|---|
成本 | 高 | 低 |
实现方式 | 主要依靠CPU计算处理,少部分支持硬件转发 | 依靠ASIC硬件芯片集成IP三层转发功能 (检查IP报文头、修改存活时间参数、 重新计算IP头校验和、IP包的数据链路封装等) |
转发性能 | 较弱 | 强 |
端口数量 | 少 | 多 |
目前三层交换机一般通过VLAN来划分二层网络并实现二层交换(同网段),同时能够实现不同VLAN间的三层IP互访(不同网段)。
3.4. 组网一下的三层转发流程详细介绍
组网一如下图所示,源、目的主机都连接在同一台三层交换机上,但它们位于不同的VLAN(网段)。从三层交换机视角来说,源、目的主机都位于其直连网段,基础信息如下:
(PC_A , MAC A:AA-AA-AA-AA-AA-AA , IP: 1.1.1.2, NetMask: 255.255.255.0, GW: 1.1.1.1)
(Ethernet2 1.1.1.1 <-> L3_SW, MAC_L3_SW:CC-CC-CC-CC-CC-CC, NetMask: 255.255.255.0, <-> Ethernet3 2.1.1.1 )
(PC_B , MAC B:BB-BB-BB-BB-BB-BB , IP: 2.1.1.2, NetMask: 255.255.255.0, GW: 2.1.1.1)
当 PC_A Ping PC_B 时,即发起 ICMP 请求时,涉及的三层转发处理流程如下(假设主机均暂未建立任何硬件转发表项):
【1】 PC_A判断目标IP网段与自身的异同:
PC_A对比报文的目的IP网段与自身网段(发现不在同一网段),需要进行三层转发(即,需通过网关转发报文信息)
【2】 PC_A查询其ARP缓存表:
PC_A检查自己的ARP缓存表,发现网关的MAC地址不在MAC地址表里,此时PC_A的ARP缓存表为空:
IP | MAC |
---|---|
【3】 PC_A广播ARP请求报文:
PC_A在所处物理广播域内广播ARP请求报文(求取L3_SW网关IP(1.1.1.1)的MAC地址?),PC_A发送的ARP请求帧内容如下(广播):
Ethernet II Header | ARP Frame | End | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
字段 | DA | SA | Type/Length | HardwareType | ProtocolType | HardwareLen | ProtocolLen | OP | SrcAddr | SrcIP | DesAddr | DesIP | FilledField | FCR |
字段长度(Bytes) | 6 | 6 | 2 | 2 | 2 | 1 | 1 | 2 | 6 | 4 | 6 | 4 | 18 | 4 |
填充值(0x) | FF-FF-FF-FF-FF-FF | AA-AA-AA-AA-AA-AA | 0x0806 | 0x0001 | 0x0800 | 0x06 | 0x04 | 0x01 | AA-AA-AA-AA-AA-AA | 01-01-01-02 | 00-00-00-00-00-00 | 01-01-01-01 | 00...00 | / |
注:
- Ethernet II封装的以太帧头的”Type”字段中,0x0806表示其后为ARP协议
- OP为操作码,1表示ARP请求、2表示ARP应答、3表示RARP请求、4表示RARP应答
- 因物理传输数据帧最短需不低于64Bytes,故上文ARP帧需在填充区段填充18个字节长度的’0’。
【4】 L3_SW接收到ARP请求报文:
L3_SW收到PC_A的ARP请求报文,并将PC_A的MAC地址学习到自己的MAC地址表和ARP缓存表。
L3_SW的MAC地址表内容如下:
MAC | VLAN-ID | Port |
---|---|---|
AA-AA-AA-AA-AA-AA | 2 | 2 |
L3_SW的ARP缓存表内容如下:
IP | MAC |
---|---|
1.1.1.2 | AA-AA-AA-AA-AA-AA |
注:为提升检索效率,交换机芯片中,MAC地址表与ARP表融合为一张表。
【5】 L3_SW单播ARP应答报文:
L3_SW发现自己的IP与PC_A发出ARP请求包的目的IP一致,向PC_A响应ARP应答报文,L3_SW向PC_A发送的ARP应答帧内容如下:
Ethernet II Header | ARP Frame | End | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
字段 | DA | SA | Type/Length | HardwareType | ProtocolType | HardwareLen | ProtocolLen | OP | SrcAddr | SrcIP | DesAddr | DesIP | FilledField | FCR |
字段长度(Bytes) | 6 | 6 | 2 | 2 | 2 | 1 | 1 | 2 | 6 | 4 | 6 | 4 | 18 | 4 |
填充值(0x) | AA-AA-AA-AA-AA-AA | CC-CC-CC-CC-CC-CC | 0x0806 | 0x0001 | 0x0800 | 0x06 | 0x04 | 0x02 | CC-CC-CC-CC-CC-CC | 01-01-01-01 | AA-AA-AA-AA-AA-AA | 01-01-01-02 | 00...00 | / |
PC_A收到L3_SW的ARP应答报文后,PC_A学习到L3_SW的MAC地址并添加到ARP缓存表。
此时PC_A的ARP缓存表内容如下:
IP | MAC |
---|---|
1.1.1.1 | CC-CC-CC-CC-CC-CC |
【6】 PC_A组装并发送ICMP请求:
接着PC_A组装并发出目的IP为PC_BIP地址的ICMP请求报文(目的MAC为L3_SW的MAC)。PC_A向PC_B发出的ICMP请求帧内容如下:
Ethernet II Header | IP Header | ICMP Frame | End | |||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
字段 | DA | SA | Type | Version | HeaderLen | Priority | TotalLen | Identification | Flags | FragmentOffset | TTL | Protocol | Checksum | SrcIP | DesIP | Type | Code | Checksum | Identifier | SequenceNumber | OptionalData | FCR |
字段长度(Bytes) | 6 | 6 | 2 | 4bits | 4bits | 1 | 2 | 2 | 3bits | 13bits | 1 | 1 | 1 | 6 | 6 | 1 | 1 | 2 | 2 | 2 | / | 4 |
填充值(0x) | CC-CC-CC-CC-CC-CC | AA-AA-AA-AA-AA-AA | 0x0800 | 0100B | 0101B | 0x00 | 0x005F | 0x0000 | 000B | 0B | 0xFF | 0x01 | / | 01-01-01-02 | 02-01-01-02 | 0x08 | 0 | / | / | 0x01000001 | 0...0 | / |
注:
- Ethernet II封装的以太帧头的”Type”字段中,0x0800表示其后为IP协议
- 在IP帧头的”Protocol”字段中,0x01表示其后为ICMP协议
- ICMP帧头的”Type”字段中,0x08表示请求,0x00表示响应。
【7】 L3_SW接收ICMP报文,判断转发方式,查表:
L3_SW收到PC_A的ICMP请求报文。根据 目的MAC地址+VLAN 检索MAC地址表 或 查询 MyStation表是否存在目的MAC:
- 若存在则交换机需对该报文进行三层转发。
- 但实际不存在,接着根据 目的IP(2.1.1.2) 查找交换机芯片三层表项:
- 若能查到,则进行硬件三层转发;
- 但实际未查到,将报文送到CPU处理,CPU根据ICMP请求报文的 目的IP(2.1.1.2) 查找其软件路由表:
- 若未能匹配,不同交换机处理方式不同(丢弃/ARP查询到后转发)
- 匹配了一个直连网段2.1.1.0(即PC_B所在的网段),接着继续查找其软件ARP表中是否存在 IP(2.1.1.2) 的表项:
- 若能查到,则更新源/目的MAC,并向 IP(2.1.1.2) 转发ICMP报文。
- 但实际未查到,则需先发送ARP请求到 IP(2.1.1.2) 的MAC地址,再更新源/目的MAC和转发ICMP报文。
此时L3_SW的交换芯片的MAC地址表内容如下:
MAC | VLAN-ID | Port |
---|---|---|
AA-AA-AA-AA-AA-AA | 2 | 2 |
L3_SW的ARP缓存表内容如下:
IP | MAC |
---|---|
1.1.1.2 | AA-AA-AA-AA-AA-AA |
L3_SW的软件路由表内容如下:
NetworkDestination | SubnetMask | Gateway | Interface | Metric |
---|---|---|---|---|
1.1.1.1 | 255.255.255.0 | 1.1.1.0 | Ethernet 2 | / |
2.1.1.1 | 255.255.255.0 | 2.1.1.0 | Ethernet 3 | / |
【8】 L3_SW发送ARP请求:
L3_SW向目标网段广播ARP请求报文(求取2.1.1.2的MAC地址),ARP请求帧内容如下:
Ethernet II Header | ARP Frame | End | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
字段 | DA | SA | Type/Length | HardwareType | ProtocolType | HardwareLen | ProtocolLen | OP | SrcAddr | SrcIP | DesAddr | DesIP | FilledField | FCR |
字段长度(Bytes) | 6 | 6 | 2 | 2 | 2 | 1 | 1 | 2 | 6 | 4 | 6 | 4 | 18 | 4 |
填充值(0x) | FF-FF-FF-FF-FF-FF | CC-CC-CC-CC-CC-CC | 0x0806 | 0x0001 | 0x0800 | 0x06 | 0x04 | 0x01 | CC-CC-CC-CC-CC-CC | 02-01-01-01 | 00-00-00-00-00-00 | 02-01-01-02 | 00...00 | / |
【9】 PC_B接收报文并学习ARP表:
PC_B收到ARP请求报文,更新ARP表。此时PC_B的ARP缓存表内容如下:
IP | MAC |
---|---|
2.1.1.1 | CC-CC-CC-CC-CC-CC |
【10】 PC_B回应ARP应答报文:
PC_B发现目的IP是自己,于是向L3_SW发送ARP应答报文,ARP应答帧内容如下:
Ethernet II Header | ARP Frame | End | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
字段 | DA | SA | Type/Length | HardwareType | ProtocolType | HardwareLen | ProtocolLen | OP | SrcAddr | SrcIP | DesAddr | DesIP | FilledField | FCR |
字段长度(Bytes) | 6 | 6 | 2 | 2 | 2 | 1 | 1 | 2 | 6 | 4 | 6 | 4 | 18 | 4 |
填充值(0x) | CC-CC-CC-CC-CC-CC | BB-BB-BB-BB-BB-BB | 0x0806 | 0x0001 | 0x0800 | 0x06 | 0x04 | 0x02 | BB-BB-BB-BB-BB-BB | 02-01-01-02 | CC-CC-CC-CC-CC-CC | 02-01-01-01 | 00...00 | / |
L3_SW收到PC_B的ARP应答报文后,L3_SW学习到PC_B的MAC地址并添加到ARP缓存表(三层表项,注:此后对三层交换机L3_SW来说,L3_SW到PC_A或PC_B的三层表项均已学习到,这样后续PC_A和PC_B之间经过交换机L3_SW互发报文时,可直接通过交换机芯片进行硬件三层转发)。
此时L3_SW的ARP缓存表内容如下:
IP | MAC |
---|---|
1.1.1.2 | AA-AA-AA-AA-AA-AA |
2.1.1.2 | BB-BB-BB-BB-BB-BB |
此时L3_SW的交换芯片的MAC地址表内容如下:
MAC | VLAN-ID | Port |
---|---|---|
AA-AA-AA-AA-AA-AA | 2 | 2 |
BB-BB-BB-BB-BB-BB | 3 | 3 |
【11】 L3_SW接收ARP应答报文后,修改并转发ICMP请求:
L3_SW修改PC_A的ICMP请求包的源/目的MAC地址(目的MAC修改为PC_B的MAC地址、源MAC修改为自己的MAC地址),并转发给PC_B。转发的ICMP请求帧内容如下:
Ethernet II Header | IP Header | ICMP Frame | End | |||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
字段 | DA | SA | Type | Version | HeaderLen | Priority | TotalLen | Identification | Flags | FragmentOffset | TTL | Protocol | Checksum | SrcIP | DesIP | Type | Code | Checksum | Identifier | SequenceNumber | OptionalData | FCR |
字段长度(Bytes) | 6 | 6 | 2 | 4bits | 4bits | 1 | 2 | 2 | 3bits | 13bits | 1 | 1 | 1 | 6 | 6 | 1 | 1 | 2 | 2 | 2 | / | 4 |
填充值(0x) | BB-BB-BB-BB-BB-BB | CC-CC-CC-CC-CC-CC | 0x0800 | 0100B | 0101B | 0x00 | 0x005F | 0x0000 | 000B | 0B | 0xFF | 0x01 | / | 01-01-01-02 | 02-01-01-02 | 0x08 | 0 | / | / | 0x01000001 | 0...0 | / |
【12】 PC_B接收并响应ICMP报文:
PC_B收到L3_SW转发的ICMP请求后,向PC_A发送应答ICMP报文(目的MAC为网关MAC地址)。其中ICMP报文内容如下:
Ethernet II Header | IP Header | ICMP Frame | End | |||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
字段 | DA | SA | Type | Version | HeaderLen | Priority | TotalLen | Identification | Flags | FragmentOffset | TTL | Protocol | Checksum | SrcIP | DesIP | Type | Code | Checksum | Identifier | SequenceNumber | OptionalData | FCR |
字段长度(Bytes) | 6 | 6 | 2 | 4bits | 4bits | 1 | 2 | 2 | 3bits | 13bits | 1 | 1 | 1 | 6 | 6 | 1 | 1 | 2 | 2 | 2 | / | 4 |
填充值(0x) | CC-CC-CC-CC-CC-CC | BB-BB-BB-BB-BB-BB | 0x0800 | 0100B | 0101B | 0x00 | 0x005F | 0x0000 | 000B | 0B | 0xFF | 0x01 | / | 02-01-01-02 | 01-01-01-02 | 0x00 | 0 | / | / | 0x01000001 | 0...0 | / |
【13】 L3_SW硬件转发ICMP应答报文:
L3_SW收到PC_B响应PC_A的应答报文后,根据 目的MAC地址+VLAN 检索MAC地址地址表:
- 能查到,则需对其进行三层转发。然后根据 目的IP(1.1.1.2) 查找交换机芯片三层表项:
- 能查到,则通过交换机芯片实现硬件三层转发该ICMP应答报文(目的MAC修改为PC_A的MAC地址、源MAC修改为自己的MAC地址)。
- 能查到,则通过交换机芯片实现硬件三层转发该ICMP应答报文(目的MAC修改为PC_A的MAC地址、源MAC修改为自己的MAC地址)。
此时L3_SW的交换芯片的MAC地址表内容如下(交换机的VLAN配置时写入):
MAC | VLAN-ID | Port |
---|---|---|
AA-AA-AA-AA-AA-AA | 2 | 2 |
BB-BB-BB-BB-BB-BB | 3 | 3 |
L3_SW的ARP缓存表内容如下:
IP | MAC |
---|---|
1.1.1.2 | AA-AA-AA-AA-AA-AA |
2.1.1.2 | BB-BB-BB-BB-BB-BB |
L3_SW硬件转发PC_B响应PC_A的应答报文内容如下:
Ethernet II Header | IP Header | ICMP Frame | End | |||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
字段 | DA | SA | Type | Version | HeaderLen | Priority | TotalLen | Identification | Flags | FragmentOffset | TTL | Protocol | Checksum | SrcIP | DesIP | Type | Code | Checksum | Identifier | SequenceNumber | OptionalData | FCR |
字段长度(Bytes) | 6 | 6 | 2 | 4bits | 4bits | 1 | 2 | 2 | 3bits | 13bits | 1 | 1 | 1 | 6 | 6 | 1 | 1 | 2 | 2 | 2 | / | 4 |
填充值(0x) | AA-AA-AA-AA-AA-AA | CC-CC-CC-CC-CC-CC | 0x0800 | 0100B | 0101B | 0x00 | 0x005F | 0x0000 | 000B | 0B | 0xFF | 0x01 | / | 01-01-01-02 | 02-01-01-02 | 0x00 | 0 | / | / | 0x01000001 | 0...0 | / |
PC_A成功接收到PC_B发出的ICMP应答报文后整个Ping过程结束。
此后PC_A和PC_B之间往返报文都将(经过查MAC地址表,查交换机芯片三层转发表后)由交换芯片直接完成硬件三层转发。
经过上述流程的分析可知,三层交换机充分利用“一次路由、多次转换”的原理实现了转发性能与三层交换复杂业务的完美统一。
注:
- 一次路由:即首包通过CPU参与 请求/转发,再根据应答 学习/建立 交换芯片 硬件表项的“路由”过程(相对较慢,完成三层交换的必须的表项学习/建立流程)
- 多次交换:后续往返报文都可由交换芯片直接硬件三层转发(更快,提升转发性能)
3.5. 组网二下的三层转发流程介绍
另一种组网示例如下图所示,图中标明了两台主机的MAC、IP、网关以及两台三层交换机的MAC、不同VLAN配置的三层接口IP。且两台交换机分别预配置了静态路由:
其中 L3_SW1 静态路由配置为 ip route 2.1.1.0 255.255.255.0 3.1.1.2,L3_SW2 静态路由配置为 ip route 1.1.1.0 255.255.255.0 3.1.1.1。
当 PC_A Ping PC_B ,即发起 ICMP 请求时,三层转发处理流程如下(假设主机均暂未建立任何硬件转发表项):
由于组网转发中间许多转发详细流程与具体请求帧分析已在3.5中介绍,这里不再赘述,下面主要介绍此组网示例下三层转发流程:
总结,其与组网一的主要区别在于第7步,组网一的L3_SW交换机在CPU查找软件路由表时匹配了目的IP的直连网段(2.1.1.0),然后广播找到直连网段内的PC_B并建立通信;而在本组网二中,L3_SW1交换机在CPU查找软件路由时匹配了静态路由表项中某一下一跳网段(2.1.1.0/24)。组网二多出的流程为,需将ICMP报文转发给下一跳(L3_SW2交换机),并由L3_SW2交换机重复执行类似的CPU软件路由表查询、建表、转发ICMP请求报文、并最终转发ICMP应答报文回到L3_SW1,其他过程与组网一类似。
4. 总结
4.1. 二三层转发对比
二层转发 | 三层转发 | |
---|---|---|
转发依据 | MAC地址和VID号 | IP地址 |
数据交换范围 | 同一网段 | 跨网段 |
所属OSI网络模型层级 | 数据链路层(第二层) | 网络层(第三层) |
是否需要二次封装 | 否 | 是 |
4.2. 主机间通信机制及何时二三层转发?
- 当前主机收到以太网数据帧,解析目的IP
- 判断目的IP与自己IP是否位于同一网段(和掩码逻辑与):
- 若位于同一网段,则采用二层转发。(流程为:当前主机广播ARP请求(获取目的MAC地址),然后填充目的MAC并发送报文。)
- 若为不同网段,则采用三层转发,通过网关转发报文。流程为:当前主机向网关发送ARP请求(获取网关的MAC地址),然后将网关MAC地址作为目的MAC地址并发送报文(注:此时目的IP仍未改动)
其他判定方式:交换芯片中的MAC地址表中会记录三层接口MAC+VID表项,且存在MyStation表。当报文进来时,用报文的目的MAC检索这两张表,若存在则需三层转发。
5. 参考资料
- 《H3C网络之路第六期——交换专题》
- ARP 基础知识解析
- ARP请求的详细过程