在软考网络工程师的历年真题里,链路聚合是一个出镜率不高却极具区分度的考点。它不像 IP 子网划分那样每年必出一道纯计算题,也不像 VLAN 那样年年有固定考法,而是散落在上午综合题的个别选项里,用几个看似平淡、实则暗藏陷阱的表述,把一批又一批考生拦在及格线之外。很多人直到交卷都说不清楚静态聚合和动态聚合的区别,也搞不明白负载分担模式为什么不能保证单条数据流同时占用多条物理链路,更不清楚两台交换机上的聚合组编号不一致到底会不会导致链路无法建立。这些问题看似零散,本质上都指向同一个技术体系——链路聚合。本文以链路聚合为核心知识点,从概念定义出发,逐层拆解其底层原理、分类边界、命题陷阱与真题考法,力求让读者读完之后,面对这一考点能够做到心中有数、下笔有据。
链路聚合(Link Aggregation)是指将两台设备之间的多条物理以太网链路捆绑在一起,在逻辑上抽象成一条链路来使用的一组技术。被捆绑的多个物理端口共同组成一个链路聚合组(Link Aggregation Group,简称 LAG),对上层协议而言,这个聚合组呈现为一个单一的、带宽更大的逻辑链路。链路聚合的英文标准术语来自 IEEE 802.3ad 规范,该规范后来被并入 IEEE 802.1AX,成为局域网链路聚合的正式标准。在华为设备的命令行语境中,这个逻辑链路被称为 Eth-Trunk 接口;在思科设备的语境中,则被称为 EtherChannel 或 Port-Channel。虽然不同厂商的叫法不同,但所指的技术本质完全一致,都是把若干条物理链路虚拟成一条逻辑链路。
链路聚合之所以在工程实践中被广泛采用,是因为它同时解决了两类相互关联的问题。第一类是带宽瓶颈问题,单条千兆链路在流量高峰时容易出现拥塞,而直接升级到万兆链路成本高昂,链路聚合允许工程师通过增删成员端口来平滑地调整链路总带宽,用多根千兆线缆拼出接近万兆的聚合带宽。第二类是链路可靠性问题,在未做链路聚合的场景下,两台交换机之间如果只连接一根线缆,这根线缆一旦中断,整条链路就彻底失效;而启用链路聚合之后,只要聚合组内还有至少一条活动成员链路,逻辑链路就不会中断,从而在物理层实现了链路的冗余保护。带宽提升与故障冗余这两重价值,构成了链路聚合最根本的工程意义。
理解链路聚合,首先要厘清一组容易混淆的术语。聚合接口是指逻辑上的 Eth-Trunk 接口,它自身不直接收发物理信号,而是作为承载业务的上层接口存在;成员接口是指实际被加入聚合组、负责真正收发数据帧的物理端口;活动接口是指在聚合组中处于正常工作状态、可以参与数据转发的成员接口;非活动接口则是指虽然加入了聚合组,但暂时不参与转发的成员接口。活动接口与非活动接口的划分,在动态聚合中由协议自动协商完成,在静态聚合中则主要由手工配置决定。此外还有聚合链路这一表述,用来指代由聚合接口与成员接口共同构成的逻辑通道整体。
值得注意的是,链路聚合工作在数据链路层,它对网络层及以上是完全透明的。路由器、交换机上运行的各种上层协议,看到的永远是一条逻辑链路,而不是若干条物理链路。正因如此,链路聚合不会改变生成树协议、VLAN 划分、三层路由等功能的运行逻辑,也不会带来额外的协议开销对上层造成干扰。这种透明性是链路聚合能够被广泛应用的前提,也是理解后续负载分担、故障切换等机制时必须牢记的基础。把握住"物理多链路、逻辑单链路"这一核心抽象,就抓住了整个链路聚合知识体系的总纲。
链路聚合的实现,首先依赖于一个严谨的成员端口约束规则。并不是任意几个端口随便捆在一起就能形成聚合组,聚合组成员端口必须满足一系列一致性条件。具体而言,成员端口的速率必须相同,双工模式必须一致,端口的类型(比如同为接入端口或同为汇聚端口)必须一致,端口上配置的 VLAN 属性也必须兼容。如果两个端口的速率不一致,比如一个是千兆端口、一个是百兆端口,把它们加入同一个聚合组会导致转发行为不可预期;如果双工模式不一致,一个全双工、一个半双工,也会造成协议状态混乱。这些约束的实质,是为了保证聚合组内部所有成员链路在转发能力上完全对等,从而使上层能够以一种均匀、确定的方式把流量分摊到各条成员链路上。
聚合组建立之后,还涉及一个最大活动链路数(Maximum Active Links)的概念。在一些设备上,聚合组允许加入的成员端口数量可以多于实际参与转发的活动端口数量,超出部分作为备份端口处于非活动状态。这样设计的用意在于,当某条活动链路发生故障时,备份链路可以快速顶上,缩短故障切换时间。不同厂商对最大活动链路数的默认值和可配置范围有所差异,但"活动端口负责转发、非活动端口作为备份"这一基本逻辑是一致的。掌握这一机制,对理解动态聚合中端口角色的切换至关重要。
链路聚合提升带宽的机制,并非简单的带宽算术相加,而是依赖一套负载分担算法。当一台交换机需要通过聚合链路发送数据帧时,它会根据预先设定的负载分担方式,对数据帧的某些字段进行哈希运算,再根据哈希结果把数据帧分发到某一条具体的成员链路上。可选的负载分担字段包括源 MAC 地址、目的 MAC 地址、源 IP 地址、目的 IP 地址、源和目的 MAC 地址的组合、源和目的 IP 地址的组合等。默认情况下,很多设备采用基于源和目的 MAC 地址的负载分担方式。
这里有一个极其关键、也是命题人反复设置陷阱的地方:负载分担算法是以"数据流"为单位进行分摊的,而不是以"数据帧"为单位进行轮询。同一条数据流,由于其在负载分担字段上的取值相同,经过哈希运算后会被固定映射到同一条成员链路上。这意味着,一条单一的数据流无论流量有多大,它在任何时刻都只能走聚合组中的一条物理链路,而不可能同时占用多条物理链路。举例来说,一台服务器与一台客户端之间建立的单条 TCP 连接,其所有数据帧的源和目的 IP、源和目的 MAC 都完全相同,因此哈希结果恒定,这条连接的全部流量只会经过一条成员链路,实际可用带宽上限就是单条成员链路的带宽。只有在聚合链路上同时存在多条不同特征的数据流时,这些数据流才会被分摊到不同的成员链路上,聚合带宽的叠加效应才会显现出来。这个"单流不叠加、多流才分摊"的原理,是理解链路聚合价值的核心,也是考生最容易失分的认知盲区。
静态聚合之外,链路聚合还有一种基于协议动态协商的实现方式,其核心是链路聚合控制协议(Link Aggregation Control Protocol,简称 LACP)。LACP 定义在 IEEE 802.3ad 中,它通过在两台设备之间交互链路聚合控制协议数据单元(LACPDU)报文,来实现聚合组的自动建立、成员端口的动态管理以及故障的自动检测。与静态聚合依赖人工配置不同,动态聚合能够自动感知链路状态变化,当某条成员链路中断时,LACP 会通过报文交互及时发现并将该链路从聚合组中剔除,从而避免数据被发送到已经失效的链路上造成丢包。
LACP 的协商过程涉及系统优先级和端口优先级两个关键参数。每台运行 LACP 的设备都有一个系统优先级(LACP System Priority),默认值通常是 32768,数值越小优先级越高。在两端设备建立动态聚合时,系统优先级较高的那一端会被选举为主动端(Actor),负责决定哪些端口成为活动端口;系统优先级较低的一端则成为被动端。当系统优先级相同时,再比较设备的 MAC 地址,MAC 地址较小的一方成为主动端。在主动端内部,各成员端口又通过端口优先级(Port Priority)进行排序,端口优先级数值越小越优先,优先级的端口更容易被选为活动端口。这一套选举机制,保证了动态聚合组在两端配置存在差异时,依然能够以一种确定的方式协商出统一的活动端口集合。此外,LACP 还定义了主动模式和被动模式两种端口角色,主动模式端口会主动发送 LACPDU 报文发起协商,被动模式端口则只在收到对端报文后才响应,两者的区别直接决定了链路能否顺利建立。
按照聚合组的建立方式,链路聚合可以分为静态聚合和动态聚合两大类。静态聚合也称为手动模式聚合,它不运行任何协商协议,完全依靠管理员在两台设备上手工配置来完成。管理员需要手动指定哪些端口加入聚合组,并手工配置负载分担方式,设备之间不交互任何聚合相关的控制报文。静态聚合的优点是配置简单、行为可预期,不依赖协议协商,对两端设备的厂商和型号没有额外要
本篇完!