
二层交换和桥接这两个词搞网络的人天天挂在嘴边但真要把它背后的转发机制讲清楚尤其是落到LLCE和PFE这两个模块上很多人就开始含糊了。LLCE全称Link Layer Control EnginePFE全称Packet Forwarding Engine这两个模块在嵌入式网络设备、光猫、路由器、交换机芯片的方案里出现频率极高。我接触过的不少设备从家用光猫改桥接到企业级接入交换机底层跑的都是这套逻辑。这篇文章不打算照本宣科地念协议栈而是从一个实际做转发面开发的角度把LLCE和PFE在二层交换/桥接场景下的通用学习转发机制拆开讲透。不管你是刚入行的网络开发还是做光猫、路由器固件的工程师或者只是想把家里网络搞明白的折腾党看完都能对二层转发这件事有一个从硬件到软件的完整认知。1. 二层交换与桥接的核心机制拆解1.1 为什么需要二层转发从冲突域到广播域的演进要理解LLCE和PFE的设计得先回到一个最根本的问题为什么需要二层交换。早期以太网用集线器所有设备共享一个冲突域同一时刻只能有一台设备发送数据效率极低。交换机出现后每个端口都是一个独立的冲突域通过MAC地址表来决定帧从哪个端口转发出去这就是二层交换的起点。但问题来了交换机怎么知道某个MAC地址在哪个端口后面答案是学习。当一个帧从某个端口进来时交换机会把源MAC地址和入端口号记录下来写入MAC地址表。下次如果有帧要发给这个MAC就直接从对应端口转发不用泛洪。这个看似简单的机制就是整个二层转发的基石。桥接和交换在本质上是一回事。桥接通常指两个或多个网段之间的连接交换则更多指多端口设备内部的转发。但在转发机制层面它们用的是同一套逻辑学习源MAC、查找目的MAC、转发或泛洪。LLCE和PFE的分工就是把这套逻辑拆成控制面和数据面两部分来实现。1.2 LLCE模块的定位链路层控制的大脑LLCE这个模块从名字就能看出来它管的是链路层的控制逻辑。在实际的芯片方案里LLCE通常负责以下几件事MAC地址学习从入帧中提取源MAC判断是否需要更新地址表地址老化定期清理长时间不活跃的表项防止表项溢出端口状态管理处理端口的up/down事件更新转发决策VLAN处理根据端口配置决定是否打标签、剥标签转发表维护把学习结果同步给PFE使用的硬件转发表你可以把LLCE理解成一个管理员它不直接搬货但决定货该往哪个方向走。它维护的是一张逻辑上的转发表这张表最终会被下发到PFE的硬件表里。LLCE的设计有一个关键取舍学习是在软件里做还是硬件里做。软件学习灵活可以加各种策略但性能受CPU限制硬件学习快但策略调整困难。大多数方案采用折中LLCE在软件层维护完整的地址表同时把常用表项下发到PFE的硬件快速转发表新学习的地址先走CPU慢路径等确认稳定后再下发硬件。1.3 PFE模块的职责数据面的执行者PFE是真正干活的模块。每个从端口进来的帧都要经过PFE的处理流水线。PFE的核心工作包括帧解析提取目的MAC、源MAC、VLAN标签、以太网类型查表用目的MAC去查硬件转发表决定出端口转发决策命中就单播转发未命中就泛洪修改帧根据需要添加或删除VLAN标签统计计数记录每个端口的收发字节数、帧数PFE的性能直接决定了设备的转发能力。一个设计良好的PFE可以在硬件流水线里完成查表和转发做到线速转发。而LLCE的软件处理只在必要时介入比如地址表更新、未知单播泛洪的决策等。这里有个常见的误解很多人以为PFE就是一个简单的查表转发。实际上PFE的流水线里还包含ACL过滤、QoS标记、镜像、隧道封装等复杂功能。在二层交换场景下PFE主要用到的是查表和VLAN处理这两块。1.4 学习转发机制的完整闭环把LLCE和PFE串起来看一个完整的二层学习转发闭环是这样的帧从端口进入PFEPFE解析源MAC如果地址表中没有这个MAC上报给LLCELLCE决定是否学习这个MAC更新软件地址表LLCE把新表项下发到PFE的硬件转发表PFE用目的MAC查表命中则从对应端口转发如果目的MAC未命中PFE执行泛洪从除入端口外的所有同VLAN端口发出目的设备回应后PFE学习到目的MAC的位置后续通信走单播这个闭环里LLCE负责“学”PFE负责“转”。两者通过硬件转发表和中断/消息机制协同工作。理解了这个闭环后面看具体的配置和排查问题就有了主线。2. LLCE与PFE的协同工作细节2.1 硬件转发表的结构与查找算法PFE用的硬件转发表通常不是简单的线性表而是基于哈希的查找结构。以常见的MAC表为例表项一般包含MAC地址、VLAN ID、出端口号、老化时间、命中计数等字段。哈希查找的好处是速度快一个时钟周期就能定位到桶但缺点是会有哈希冲突。处理冲突的方式有两种一种是链表法同一个桶里挂多个表项查找时逐个比较另一种是开放寻址冲突时探测下一个位置。硬件实现里链表法更常见因为可以控制每个桶的深度。表项的宽度也很关键。一个典型的MAC表项可能是64位或128位宽包含MAC地址48位、VLAN ID12位、端口号若干位、标志位等。表项的深度决定了能学习多少个MAC地址家用设备通常支持1K到8K条企业级设备可以到64K甚至更多。注意硬件转发表的容量是有限的如果网络里MAC地址数量超过表容量就会出现表项频繁老化、泛洪增多的问题。这是排查网络性能问题时容易被忽略的一个点。2.2 地址学习的老化机制与表项管理地址老化是LLCE的一个重要功能。如果没有老化地址表很快就会被填满而且设备换端口后旧表项会一直存在导致转发错误。老化的基本逻辑是每个表项有一个老化计时器默认通常是300秒。每次有帧命中这个表项计时器重置。如果超过老化时间没有命中LLCE就把这个表项删除同时通知PFE删除硬件表项。老化时间的设置需要权衡。设得太短地址表频繁变动泛洪增多设得太长设备迁移后旧表项残留导致流量黑洞。在终端频繁移动的场景比如无线AP下的设备漫游老化时间可以适当缩短到60到120秒。在稳定的有线接入场景300秒是合理的默认值。还有一个细节是表项的刷新策略。当LLCE发现同一个MAC地址从不同端口进来时说明设备迁移了。这时候要立即更新表项的出端口而不是等老化。这个动作叫“MAC迁移”在PFE里通常通过更新表项的出端口字段来实现不需要删除重建。2.3 泛洪策略与未知单播的处理当PFE查表未命中时帧会被泛洪。泛洪的范围是同一个VLAN内的所有端口但不包括入端口。这个逻辑看起来简单但实际实现里有几个坑。第一个坑是VLAN的隔离。如果端口配置了不同的VLAN泛洪时必须严格按VLAN隔离不能跨VLAN泛洪。PFE里通常有一个端口VLAN成员表泛洪时查这个表来决定从哪些端口发出。第二个坑是组播和广播的处理。广播帧的目的MAC是全F组播帧的目的MAC最高字节的最低位是1。这两类帧不查单播转发表直接泛洪。但组播如果配置了IGMP Snooping就要按组播组成员表来转发不能无脑泛洪。第三个坑是泛洪风暴。如果网络里存在环路泛洪帧会无限循环瞬间打满带宽。这就是为什么二层网络必须跑STP生成树协议或者配置风暴抑制。PFE里通常有风暴抑制的计数器超过阈值就丢弃。2.4 控制面与数据面的消息通道LLCE和PFE之间的通信通常通过以下几种方式中断PFE在遇到未知单播、地址表满、MAC迁移等事件时产生中断通知CPULLCE在中断处理里读取事件并处理DMA大批量的表项下发通过DMA通道减少CPU拷贝开销共享内存LLCE和PFE共享一块内存区域LLCE写表项PFE读表项通过门铃寄存器通知对方中断的合并和限速很重要。如果每个未知单播都产生一个中断CPU会被中断风暴打满。实际实现里通常有中断合并机制比如积累一定数量的未知单播后再统一上报或者限制每秒的中断次数。提示在调试二层转发问题时可以查看LLCE的中断统计和PFE的泛洪计数。如果泛洪计数异常高说明地址学习有问题可能是表项容量不足或者老化时间设置不当。3. 实操环境下的配置与验证3.1 典型嵌入式方案的转发面初始化流程以常见的家用光猫或路由器方案为例转发面的初始化通常分几个阶段第一阶段是硬件初始化。上电后bootloader加载固件PFE的寄存器被配置为默认状态所有端口关闭转发等待软件配置。第二阶段是LLCE初始化。系统启动后LLCE模块加载初始化软件地址表设置老化定时器注册中断处理函数。第三阶段是端口配置。根据板级配置设置每个端口的速率、双工、VLAN模式。这时候端口开始up但转发还没完全使能。第四阶段是转发表下发。LLCE把初始的静态表项比如CPU的MAC、网关的MAC下发到PFE使能转发。第五阶段是协议启动。如果跑STP这时候开始发送BPDU参与生成树计算。STP收敛后端口进入转发状态二层转发正式工作。这个流程里任何一个阶段出问题都会导致转发不通。比如端口VLAN配置错误帧进来后找不到VLAN成员直接被丢弃。3.2 用命令行验证MAC学习和转发路径在嵌入式设备上通常有命令行工具可以查看MAC地址表和转发统计。以下是一些常见的操作# 查看MAC地址表 brctl showmacs br0 # 查看转发表项的老化时间 brctl showstp br0 # 查看端口统计 ifconfig eth0 # 查看PFE的泛洪计数具体命令因芯片而异 cat /proc/pfe/stats在Linux桥接的实现里brctl是常用的工具。showmacs会列出所有学习到的MAC地址、对应的端口和老化状态。如果某个MAC地址一直显示在错误的端口上说明MAC迁移没有正确处理。对于PFE的硬件表通常有专门的调试命令。比如某些芯片方案提供mib命令查看每个端口的收发计数mac命令查看硬件MAC表。这些命令的输出格式因芯片而异但核心信息是一样的MAC地址、VLAN、出端口、命中计数。3.3 抓包分析二层转发过程抓包是验证二层转发最直接的方法。在Linux桥接环境下可以用tcpdump在桥接口和物理接口上同时抓包对比帧的进出情况。# 在桥接口抓包 tcpdump -i br0 -e -n # 在物理接口抓包 tcpdump -i eth0 -e -n-e参数会显示以太网头部包括源MAC和目的MAC。通过对比桥接口和物理接口的抓包结果可以判断帧是否被正确转发。一个典型的验证场景是PC1 ping PC2在PC1的端口抓包应该看到ICMP请求帧源MAC是PC1目的MAC是PC2。在PC2的端口抓包应该看到同样的帧。如果PC2的端口没有抓到说明转发路径有问题可能是MAC表没有学习到PC2或者VLAN配置不匹配。注意在桥接环境下抓包桥接口和物理接口可能会抓到重复的帧。这是因为桥接口是逻辑接口帧会同时经过逻辑路径和物理路径。分析时要区分清楚。3.4 性能测试与转发瓶颈定位二层转发的性能测试通常用iperf或者专用的打流工具。测试时要注意几点测试流量要跨端口不能在同一端口内循环帧大小要覆盖小包和大包小包考验PPS大包考验带宽要关闭CPU的慢路径确保流量走硬件快转如果测试结果远低于线速可能的原因有现象可能原因排查方法小包PPS低PFE流水线瓶颈查看PFE时钟频率和流水线级数大包带宽低内存带宽瓶颈检查DMA通道和内存频率泛洪多MAC表容量不足查看MAC表使用率和老化统计丢包端口拥塞或风暴抑制查看端口统计和风暴抑制计数定位瓶颈时先用ethtool -S查看端口统计确认丢包发生在入端口还是出端口。然后查看PFE的流水线统计确认是查表慢还是转发慢。最后检查CPU占用确认是否有大量慢路径流量。4. 常见问题与排查技巧实录4.1 MAC地址表异常学习不到、学错端口、表项满MAC地址学习不到是最常见的问题。排查思路如下先确认入帧是否到达PFE。用端口统计查看入端口的收帧计数如果计数不增长说明帧根本没进来问题在物理层或端口配置。如果入帧正常但学不到检查VLAN配置。PFE通常只在帧的VLAN与端口的PVID匹配时才学习。如果端口PVID是10但帧不带标签PFE可能会丢弃或者不学习。学错端口通常发生在有环路的网络里。同一个MAC地址从两个端口进来LLCE会不断更新表项导致流量在两个端口之间跳来跳去。这时候要检查STP是否正常工作或者是否有端口被错误地配置为转发状态。表项满的表现是新MAC学不到老MAC老化后立刻被新MAC占用网络里泛洪明显增多。解决方法是增大MAC表容量如果硬件支持或者缩短老化时间或者做MAC地址过滤只允许特定MAC接入。4.2 泛洪风暴与环路检测泛洪风暴是二层网络最危险的问题之一。一旦形成环路广播帧会无限循环CPU和带宽都会被占满。检测环路的方法有几种查看端口统计如果某个端口的广播帧计数飞速增长说明可能有环路查看CPU占用如果softirq占用很高说明有大量帧上送CPU用抓包工具看是否有大量重复的广播帧解决环路的标准方法是启用STP。STP通过交换BPDU选举根桥阻塞冗余端口形成无环的转发树。RSTP快速生成树收敛更快适合对中断敏感的场景。MSTP多生成树可以按VLAN做负载分担适合大型网络。如果设备不支持STP可以用风暴抑制作为临时措施。PFE里通常有广播、组播、未知单播的风暴抑制计数器超过阈值就丢弃。但风暴抑制只是治标根本解决还是要消除环路。提示在光猫改桥接的场景里如果光猫的LAN口和路由器的LAN口接在一起很容易形成环路。正确的做法是光猫改桥接后只用一个LAN口接路由器的WAN口路由器的LAN口不要再接回光猫。4.3 VLAN配置错误导致的转发异常VLAN配置错误是二层转发问题的另一个高发区。常见的错误包括端口PVID设置错误导致帧被分配到错误的VLANTrunk口没有允许对应的VLAN通过导致帧被丢弃Access口收到了带标签的帧PFE不知道该怎么处理VLAN成员表没有更新泛洪时漏掉了某些端口排查VLAN问题时先确认端口的VLAN模式Access/Trunk/Hybrid然后查看PVID和允许的VLAN列表。用brctl show可以查看桥的VLAN配置用ip link可以查看端口的VLAN过滤设置。一个实用的技巧是在入端口和出端口同时抓包对比VLAN标签的变化。如果入端口有标签、出端口没标签说明出端口是Access口做了剥标签。如果入端口没标签、出端口有标签说明出端口是Trunk口做了打标签。4.4 光猫改桥接后的二层转发变化光猫改桥接是一个很典型的场景。改桥接后光猫不再做路由和NAT只做二层转发把PPPoE帧透传给路由器。这个过程中二层转发的配置会发生几个变化光猫的WAN口从路由模式变为桥接模式不再分配IP光猫的LAN口和WAN口在同一个桥里帧直接透传路由器的WAN口做PPPoE拨号获取公网IP如果还要看IPTVIPTV的VLAN要单独配置不能和上网流量混在一起改桥接后常见的转发问题是上网正常但IPTV不通或者IPTV正常但上网不通。这通常是VLAN配置的问题。上网和IPTV通常用不同的VLAN桥接时要确保两个VLAN都正确透传。还有一个坑是MAC地址的变化。改桥接后路由器WAN口的MAC地址会暴露在光猫的桥表里。如果运营商绑定了MAC地址可能需要克隆MAC。这个操作在路由器的WAN口设置里通常有选项。4.5 常见问题速查表问题现象可能原因排查命令解决方法部分设备不通MAC表未学习brctl showmacs检查VLAN和端口配置全网泛洪严重环路或表项满端口统计、CPU占用启用STP、增大表容量改桥接后IPTV不通VLAN未透传抓包看VLAN标签配置IPTV VLAN转发延迟大慢路径流量多查看CPU占用检查未知单播和表项老化端口不转发STP阻塞或端口downbrctl showstp检查STP状态和物理连接MAC地址漂移环路或MAC迁移查看MAC表变化检查STP和端口配置5. 从芯片方案看LLCE与PFE的实现差异5.1 不同芯片厂商的架构取舍不同芯片厂商在LLCE和PFE的实现上有不同的取舍。有的方案把LLCE完全放在CPU上跑PFE只做简单的查表转发有的方案把学习逻辑也硬化LLCE只在异常时介入。前者的优势是灵活可以支持复杂的转发策略比如基于ACL的重定向、基于策略的路由。劣势是性能受CPU限制新学习的地址需要CPU介入慢路径流量多的时候CPU容易成为瓶颈。后者的优势是性能高学习在硬件里完成CPU几乎不参与转发。劣势是策略调整困难硬件表项一旦固化修改需要重新配置整个流水线。在实际选型时家用设备通常倾向于硬件学习因为成本低、性能够用。企业级设备更倾向于软件学习因为需要灵活的ACL和QoS策略。5.2 硬件快转与软件慢转的切换逻辑大多数方案都支持快转和慢转的切换。快转是PFE硬件直接转发慢转是帧上送CPU由LLCE处理后再转发。切换的触发条件通常有目的MAC未命中硬件表需要泛洪帧需要特殊处理比如TTL超时、需要发ICMP差错帧命中了ACL规则需要重定向或丢弃地址表需要更新LLCE要介入快转和慢转的比例是衡量转发面健康度的重要指标。正常情况下慢转流量应该很少大部分流量走快转。如果慢转比例很高说明硬件表命中率低可能是表容量不足或者老化时间太短。优化慢转比例的方法包括增大硬件表容量、延长老化时间、预下发静态表项、优化哈希算法减少冲突。5.3 虚拟化环境下的桥接实现在虚拟化环境里二层桥接的实现和物理设备有所不同。以Linux Bridge为例它是在内核里实现的软件桥每个veth pair或者tap设备作为一个端口加入桥。Linux Bridge的学习转发逻辑和物理交换机类似但性能受内核网络栈限制。为了提高性能可以用OVSOpen vSwitch或者硬件卸载。OVS支持流表可以把常用流转发到硬件减少内核处理。在虚拟化场景下LLCE和PFE的概念对应到Linux Bridge的fdb转发数据库和datapath。fdb负责MAC学习datapath负责转发。如果用了DPDK或者硬件卸载datapath可以在用户态或者网卡硬件里执行性能大幅提升。虚拟化桥接的一个常见问题是MAC地址冲突。如果多个虚拟机配置了相同的MAC桥表会不断漂移导致流量不稳定。解决方法是确保每个虚拟机的MAC唯一或者配置MAC过滤。6. 二层转发机制的演进与扩展6.1 从STP到SPB最短路径桥接的改进思路传统STP的问题是收敛慢、链路利用率低。STP会阻塞冗余链路导致带宽浪费。RSTP改进了收敛速度但链路利用率问题依然存在。SPB最短路径桥接的思路是用IS-IS协议计算最短路径而不是简单的生成树。SPB允许所有链路都参与转发通过最短路径算法避免环路。这样既提高了链路利用率又保证了无环转发。SPB的实现比STP复杂需要在LLCE里集成IS-IS协议栈PFE要支持基于最短路径的转发表。目前SPB主要用在运营商网络和数据中心家用和企业接入场景还是以STP/RSTP为主。6.2 多链路聚合与负载分担链路聚合LAG是提高带宽和可靠性的常用手段。多条物理链路聚合成一条逻辑链路LLCE和PFE需要支持基于流的负载分担。负载分担的哈希算法通常基于源MAC、目的MAC、源IP、目的IP、源端口、目的端口的组合。哈希的结果决定流量走哪条物理链路。如果哈希算法不好可能导致流量分布不均某条链路拥塞而其他链路空闲。在二层转发场景下LAG的成员端口对PFE来说是透明的。PFE查表得到逻辑出端口后再根据哈希选择具体的物理端口。这个选择过程通常在PFE的出口流水线里完成。6.3 未来趋势可编程转发面与P4可编程转发面是近年来的热点。P4语言允许开发者自定义转发流水线不再受限于固定的硬件表结构。LLCE和PFE的边界在可编程架构下变得模糊开发者可以在P4程序里同时实现学习和转发逻辑。可编程转发面的优势是灵活可以快速支持新协议和新功能。劣势是性能可能不如固定流水线而且开发门槛高。目前可编程转发面主要用在数据中心和科研场景家用和企业接入设备还是以固定流水线为主。不过随着可编程芯片的成本下降未来可能会有更多设备采用可编程转发面。到时候LLCE和PFE的实现方式会发生根本变化但二层学习转发的核心逻辑不会变。我在实际调试二层转发问题时最深的体会是不要一上来就怀疑硬件大部分问题都是配置错误。VLAN配错、端口模式不对、STP状态异常这些软件层面的问题占了八成以上。真正遇到硬件表项满、哈希冲突严重的情况反而少。所以排查时先看配置再看统计最后才怀疑芯片。另外抓包永远是最可靠的手段不管多复杂的转发问题在入端口和出端口各抓一次包对比一下VLAN标签和MAC地址基本就能定位到问题所在。