
1. 链路聚合到底解决了什么问题很多刚接触网络设备的朋友第一次听到“链路聚合”这四个字脑子里冒出来的画面大概是把好几根网线捆成一根用。这个直觉其实挺准的但只对了一半。链路聚合Link Aggregation真正做的事情是把两台设备之间多条物理链路捆绑成一条逻辑链路让它们在外人看来就像一条带宽更大的“粗管子”。这条逻辑链路在不同厂商那里叫法不一样华为体系里最常见的叫法是Eth-Trunk也就是以太网干道。我在实际项目里第一次被链路聚合“教育”是在一个接入层到汇聚层的场景。当时两台交换机之间只拉了一根千兆线白天办公高峰期用户抱怨共享文件慢得离谱。我上去一看接口的带宽利用率已经跑到百分之九十以上广播包和单播包挤在一起延迟抖动非常明显。那时候最直接的想法就是再加一根线但问题来了如果只是简单地把两根线都插上生成树协议STP会立刻把其中一根口给阻塞掉因为STP眼里这就是个环路。也就是说你物理上插了两根线逻辑上只有一根在工作另一根纯属备胎带宽一点没涨。链路聚合就是来破这个局的。它把多条物理链路捆绑成一条逻辑链路之后STP看到的是“一条链路”不会触发阻塞而实际转发的时候流量会按照某种算法分散到各条成员链路上。这样一来带宽叠加了同时还顺带获得了冗余能力——某一条物理线断了只要还有成员活着这条逻辑链路就不会断业务几乎无感知。这个特性在核心链路、服务器上行链路、堆叠互联链路里用得极其普遍。那为什么标题里特意强调“基础理论”和“华为ENSP基础配置”因为链路聚合这东西理论上一句话能说清但真到配置的时候坑一个接一个。手工模式还是LACP模式负载分担算法怎么选成员口的速率和双工要不要强制跨设备聚合又是什么鬼这些问题不搞清楚配出来的链路聚合要么不通要么时通时不通排查起来能把人逼疯。ENSP作为华为官方的网络模拟器是绝大多数人练习链路聚合的第一站但它也有自己的脾气比如某些型号不支持某些特性模拟环境和真机行为存在差异这些都需要提前知道。这篇文章我打算按我自己的学习路径来写先把链路聚合的核心概念和两种工作模式掰开揉碎讲清楚然后直接在ENSP里从零搭一个拓扑把手工模式和LACP模式各配一遍中间穿插我踩过的坑和验证方法。不管你是刚考完HCIA想练手还是工作里第一次要配Eth-Trunk应该都能直接抄作业。2. 链路聚合的核心概念与两种工作模式2.1 聚合口、成员口和活动链路的关系在华为设备上链路聚合的落脚点是一个逻辑接口叫Eth-Trunk 接口。你可以把它理解成一个“容器”物理接口被加进去之后就成了成员接口。这个容器有自己的编号比如 Eth-Trunk 1、Eth-Trunk 2配置IP地址、放行VLAN、做QoS策略都是在这个逻辑接口上做而不是在物理口上做。这一点特别重要我见过有朋友把IP配在物理口上然后纳闷为什么聚合不生效——物理口一旦加入Eth-Trunk它自己的很多配置就会被逻辑口接管你在物理口上配的东西基本就失效了。成员接口加入Eth-Trunk之后并不是所有成员都会立刻转发流量。这里要区分两个概念活动链路和非活动链路。活动链路是当前真正参与数据转发的成员口非活动链路则是备份状态。哪些口是活动的取决于聚合模式。手工模式下只要成员口的速率、双工、VLAN等参数匹配基本都会成为活动链路LACP模式下则要通过LACPDU报文协商协商通过的口才能变成活动链路。这个区别直接决定了两台设备对接时能不能成功聚合。还有一个容易被忽略的点Eth-Trunk的带宽是活动链路带宽的总和。比如你捆了三条千兆线但只有两条协商成了活动链路那这条逻辑链路的带宽就是两千兆不是三千兆。所以配完之后一定要确认活动链路的数量别想当然。2.2 手工负载分担模式简单粗暴但有前提手工负载分担模式英文叫 Manual Load Balancing是链路聚合里最“原始”的一种。它的工作方式非常直接管理员手动把多个物理口加进Eth-Trunk不跑任何协商协议设备默认所有成员口都参与转发。谁做活动链路、谁做备份完全由管理员和物理状态决定没有协议层面的握手。这种模式的好处是不挑对端。只要两边都是华为设备或者一边华为一边其他厂商支持静态聚合的设备配好就能通。它不依赖LACP协议所以对端设备支不支持LACP都无所谓。在一些老旧设备互联、或者对端是服务器网卡做静态绑定比如Linux的bonding mode 0/2的场景里手工模式反而是最省事的。但它的缺点也很明显。第一没有链路故障的协议级检测。如果中间隔了传输设备物理口是up的但实际链路已经不通了手工模式是感知不到的流量还会往坏链路上发。第二成员口的加入没有协商过程如果一端配了聚合、另一端没配或者两端参数不一致可能出现一端转发一端丢弃的情况排查起来很隐蔽。第三活动链路的选择不够智能通常按端口号顺序来不能根据对端信息动态调整。我个人的经验是手工模式适合两端都是自己可控、链路直连、没有中间传输设备的场景。一旦链路要经过运营商或者第三方设备优先考虑LACP。2.3 LACP模式带协商的聚合更可靠LACP全称链路聚合控制协议是IEEE 802.3ad定义的标准协议。华为设备上的LACP模式就是在手工聚合的基础上增加了LACPDU报文的交互。两端设备通过互相发送LACPDU交换系统优先级、端口优先级、MAC地址等信息然后根据这些信息选举出活动链路。LACP模式最大的价值在于故障检测和自动协商。如果一条成员链路的对端出了问题LACPDU收不到了这条链路会被自动踢出活动状态流量切换到其他成员口。这个过程比手工模式靠物理层检测要可靠得多。另外LACP还支持M:N备份也就是M条活动链路加N条备份链路活动链路全断了备份链路才顶上灵活性更高。LACP选举活动链路的时候遵循一套比较逻辑先比系统优先级数值越小越优先再比系统MAC地址越小越优先选出主动端然后在主动端上比端口优先级越小越优先再比端口号越小越优先依次选出活动链路。这个逻辑听起来绕但实际配置的时候大部分情况用默认值就行只有在需要精确控制哪条口做活动、哪条口做备份的时候才去调优先级。这里有个关键参数叫最大活动链路数max active-linknumber。默认情况下Eth-Trunk能支持的最大活动链路数跟设备型号有关但你可以手动限制。比如你捆了四条线但只想让两条做活动、两条做备份就可以把最大活动链路数设成2。这个功能在带宽需求不大、但要求高可靠的场景里很有用。2.4 两种模式的对比与选型建议把两种模式放在一起对比选型思路会清晰很多。对比维度手工负载分担模式LACP模式协商协议无LACPDU对端要求支持静态聚合即可需支持LACP故障检测依赖物理层协议级检测活动链路选举按端口顺序按优先级和MAC选举配置复杂度低中等适用场景直连、服务器绑定、老旧设备核心互联、跨传输链路选型的时候我一般这么判断如果两端设备都支持LACP且链路比较重要无脑选LACP如果对端是服务器或者不支持LACP的设备用手工模式如果是实验室练习两种都配一遍理解差异。注意无论哪种模式成员口的速率、双工、MTU、VLAN配置必须一致否则可能加入失败或者转发异常。这是最常见的翻车点。3. ENSP环境准备与基础拓扑搭建3.1 ENSP安装与设备选型注意事项ENSP的安装本身没什么好说的官网下载安装包一路下一步就行。但有几个点我必须提醒不然你会在莫名其妙的地方卡住。第一ENSP依赖VirtualBox安装的时候最好先装VirtualBox再装ENSP而且版本要匹配不然启动设备会报错。第二ENSP对Windows的Hyper-V比较敏感如果开了Hyper-V有时候设备起不来需要在系统功能里把Hyper-V关掉或者用兼容模式。第三ENSP里的设备型号有限不是所有真机特性都支持比如某些高端型号的跨设备聚合M-LAG在ENSP里就没有练习的时候要心里有数。设备选型上做链路聚合练习我一般用两台S5700或者S3700交换机。S5700在ENSP里支持的特性比较全LACP、手工模式都没问题。如果手头只有路由器用AR系列也行但路由器上配Eth-Trunk的场景相对少一些。我这次用两台S5700来搭型号选S5700-28C-HI这个型号在ENSP里比较稳定。3.2 拓扑设计与连线规划拓扑很简单两台交换机中间用三条线连起来分别接在G0/0/1、G0/0/2、G0/0/3上。为什么用三条因为两条太容易“看不出效果”三条能更明显地观察活动链路选举和负载分担。两端各接一台PC用来测试连通性。连线的时候注意ENSP里选线缆类型要选Copper铜线别选成Serial或者其他的。三条线分别连到两台交换机的对应接口上接口编号要记清楚后面配置的时候要用。拓扑搭好之后先别急着配聚合把PC的IP地址配好交换机上配好VLAN和access口确保单链路情况下PC能通。这一步是基线基线不通后面聚合配了也是白搭。我见过有人直接上聚合结果不通排查半天发现是VLAN没放行白白浪费时间。3.3 基础IP与VLAN配置假设PC1的IP是192.168.1.1/24PC2是192.168.1.2/24都放在VLAN 10里。交换机上这么配# SW1 system-view sysname SW1 vlan 10 quit interface GigabitEthernet0/0/4 port link-type access port default vlan 10 quit # SW2 system-view sysname SW2 vlan 10 quit interface GigabitEthernet0/0/4 port link-type access port default vlan 10 quit配完之后PC1 ping PC2应该能通。如果不通检查PC的IP、子网掩码、网关同网段不需要网关以及接口的VLAN配置。这一步通了再往下走。提示ENSP里PC的配置在“基础配置”标签页里IP地址、子网掩码填好之后记得点“应用”。有时候点了应用但没生效重新打开配置页面确认一下。4. 手工负载分担模式配置实战4.1 Eth-Trunk接口创建与成员加入手工模式的配置非常直接。在SW1上interface Eth-Trunk 1 mode manual load-balance quit interface GigabitEthernet0/0/1 eth-trunk 1 quit interface GigabitEthernet0/0/2 eth-trunk 1 quit interface GigabitEthernet0/0/3 eth-trunk 1 quitSW2上做同样的操作。注意mode manual load-balance这行命令在有些版本里是默认的不敲也行但显式敲出来更清晰。成员口加入的时候如果物理口之前有配置加入Eth-Trunk后会被清掉所以最好先把物理口恢复默认配置。配完之后用display eth-trunk 1查看状态。你会看到成员接口列表以及每个成员口的状态。手工模式下只要物理口up基本都会显示为“Selected”也就是活动状态。4.2 验证聚合是否生效验证分几步。第一步看Eth-Trunk的状态display eth-trunk 1输出里关注几个信息Eth-Trunk的工作模式Manual、成员接口数量、活动接口数量、以及每个成员口的Status。如果活动接口数量等于成员接口数量说明全部生效。第二步看STP的状态。在Eth-Trunk配好之前三条线之间会有环路STP会阻塞两条。配好聚合之后STP应该把Eth-Trunk当成一个接口不再阻塞。用display stp brief看一下Eth-Trunk 1应该是Forwarding状态物理口不再单独出现在STP表里。第三步PC互ping确认业务通。然后可以做断链测试在ENSP里右键点击某条连线选择“删除”模拟断线再ping应该不中断或者只丢一两个包。这个测试能直观感受到聚合的冗余价值。4.3 负载分担算法的选择与效果观察华为设备默认的负载分担算法是源MAC目的MAC的哈希。也就是说同一对源和目的MAC之间的流量只会走同一条成员链路不会分散到多条。这个特性很重要因为很多人以为捆了三条线一个FTP传输就能跑满三千兆实际上单条流还是走一条线只有多条流才会分散。如果想改变分担方式可以用load-balance命令。比如interface Eth-Trunk 1 load-balance src-dst-ip这样就是按源IP和目的IP做哈希。不同的算法适合不同的场景源MAC目的MAC适合接入层因为用户MAC比较分散源IP目的IP适合核心层因为IP流量更丰富。选错了算法可能出现某条链路跑满、其他链路空闲的情况。在ENSP里观察负载分担效果可以开两个PC之间的多个ping或者用FTP模拟多流然后display interface Eth-Trunk 1看各成员口的流量计数。不过ENSP的流量统计不太精确只能看个大概趋势。实操心得手工模式下如果一端配了聚合、另一端没配会出现什么现象答案是配了聚合的一端会把流量哈希到三条线上但没配的一端只认一条线另外两条线的流量会被丢弃表现为时通时不通、丢包严重。所以两端必须都配。5. LACP模式配置与活动链路选举5.1 LACP模式配置步骤LACP模式的配置和手工模式前半段一样区别在mode那一行interface Eth-Trunk 1 mode lacp-static quit interface GigabitEthernet0/0/1 eth-trunk 1 quit interface GigabitEthernet0/0/2 eth-trunk 1 quit interface GigabitEthernet0/0/3 eth-trunk 1 quitmode lacp-static表示静态LACP模式。华为还有动态LACP但用得少一般说LACP模式默认指静态。两端都配好之后LACPDU开始交互稍等几秒用display eth-trunk 1查看应该能看到活动链路被选举出来。5.2 活动链路选举过程拆解LACP选举活动链路的过程我拆成三步来理解。第一步确定主动端。两端设备互相发LACPDU里面带着系统优先级和系统MAC。系统优先级默认是32768如果一样就比MACMAC小的那边成为主动端。主动端负责最终决定哪些链路是活动的。第二步在主动端上选活动链路。主动端看自己这边成员口的端口优先级默认32768和端口号优先级小的优先优先级一样就端口号小的优先。按这个顺序结合最大活动链路数选出活动链路。第三步通知对端。主动端把选举结果通过LACPDU告诉对端对端据此设置自己的活动链路。所以两端看到的活动链路是一致的。这个过程中如果最大活动链路数没设默认是设备支持的最大值通常等于成员口数量也就是全部活动。如果想留备份就手动设小一点。5.3 最大活动链路数与备份链路验证假设三条线我想让两条活动、一条备份在Eth-Trunk接口下配interface Eth-Trunk 1 max active-linknumber 2配完之后display eth-trunk 1会显示两条Selected、一条Unselected。Unselected的那条就是备份链路平时不转发流量但物理口还是up的。验证备份链路是否真的能顶上来把两条活动链路中的一条断掉观察Unselected的那条是否变成Selected。在ENSP里删掉一条活动链路的连线然后立刻display eth-trunk 1应该能看到备份链路被激活。这个过程通常很快一两秒内完成。注意max active-linknumber的值不能超过设备支持的上限也不能小于1。设成1的话就只有一条活动链路其余全备份带宽不叠加但冗余性最强。5.4 LACP超时时间与抢占功能LACP有两个超时时间短超时3秒和长超时90秒。默认是长超时也就是90秒收不到LACPDU才认为链路故障。在对故障恢复要求高的场景里可以改成短超时interface Eth-Trunk 1 lacp timeout fast短超时能更快检测故障但也会增加协议报文开销一般只在核心链路用。抢占功能是另一个实用特性。默认情况下如果一条优先级高的链路故障恢复后它不会自动抢回活动状态而是继续做备份。如果希望它恢复后重新成为活动链路需要开抢占interface Eth-Trunk 1 lacp preempt enable lacp preempt delay 10delay是抢占延迟防止链路刚恢复还不稳定就抢回来造成震荡。我一般设10到30秒。6. 常见问题排查与避坑经验6.1 聚合不生效的典型原因速查链路聚合配完不通原因就那么几类。我整理了一个速查表按出现频率排序现象可能原因排查方法成员口加入失败物理口有配置未清除先default interface恢复默认活动链路数为0两端模式不一致确认都是manual或都是lacp时通时不通一端配了聚合一端没配检查两端Eth-Trunk配置部分成员口Unselected速率/双工/VLAN不一致display interface对比参数LACP协商失败对端不支持LACP改用手工模式流量只走一条线负载分担算法不适配调整load-balance算法这个表里的每一行我都在实际环境或者ENSP里遇到过。尤其是“一端配了一端没配”这个特别隐蔽因为物理上灯是亮的ping有时候通有时候不通新手很容易懵。6.2 ENSP模拟环境的特殊坑ENSP毕竟不是真机有些行为跟真机不一样。第一LACPDU的收发在ENSP里有时候不稳定特别是设备刚启动的时候可能需要多等一会儿或者重启一下设备。第二流量统计不准确display interface里的包计数可能跟实际不符别太当真。第三某些命令在ENSP里不支持比如一些高级的负载分担算法敲了会报错这时候换一个支持的算法就行。第四设备性能有限如果拓扑太大、流量太猛ENSP会卡顿甚至崩溃练习的时候拓扑尽量精简。6.3 真机与模拟器的差异提醒从ENSP过渡到真机有几个差异要提前知道。真机上成员口加入Eth-Trunk后物理口的配置会被逻辑口覆盖这个和ENSP一致。但真机的LACP协商速度通常比ENSP快故障切换也更干脆。另外真机上有些型号默认就支持跨设备聚合ENSP里没有别在模拟器里找。还有真机的负载分担算法选项更多可以根据业务需求精细调整ENSP里能选的比较少。实操心得在真机上配链路聚合之前先把两端的软件版本、硬件型号确认一遍。不同版本的默认行为可能有差异比如默认的LACP超时时间、默认的负载分担算法。我吃过一次亏两台设备版本差了好几个大版本LACP协商死活不成功升级到同一版本后立刻就好了。6.4 链路聚合的扩展场景链路聚合不只是交换机之间用。服务器双网卡绑定、防火墙双链路、存储设备多路径底层都是类似的思想。服务器上用Linux bonding或者Windows NIC Teaming对端交换机配Eth-Trunk这是很常见的组合。这种场景下服务器端通常用静态聚合对应手工模式因为服务器网卡驱动对LACP的支持参差不齐。配的时候要注意服务器端的聚合模式和交换机端要匹配哈希算法也要尽量一致不然流量分布会不均匀。另一个扩展是跨设备链路聚合华为叫M-LAG其他厂商叫vPC、MLAG等。它把两台交换机虚拟成一台服务器同时连到两台交换机上做聚合既有了链路冗余又有了设备级冗余。这个在数据中心里很常见但配置复杂度比单设备聚合高不少ENSP里也模拟不了需要真机或者更高级的模拟器。7. 我个人的配置习惯与收尾建议配了这么多次Eth-Trunk我慢慢形成了一套自己的习惯。第一先配物理口再配聚合口把物理口的配置清干净避免残留配置干扰。第二两端同时配不要一端配完再配另一端中间的时间差可能导致STP震荡。第三配完必查display eth-trunk、display stp brief、display interface brief三条命令走一遍确认状态正常。第四做断链测试不断链的聚合配置是不完整的只有断过链才知道冗余是不是真的生效。还有一个小技巧如果Eth-Trunk的成员口比较多可以用interface range批量加入省得一个个敲。比如interface range GigabitEthernet0/0/1 to GigabitEthernet0/0/3 eth-trunk 1 quit这个在真机和ENSP里都支持效率高很多。最后说一句关于负载分担的体会。很多人配完聚合就以为万事大吉实际上如果流量模型和分担算法不匹配聚合的带宽优势根本发挥不出来。我一般会在配完之后用多条流测试一下各成员口的流量如果发现严重不均就调整算法。这个步骤在真机上做更有意义ENSP里只能看个趋势。链路聚合是个“看起来简单、配起来有坑、调好了很香”的技术多练几遍把两种模式都摸透以后遇到再复杂的聚合场景心里都有底。