二三层转发的那些事

二三层转发的那些事

叫我EC就好

从一次”诡异”的ping不通说起

之前工作中客户遇到了一个让人摸不着头脑的问题:同一个VLAN里两台机器,明明配置看起来都对,但就是ping不通。wireshark抓包一看,ARP请求发出去了,但就是收不到回复。

打开wireshark,看到了一个让人困惑的现象:ARP请求包一直在发,但就是收不到任何回复。那一刻我意识到,这不是简单的配置错误,而是对网络转发机制理解的盲区导致的。

经过两个小时的排查,最终发现问题出在交换机的MAC地址表上。这次经历让我重新审视了二三层转发的每个细节。今天想和大家聊聊这些看似基础,但实际工作中经常让人踩坑的东西。

以太网帧:一切问题的起点

先看看我们最常打交道的以太网帧结构。之前调试网络问题时,经常用tcpdump抓包分析,对这个结构特别熟悉:

1
2
|  目标MAC  |  源MAC   | 类型/长度 |    数据载荷    |  FCS  |
| 6字节 | 6字节 | 2字节 | 46-1500字节 | 4字节 |

刚开始工作时,我一直很困惑:为什么最小载荷必须是46字节?后来才明白,这个看似随意的数字背后有深层的考量。早期以太网采用CSMA/CD机制,如果帧太短,发送方可能在检测到冲突之前就把整个帧发完了,这样就无法有效检测冲突。

虽然现在都是全双工交换环境,不再有冲突检测的需求,但这个标准被保留了下来。这让我想到产品设计中的一个道理:有些看起来过时的约束,往往承载着系统演进的历史,贸然打破可能会带来意想不到的兼容性问题。

在实际抓包中,经常会看到这样的现象:

1
2
$ tcpdump -i eth0 -xx
14:25:31.234567 00:1a:2b:3c:4d:5e > ff:ff:ff:ff:ff:ff, ethertype ARP (0x0806), length 60

这里ARP包实际只有28字节,但显示的length是60,因为以太网自动做了填充。这种自动填充机制让上层协议不用关心最小帧长的限制,是一个很巧妙的抽象层设计。

二层交换:MAC表里藏着的那些坑

那次故障的真相

回到开头提到的那个故障。交换机的MAC地址学习看起来很简单:收到帧就记录源MAC和端口的映射关系。但实际运行时,这个简单的机制隐藏着很多陷阱。

那晚的问题就出在这里。我们来复现一下当时的场景:

1
2
服务器A (MAC: aa:aa:aa:aa:aa:aa) --- Switch --- 服务器B (MAC: bb:bb:bb:bb:bb:bb)
端口1 端口2

当服务器A想要给服务器B发包时,理论上应该是这样的流程:

  1. 学习阶段:交换机收到A的帧,记录映射关系

    1
    2
    MAC地址表:
    aa:aa:aa:aa:aa:aa --> 端口1 (刚学到)
  2. 查找阶段:寻找目标MAC bb:bb:bb:bb:bb:bb的位置

  3. 转发决策:如果找到了就单播转发,找不到就洪泛

但那词故障的情况是:交换机MAC表里竟然有一条错误的记录,把服务器B的MAC地址映射到了一个已经断开的端口上。结果就是A发给B的包被转发到了一个空端口,自然收不到回复。

MAC表未命中:洪泛的双刃剑

这让我重新思考洪泛机制的设计哲学。当交换机找不到目标MAC时,它会向除源端口外的所有端口洪泛这个帧。

这个设计很巧妙:

  • 容错性:即使MAC表有问题,通信也不会完全中断
  • 自动学习:目标设备回复时,交换机就能学到正确的位置
  • 即插即用:新设备接入时不需要手动配置

但这也带来了问题。在一个有几百台设备的网络中,如果MAC表频繁刷新,大量的未知单播洪泛会显著影响网络性能。我曾经遇到过一个案例,虚拟化环境中VM频繁迁移,导致MAC地址在不同物理端口间跳来跳去,整个网段的性能都受到了影响。

这就是典型的工程权衡:为了系统的健壮性和易用性,我们接受了一定的性能开销。

老化机制:时间的艺术

MAC表还有一个经常被忽视的机制——老化。每个MAC表项都有一个计时器,通常是300秒。如果在这个时间内没有收到来自该MAC地址的数据包,表项就会被删除。

这个设计很有意思,体现了系统设计中的一个重要原则:信息的时效性。网络拓扑是动态变化的,设备可能会移动、断开或者重新连接。如果MAC表永远不清理,就会积累大量过时的信息,不仅浪费存储空间,还可能导致数据包被发送到错误的端口。

但这也带来了新的权衡:老化时间设置多少合适?

  • 太短:频繁的重新学习会增加洪泛流量
  • 太长:过时信息会影响转发准确性

在虚拟化环境中,这个问题变得更加复杂。VM迁移时,同一个MAC地址可能在很短时间内从一个物理端口跳到另一个物理端口。如果老化时间设置不当,就会出现各种诡异的连通性问题。

VLAN:不只是逻辑隔离

说到VLAN,大多数人的第一反应是”逻辑隔离”。但从产品设计的角度看,VLAN解决的是一个更深层的问题:如何在同一个物理基础设施上支持多个独立的网络?

每个VLAN维护自己独立的MAC地址表:

1
2
# 查看具体VLAN的MAC表
show mac address-table vlan 100

这种设计的巧妙之处在于:即使两个VLAN中有相同的MAC地址,也不会产生冲突。在容器化大行其道的今天,这个特性变得尤为重要。容器的MAC地址往往是动态分配的,在不同的环境中可能会重复,VLAN的隔离机制保证了它们能够和平共存。

三层路由:在复杂性中寻找最优路径

最长匹配:看似简单的智慧

路由查找用的是”最长匹配”算法,这个名字听起来很技术,但背后的思想其实很朴素:越具体的信息越有参考价值。

1
2
3
# 一个典型的路由表
192.168.1.0/24 via 10.0.1.1 dev eth0 metric 100
192.168.1.100/32 via 10.0.1.2 dev eth1 metric 50

当有数据包要发往192.168.1.100时,系统会选择第二条更具体的路由(/32比/24更长)。这就像GPS导航一样:如果你要去”北京市朝阳区某某大厦”,系统会优先匹配”朝阳区某某大厦”的具体路线,而不是”北京市”的泛化路线。

这个设计哲学在很多系统中都能看到:优先使用更精确的配置。它给了网络管理员极大的灵活性——可以为整个网段设置默认路由,同时为关键主机指定专用路径。

在实际运维中,我经常用这个特性来做流量调优。比如对于核心业务服务器,会单独配置一条高优先级路由,让它走更稳定的链路。

ARP:一个被低估的协议

ARP协议经常被当作”理所当然”的存在,但它其实是网络协议栈中的一个精巧设计。它解决了一个根本性问题:如何在IP的逻辑世界和以太网的物理世界之间建立映射?

让我们跟踪一次真实的ARP交互过程:

当192.168.1.10想要联系192.168.1.20时

第一步:发现问题

1
2
3
主机A要发包给主机B,但发现一个尴尬的情况:
知道对方的IP地址,但不知道MAC地址
没有MAC地址就无法构造以太网帧

第二步:广而告之

1
2
3
主机A构造ARP请求,广播询问:
"这个网段里,谁的IP是192.168.1.20?请把你的MAC地址告诉我!"
以太网头:目标MAC = ff:ff:ff:ff:ff:ff (广播)

第三步:旁听者的收获

1
2
3
4
交换机收到这个广播帧:
- 顺便学习了主机A的MAC和端口映射
- 向除源端口外的所有端口洪泛
这就是为什么网络中的ARP流量看起来比实际需要的多

第四步:目标回应

1
2
3
主机B收到请求:
"是的,192.168.1.20就是我,我的MAC是bb:bb:bb:bb:bb:bb"
这次是单播回复,不需要再广播了

第五步:双向学习

1
2
3
这里有个巧妙的优化:
主机B在回复ARP时,也会把主机A的IP-MAC映射记在自己的ARP缓存里
这样如果B稍后要联系A,就不需要再发ARP请求了

这种”无偿学习”的设计体现了工程师的实用主义:既然信息已经在手边了,为什么不利用起来?在高频通信的场景下,这个小优化能显著减少网络开销。

ping背后的故事:一次跨网段通信的奇妙旅程

当我们输入”ping 192.168.2.20”时究竟发生了什么

用了这么多年ping命令,但你真的知道那个小小的数据包是怎么找到目标的吗?让我们跟着一个ICMP包走一趟完整的旅程。

假设我们的网络是这样的:

1
主机A (192.168.1.10/24, 网关: 192.168.1.1) --> 路由器 --> 主机B (192.168.2.20/24, 网关: 192.168.2.1)

第一步:智能的路由判断

1
用户输入:ping 192.168.2.20

主机A不是傻瓜,它会先思考:192.168.2.20这个地址在哪里?

  • 对比本地网段192.168.1.0/24,发现这不是邻居
  • 查找路由表,发现需要通过默认网关192.168.1.1
  • 但是等等,网关的MAC地址是什么?

第二步:向网关”问路”

1
2
3
如果ARP缓存里没有网关的MAC地址:
主机A:ARP请求广播 "192.168.1.1在哪里?"
网关:ARP回复 "我在这里,MAC是00:11:22:33:44:55"

第三步:精心包装的数据包

1
2
3
4
现在主机A开始构造数据包,就像写邮件一样:
以太网信封:收件人 = 网关MAC,发件人 = 自己MAC
IP地址标签:最终目标 = 192.168.2.20,源地址 = 192.168.1.10
ICMP内容:Type=8 (我要测试连通性), Sequence=1 (这是第一个包)

第四步:路由器的转发决策

1
2
3
4
5
路由器收到包后的思考过程:
1. 拆开以太网信封,看到目标IP是192.168.2.20
2. 查路由表:"哦,这个地址在192.168.2.0/24网段,从eth1接口出去"
3. 查ARP表找192.168.2.20的MAC地址
4. 重新包装:换一个新信封(新的源/目标MAC),但保持原来的内容

第五步:到达目的地

1
2
3
4
主机B收到包:
"咦,有人ping我!"
构造回复:把ICMP类型改为0 (Echo Reply),源/目标IP对调
原路返回

第六步:归途通常更顺畅
返回的路径基本相同,但通常会更快,因为沿途的ARP缓存都已经建立了。这就像第二次走同一条路,已经轻车熟路了。

这个过程中的几个有趣细节

  1. 数据包的身份变化:以太网层的源/目标MAC在每一跳都会变化,但IP层的信息保持不变
  2. ARP缓存的重要性:第一次ping通常会比后续的ping慢一些,因为需要做ARP解析
  3. 路由器的双重身份:对主机A来说它是目标,对主机B来说它是源

跨VLAN的ICMP流程

在企业网络中,经常遇到跨VLAN的通信。这时候需要三层设备(路由器或三层交换机)参与:

1
VLAN 100: PC-A (192.168.1.10) ping VLAN 200: PC-B (192.168.2.20)

关键区别在于:

  1. PC-A必须将包发给VLAN间路由接口
  2. 三层设备需要在不同VLAN接口间转发
  3. 每次跨VLAN都是一次三层路由决策

硬件vs软件:性能背后的差异

现代网络设备在转发性能上的差异,主要来自于处理方式的不同:

硬件转发(ASIC/TCAM)

专用芯片的优势很明显:

  • 并行查找:TCAM可以同时匹配多个条目
  • 线速转发:延迟通常在微秒级别
  • 功耗效率:专用电路比通用CPU效率高得多

但硬件也有局限性:

  • 灵活性差:功能相对固化
  • 调试困难:出问题时很难深入分析
  • 成本高:专用芯片开发成本昂贵

软件转发的巧思

软件转发虽然性能不如硬件,但在灵活性上有天然优势:

  • 可编程性强:可以实现复杂的转发逻辑
  • 调试友好:可以打日志、设断点
  • 快速迭代:功能更新不需要换硬件

在实际部署中,我们需要根据具体场景选择。比如边缘接入通常对性能要求不高,软件转发就足够了;而核心骨干网必须用硬件转发才能满足带宽要求。

->

硬件转发vs软件转发:性能与灵活性的永恒博弈

为什么交换机能做到”线速转发”?

刚接触网络设备时,我一直很好奇:为什么一台几万块的交换机,能比一台几万块的服务器转发性能高出几个数量级?答案就在于专用芯片的威力。

硬件转发的黑科技

现代交换机用的ASIC芯片,简直就是为转发而生的:

  • TCAM查找表:能同时匹配成千上万个条目,查找时间是恒定的
  • 流水线处理:数据包像工厂流水线一样被处理,延迟低到微秒级
  • 功耗优化:专用电路的能效比通用CPU高出几十倍

但这种专用性也是它的阿喀琉斯之踵:

  • 功能固化:想加个新特性?对不起,可能要换芯片
  • 调试噩梦:出了问题很难深入分析,只能看表面现象
  • 成本门槛:芯片的设计和流片成本动辄千万美元

软件转发的反击

软件转发虽然在性能上处于劣势,但在灵活性上却有着无法替代的优势:

我记得有一次客户一个故障需要复杂的流量分析功能来定位,当时的交换机环境一比一还原后还要加一层透传才费劲将流量转发到服务器上进行处理。高端路由那边解决这种问题估计配合一些Python脚本,不到一周就就可以搞定。这种灵活性是硬件无法匹敌的。

软件的优势所在

  • 快速迭代:新功能可以通过软件更新快速部署
  • 深度定制:可以实现任何你能想到的转发逻辑
  • 调试友好:出问题可以打日志、设断点,一目了然

选择的智慧

在实际项目中,选择硬件还是软件转发,其实是一个典型的技术决策问题:

核心骨干网:性能为王,必须硬件转发
边缘接入:功能需求多样化,软件转发更合适
测试环境:灵活性重要,软件方案成本更低
特殊应用:有定制需求的,软件是唯一选择

这就像选择交通工具一样:高铁适合长途,但在城市里可能还是出租车更灵活。

交换机与路由器:界限越来越模糊

传统的明确分工

以前的网络设备分工很明确:

  • 交换机:工作在二层,基于MAC地址转发,同一广播域内通信
  • 路由器:工作在三层,基于IP地址路由,连接不同网段

三层交换机的兴起

现在的高端交换机,实际上集成了路由功能。这种设计带来了几个好处:

  1. 性能优势:ASIC芯片同时处理二三层转发,性能比软件路由高很多
  2. 部署简化:减少设备类型,统一管理界面
  3. 成本优化:一台设备替代原来的交换机+路由器组合

但这也带来了一些复杂性:

1
2
3
4
# 在三层交换机上配置VLAN接口
interface vlan 100
ip address 192.168.1.1 255.255.255.0
no shutdown

这种配置方式对网络工程师的要求更高,需要同时理解二层和三层的工作原理。

选择的考量

在实际项目中,设备选型通常要考虑这些因素:

端口密度:交换机通常提供更多的端口,单端口成本更低
转发性能:三层转发性能直接影响跨网段通信效率
功能需求:是否需要复杂的路由协议支持
管理复杂度:设备越少,管理维护越简单
扩展性:未来业务增长时的升级路径

->

交换机与路由器:界限正在消失

从泾渭分明到融合共生

记得刚入行的时候,老师傅们总是强调:交换机管二层,路由器管三层,界限清楚得很。但现在再看网络设备市场,这个界限已经变得非常模糊了。

传统的分工确实很明确

  • 交换机:在同一个广播域内基于MAC地址”傻瓜式”转发
  • 路由器:在不同网段间基于IP地址”智能”路由

但这种分工在面对复杂网络需求时就显得力不从心了。

三层交换机:一个成功的融合案例

三层交换机的出现,可以说是网络设备进化史上的一个里程碑。它告诉我们一个道理:用户需要的不是更多的设备类型,而是更好的解决方案。

融合带来的好处显而易见

  1. 性能提升:ASIC芯片同时处理二三层转发,比传统的”交换机+路由器”组合快很多
  2. 管理简化:一套设备、一个界面、一套配置规则
  3. 成本优化:减少设备数量,降低采购和维护成本

但这也带来了新的挑战:

1
2
3
4
# 三层交换机的VLAN接口配置
interface vlan 100
ip address 192.168.1.1 255.255.255.0
no shutdown

这种配置对网络工程师的要求变高了:既要懂二层的MAC学习和VLAN隔离,又要懂三层的路由转发和协议配置。

选型决策:回归用户需求本质

客户在项目中做设备选型时,我发现最重要的不是技术规格对比,而是回归到用户的实际需求:

如果你的场景是

  • 数据中心内大量服务器互联 → 选择高端三层交换机
  • 分支机构接入总部 → 选择集成路由功能的交换机
  • 运营商骨干网 → 还是需要专业路由器
  • 小型办公网络 → 一台多层交换机就够了

关键考量因素

  • 端口需求:是要密度还是要性能?
  • 转发能力:三层流量占比有多大?
  • 协议支持:需要跑哪些路由协议?
  • 管理复杂度:团队的技术水平如何?
  • 成长空间:三年后的业务规模预期?

这个过程让我深刻体会到:技术选择没有标准答案,只有最适合的方案。

写在最后

二三层转发虽然是网络的基础,但其中的细节值得深入研究。随着SDN、容器网络的发展,这些基础概念的重要性不减反增。

掌握这些细节不只是为了应对故障,更重要的是理解网络行为,做出更好的架构设计。当我们需要为一个新业务设计网络架构时,对这些基础机制的深入理解就显得特别重要。

后续有机会可能会深入聊聊MPLS技术,一起探讨下它是如何在复杂的服务提供商网络中提供更灵活的转发机制的。


二三层转发是我跨专业入门ICT行业的第一课,后续接触到的MPLS、SRv6、OVERLAY等技术虽然看起来很高深,但都建立在今天讨论的基础概念之上。

  • Title: 二三层转发的那些事
  • Author: 叫我EC就好
  • Created at : 2022-08-10 22:30:00
  • Updated at : 2025-07-23 15:28:31
  • Link: https://www.o0o0o.sbs/2022/08/10/二三层转发的那些事/
  • License: This work is licensed under CC BY-NC-SA 4.0.
Comments