3. 流控机制概述:流控的作用、常见流控协议简介

3.1 为什么需要流控:从“发送方想发”到“接收方能用”

在无损网络中,流控(Flow Control)解决的是一个看似简单却极其关键的问题:发送方想发数据,但接收方不一定来得及处理。如果发送方持续以线速向接收方推送报文,而接收方的处理能力、缓冲区深度或下游链路带宽不足,数据就会在接收端堆积,最终导致缓冲区溢出、报文丢弃。

传统TCP网络允许丢包,并通过重传机制恢复。但无损网络(如RoCEv2、FC、InfiniBand)要求零丢包,因为即使极小的丢包率也会引发TCP全局同步、RDMA重传风暴,使实际吞吐量断崖式下降。因此,无损网络必须依赖链路级或端到端的流控机制,在缓冲区尚未溢出之前,主动让发送方“踩刹车”。

流控的本质可以概括为三个层次:

  • 防溢出:通过反馈信号限制发送速率,避免接收端缓冲区溢出;
  • 保公平:多个流共享链路时,避免某个流独占带宽导致其他流饥饿;
  • 提效率:在无损前提下,尽可能提高链路利用率,减少因流控造成的空转等待。
关键认知:流控不是“越严越好”。过于激进的流控会导致链路利用率下降、时延增大;过于宽松则会导致缓冲区溢出。参数调优的目标是在“零丢包”和“高利用率”之间找到平衡点。

3.2 三种主流流控协议:PFC、ECN、QCN

当前无损网络中应用最广泛的流控协议主要有三种:PFC(Priority Flow Control,优先级流控)、ECN(Explicit Congestion Notification,显式拥塞通知)和QCN(Quantized Congestion Notification,量化拥塞通知)。它们作用层次不同、机制不同、适用场景也不同。

协议 作用层次 触发方式 反馈对象 典型场景
PFC 链路层(L2) 接收端缓冲区超过阈值 直接上游交换机/网卡 RoCEv2无损网络、FC存储网络
ECN 网络层(L3) 交换机队列深度超过阈值 发送端(通过ACK标记) TCP/IP网络、RoCEv2(配合DCQCN)
QCN 链路层/端到端 交换机采样报文并计算速率偏差 发送端(通过CNM报文) 数据中心以太网(较少单独使用)

3.2.1 PFC:逐跳的“暂停/恢复”机制

PFC是IEEE 802.1Qbb标准定义的链路层流控机制。它将物理链路划分为8个优先级队列,每个队列独立进行流控。当接收端某个优先级的缓冲区占用超过设定的XOFF阈值时,接收端会向对端发送一个PFC暂停帧(Pause Frame),携带对应的优先级位图,请求对端暂停发送该优先级的数据。当缓冲区占用回落到XON阈值以下时,接收端发送恢复帧,对端继续发送。

PFC的关键参数包括:

  • XOFF阈值:触发暂停的缓冲区占用水位;
  • XON阈值:解除暂停的水位;
  • 暂停时间(Pause Quanta):暂停帧中指示的暂停时长,单位是512比特时间。
# 示例:在交换机接口上查看PFC统计(NVIDIA/Cisco风格)
switch# show interface ethernet 1/1 priority-flow-control
Interface: Ethernet1/1
  PFC Mode: On
  Priority 3: XOFF=120KB, XON=80KB, Tx Pause Frames=1523, Rx Pause Frames=0
  Priority 4: XOFF=120KB, XON=80KB, Tx Pause Frames=0, Rx Pause Frames=0
PFC的隐患:PFC是逐跳机制,如果配置不当(如XOFF阈值过高),可能造成拥塞在链路中“蔓延”——上游交换机缓冲区被填满后,继续向上游发送暂停帧,最终导致拥塞树(Congestion Tree)扩散到整个网络,甚至引发“PFC死锁”。

3.2.2 ECN:端到端的“标记-反馈”机制

ECN是IP层和传输层配合的拥塞通知机制(RFC 3168)。交换机在检测到队列深度超过ECN阈值时,不再丢弃报文,而是在IP头中标记CE(Congestion Experienced)位。接收端收到带CE标记的报文后,在TCP ACK中设置ECE(ECN-Echo)标志,发送端据此降低发送速率(通常通过减少拥塞窗口)。

在RoCEv2无损网络中,ECN通常与DCQCN(Data Center Quantized Congestion Notification)算法配合使用。DCQCN在发送端维护一个速率衰减因子,收到ECN反馈后按比例降速,并通过定时器逐渐恢复速率。

ECN的关键参数包括:

  • ECN阈值(Kmin/Kmax):队列深度的低/高水位,超过Kmin开始标记,超过Kmax全部标记;
  • 标记概率:在Kmin到Kmax之间,按比例或随机标记;
  • 反馈延迟:从发送到收到ECN反馈的RTT时间。
# 查看ECN标记统计(Linux网卡)
ethtool -S enp3s0 | grep -i ecn
     rx_ecn_marked: 2341
     tx_ecn_marked: 0

3.2.3 QCN:基于采样的“速率调节”机制

QCN是IEEE 802.1Qau标准定义的链路层拥塞通知机制,主要面向数据中心以太网。QCN的独特之处在于:交换机不是通过队列深度触发,而是通过概率采样的方式,对经过的报文进行采样,并计算当前速率与期望速率的偏差。当偏差超过阈值时,交换机生成一个CNM(Congestion Notification Message)报文,直接发送给报文的源发送端。发送端收到CNM后,按照量化步长降低发送速率,并通过定时器逐渐恢复。

QCN相比PFC的优势在于:它是端到端的反馈,不会造成逐跳的拥塞蔓延;相比ECN的优势在于:它不需要传输层配合,直接作用于发送端网卡。但QCN的部署复杂度较高,且对交换机采样精度要求高,目前在实际数据中心中应用较少,更多被DCQCN(基于ECN)取代。

3.3 三种流控机制的关系与协同

在实际无损网络中,PFC、ECN、QCN并非互斥,而是常常协同工作。以典型的RoCEv2无损网络为例:

  1. ECN负责“远距离”拥塞通知:当核心交换机队列拥塞时,通过ECN标记通知发送端降速,这是第一道防线;
  2. PFC负责“最后一公里”的缓冲保护:当接收端或边缘交换机缓冲区仍然面临溢出风险时,PFC暂停帧作为兜底机制,防止丢包;
  3. QCN(如使用):在部分场景中替代或补充ECN,提供更精细的速率控制。
PFC / ECN / QCN 协同工作示意图 发送端 (服务器网卡) RoCEv2 / TCP 接入交换机 队列深度检测 ECN标记 / PFC暂停 缓冲区阈值管理 核心交换机 拥塞检测 ECN标记(Kmin/Kmax) QCN采样(可选) 接收端 服务器 数据 数据 数据 ECN反馈(ACK+ECE)→ 发送端降速 PFC暂停帧(XOFF/XON) QCN CNM报文(采样触发) 图例与说明 数据报文正向传输 ECN反馈:接收端→发送端,通知降速(端到端) PFC暂停帧:交换机→上游设备,逐跳暂停 QCN CNM:交换机→发送端,采样触发降速 注:实际部署中,ECN+PFC组合最常见,QCN较少单独使用

3.4 典型场景:RoCEv2无损网络中三种机制的分工

以RoCEv2(RDMA over Converged Ethernet version 2)为例,这是当前AI训练、HPC集群中最常见的无损网络场景。其流控体系通常采用DCQCN(Data Center Quantized Congestion Notification)算法,该算法正是ECN与PFC的有机结合:

  • ECN负责“粗粒度”的端到端拥塞控制:核心交换机检测到队列拥塞后,在RoCEv2报文IP头中标记CE位。接收端网卡收到CE标记后,在CNP(Congestion Notification Packet)报文中反馈给发送端。发送端收到CNP后,按照DCQCN算法将发送速率减半(或按比例降低),并通过定时器逐渐恢复。
  • PFC负责“细粒度”的链路保护:当ECN反馈来不及生效(例如瞬时突发流量),接收端或边缘交换机的缓冲区即将溢出时,PFC暂停帧立即生效,暂停对应优先级的报文发送,确保不丢包。
  • QCN在RoCEv2中较少使用:因为DCQCN已经提供了更优的端到端速率控制,QCN的逐跳采样机制反而增加了交换机负担。
参数冲突的根源:PFC的XOFF/XON阈值、ECN的Kmin/Kmax阈值、DCQCN的降速因子和恢复定时器,这些参数之间存在耦合关系。例如:如果ECN阈值设置过高,拥塞信号反馈太慢,PFC就会频繁触发,导致链路利用率下降;如果PFC的XOFF阈值设置过低,缓冲区过早触发暂停,可能造成链路空转。本课程后续章节将详细分析这些参数冲突的诊断与修复方法。

3.5 常见误区与复盘

误区一:认为PFC可以完全替代ECN。PFC只能防止丢包,但不能消除拥塞。如果网络中只有PFC而没有ECN,拥塞会沿着链路逐跳向上游蔓延,最终导致“拥塞树”扩散到整个网络,甚至引发PFC死锁(多个交换机互相等待对方释放缓冲区)。ECN的价值在于从源头让发送端降速,从而真正缓解拥塞。
误区二:ECN阈值设置越小越好。ECN阈值(Kmin)设置过小,交换机会过早标记CE,导致发送端频繁降速,链路利用率下降;设置过大,则拥塞信号反馈太慢,PFC被迫频繁介入。实际调优中,Kmin通常设置为“带宽时延积(BDP)”的50%~100%,需要结合具体流量模型反复测试。
误区三:忽略PFC暂停帧的“风暴”效应。当PFC暂停帧在多个接口之间反复触发时,可能形成“PFC震荡”——发送端频繁暂停/恢复,导致吞吐量剧烈波动。此时需要检查是否存在ECN阈值与PFC阈值之间的“空隙”过大,或者是否存在多对一(Incast)流量模式。

3.6 本节小结

流控是无损网络的“交通警察”,PFC、ECN、QCN是三种核心的流控协议。PFC工作在链路层,通过暂停帧逐跳保护缓冲区;ECN工作在网络层,通过标记和反馈实现端到端拥塞控制;QCN通过采样和CNM报文实现精细速率调节。在实际部署中,ECN+PFC的组合(如DCQCN)最为常见,而QCN的应用相对较少。理解这三种机制的工作原理、参数含义和协同关系,是后续诊断流控参数冲突的基础。