无损网络与流控概念

无损网络:PFC 信用流控 这些概念是什么意思?

是什么约束导致我们要引入无损网络,无损网络会带来什么问题?

了解Go-Back-N,选择性重传,乱序重排的概念

1/1
Reasoning Process
无损网络包括PFC、信用型流量控制、无损以太网等,特别适用于低丢包、低延迟的环境如RDMA RoCE。RoCEv2使用UDP,丢包通过重试和ACK/NACK处理,但会增加延迟。RDMA要求按顺序交付,NIC小重组缓冲区,丢包触发重试定时器,可能导致超时错误。无损网络面临头阻塞、死锁、暂停风暴、调优复杂性等问题。
1/1
已思考 7s
1/1

无损网络里常见的两种“流控”概念

1) PFC(Priority Flow Control,优先级流控)

  • 本质:按优先级(802.1p PCP)发送“暂停/恢复”信号,让对端在某个优先级上暂时别发了。
  • 作用范围:一跳(hop-by-hop)。A 交换机对 B 交换机/主机发 Pause,只影响这一段链路上的发送。
  • 目标:在交换机/网卡的队列要溢出(会丢包)之前,把上游“按优先级按住”,从而做到该优先级近似不丢包(lossless class)。
  • 特点:不是全链路无损,只是通过逐跳暂停把丢包概率压到很低;配置阈值很关键(何时 Pause、Pause 多久、何时恢复)。

2) 信用流控(Credit-based Flow Control)

  • 本质:用“信用/配额”精确表示下游还有多少缓冲可接收;上游只有在“还有信用”时才能发送。
  • 作用范围:通常也是逐跳(InfiniBand 里非常典型),它比 PFC 更“精确”:
  • PFC 更像“红绿灯”:到阈值就刹车/放行
  • 信用流控更像“通行证计数”:你有几张票就只能走几辆车
  • 优点:更不容易靠“猜阈值”工作;理论上更稳。
  • 缺点:实现成本和协议/硬件复杂度更高,以太网传统上不是这样设计的,所以数据中心以太网常见的是 PFC + 一堆配套机制(ECN/DCQCN 等)。

是什么约束导致要引入“无损网络”?

核心约束不是“必须绝对零丢包”,而是:某些上层/端侧协议在丢包时的代价太高,尤其是 RDMA(比如 RoCEv2 的 RC 语义):

  1. 端侧重传/恢复代价高,尾延迟放大
  • 丢一个包会触发端到端的重传与等待,延迟可能从微秒级直接变成毫秒级(看超时、拥塞、队列和重传策略)。
  • 对分布式存储、KV、训练参数同步这类“同步点”场景,尾延迟会被放大成整体吞吐下降。
  1. RDMA 的传输语义常要求“按序、可靠”
  • 例如 RC 类连接强调按序语义;发生丢包会卡住后续数据的交付(即使后面的包到了也可能先不能“交付给上层语义”)。
  • 于是大家倾向于:宁可网络里暂停一下,也别丢,避免进入“重传/超时/恢复”的慢路径。
  1. 数据中心流量容易出现微突发(microburst)
  • Incast(多发一收)或聚合交换机口瞬间队列爆掉非常常见。
  • 不做无损/不做拥塞控制时,丢包会频繁发生,尾延迟很难看。

无损网络会带来什么问题?

无损网络的代价非常现实,典型问题包括:

  1. Head-of-Line Blocking(队头阻塞)
  • PFC 是“按优先级暂停一整条队列/类流量”,队列里前面某个流/某段路径堵了,会把后面本来不该受影响的也一起挡住
  • 结果是“局部拥塞 → 扩散成更大范围的停顿”。
  1. 拥塞扩散(congestion spreading)与 Pause Storm
  • 下游满了对上游 Pause,上游又因为队列堆积继续 Pause 更上游……
  • 可能形成一连串暂停,表现像“网络突然整体变慢”。
  1. 死锁风险(deadlock)
  • 多个方向的流互相占着对方需要的缓冲,PFC 又让彼此都停住,可能出现循环等待。
  • 这就是为什么无损网络往往必须配套:合理的队列隔离、拓扑/路由约束、以及拥塞控制(比如 ECN 标记 + 端侧限速)。
  1. 部署与调参复杂
  • PFC 阈值、缓冲切分、优先级映射、ECN 门限、速率算法要协同;稍有不当就会“要么丢包,要么全网 Pause”。
  • 并且无损类流量可能“挤压”有损类流量,造成不公平。

一句话:无损把“丢包问题”换成了“暂停传播、调参复杂、全局稳定性”的系统问题


Go-Back-N、选择性重传、乱序重排:概念与对比

这些都是可靠传输里处理丢包/乱序的经典机制。

1) Go-Back-N(GBN,回退 N 帧)

  • 发送方维护一个滑动窗口,连续发包。
  • 如果丢了序号 k 的包:
  • 接收方通常只“按序接收”,k 后面的就算到了也先不收/不交付(或丢弃)。
  • 发送方超时后会从 k 开始把后面一串都重传
  • 优点:实现简单(接收端不用缓存太多乱序包)。
  • 缺点:在丢包率不低或窗口大时,浪费带宽,尾延迟也会变差。

2) 选择性重传(Selective Repeat / SACK 思想)

  • 丢了序号 k 的包:
  • 接收方可以缓存 k 后面先到的包(乱序缓存)。
  • 通过 ACK/SACK 告诉发送方“哪些收到了、缺哪些”,发送方只重传缺的。
  • 优点:更高效,重传更少。
  • 缺点:接收端需要乱序缓存、发送端逻辑更复杂。

3) 乱序重排(Reordering)

  • “乱序”指包到达顺序和发送顺序不一致(多路径 ECMP、交换路径变化、队列差异都可能导致)。
  • “重排”就是接收端把乱序到达的包先缓存起来,等缺口补齐,再按序交付给上层。
  • 关键点:乱序缓存需要内存/缓冲;缓存太小会导致丢弃/退化;缓存太大又增加成本和时延抖动。

如果你把这些放到同一张图里理解:

  • PFC/信用流控:尽量让“丢包”别发生(把问题前移到队列/暂停)。
  • GBN/选择性重传/重排:丢包或乱序已经发生时,端侧怎么用协议把可靠性补回来(但通常会放大尾延迟)。
1/1

微突发 多发一收 这些都是什么?是由什么引起的?

1/1

微突发(Microburst)

微突发指的是在数据中心网络中,短时间内非常大量的数据流量涌入某一网络端口,导致该端口的缓冲区瞬间被填满,从而产生严重的网络拥塞,通常持续时间极短,可能只有几毫秒到几十毫秒。

产生的原因:

  1. 短时间内的大量请求:多个节点同时向同一个目标节点发送大量数据。例如,多个服务器同时向同一个交换机端口发送大量请求。
  2. 流量模式不均匀:数据流量在短时间内急剧增加,超过了网络链路的瞬时处理能力,但过了一会儿,流量又恢复正常。这种突发流量不会持续很长时间,难以通过常规拥塞控制机制(如基于流量平均的管理)来有效缓解。
  3. 高带宽需求的应用:一些应用(如大规模数据同步、批量处理、大数据分析等)可能会导致短时间内大规模的数据传输,产生突发流量。

影响:

  • 会导致网络交换机端口缓冲区溢出,发生数据丢失。
  • 可能触发网络中的拥塞控制机制(如PFC),导致其他流量被暂停,影响其他通信。

多发一收(Incast)

**多发一收(Incast)**指的是一种典型的网络拥塞情况,通常发生在数据中心环境中,当多个源节点(通常是多个服务器)同时向一个目标节点发送数据时,目标节点的网络链路可能瞬间被大量的并发请求填满,导致目标节点接收数据的吞吐量出现瓶颈。

产生的原因:

  1. 多源并发请求:多个计算节点同时发送大量数据到同一台接收节点。例如,在分布式存储系统中,多个存储节点会同时向单一的目标节点(比如存储系统的控制节点)发送大量请求。
  2. 目标节点吞吐量不足:目标节点的网络接口或端口带宽不足,无法处理来自多个源节点的并发请求,导致数据包丢失或排队。
  3. TCP 拥塞控制机制:多发一收容易引发TCP协议中的拥塞控制机制,因为如果目标节点的接收缓冲区满了,会触发丢包,进而导致重传和延迟。

影响:

  • 丢包:网络拥塞导致的队列溢出,可能导致数据包丢失。
  • 延迟增加:数据丢失和重传机制导致的延迟增加。
  • 吞吐量下降:目标节点可能无法及时处理来自多个源节点的数据请求,导致吞吐量急剧下降。

总结:

  1. 微突发是短时间内流量集中出现的现象,通常由多个节点的请求突然增加,导致端口瞬间饱和。
  2. 多发一收则是多个源节点向单一目标节点发送大量数据时发生的拥塞现象,目标节点的带宽或缓冲区无法应对并发的请求,进而发生丢包、重传等问题。

这两种现象都属于网络中突发流量带来的问题,并且都可能引起网络链路的拥塞丢包,对数据传输的性能和稳定性产生严重影响。

1/1

简明地总结我们上面遇到的所有问题与概念。我既不是在考试,也不是在面试,我是在学习

1/1

下面把我们一路提到的概念按“从目标→机制→副作用→端侧可靠性”串起来,尽量用一套一致的视角。

你在解决的核心问题

数据中心里,短时拥塞很常见;对 RDMA 这类对丢包/恢复很敏感的业务来说,丢包会把尾延迟放大。
于是出现两条路线:

  • 尽量不丢(lossless / 近似无损):用链路层/交换机机制把包“按住”
  • 允许丢但要优雅恢复(lossy + 拥塞控制 + 重传):让端侧更好地适应

流量为什么会突然堵住

微突发(microburst)

极短时间(微秒~毫秒级)内到达某个端口的瞬时速率 超过端口线速,队列一下被灌满。

典型诱因:

  • 多个发送端“同步”地放量(应用层同步点、RPC fan-in)
  • 交换机出端口速率瓶颈(多入一出)
  • 发送端 pacing 不足、突发聚合

多发一收(incast)

多个发送端同时给一个接收端/同一出端口发,接收端口或交换机出端口成为瓶颈,常伴随微突发,是 microburst 的常见场景来源之一。


“无损网络”是什么,为啥要它

无损网络(lossless class)

不是全网“绝对不丢”,而是:对某个业务优先级(priority)尽量避免因队列溢出而丢包,让它走“快路径”,避免进入“重传/超时”的慢路径。

为什么 RDMA 更在意丢包

  • 可靠/有序语义(比如 RC)下,丢包会触发恢复流程
  • 端侧恢复(超时、重传、乱序处理)会明显放大尾延迟
  • 数据中心微突发频繁 → 丢包并不罕见 → 性能不稳定

关键机制:流控与拥塞控制

PAUSE(以太网暂停帧)

最早的链路层暂停:让对端“别发了”。通常是整口暂停,粒度粗。

PFC(Priority Flow Control)

PAUSE 的升级版:按优先级暂停(某个 priority 暂停,别的还能发)。
特点:逐跳(hop-by-hop),靠阈值触发(队列快满就 pause,上游停发)。

信用流控(credit-based flow control)

更“精确”的逐跳流控:下游给上游发“还能收多少”的信用,上游按信用发。
在 IB 很典型;以太网生态里更多见的是 PFC。

ECN(Explicit Congestion Notification)

拥塞标记而不是丢包:交换机在队列超过阈值时给包打标记,接收端把标记反馈给发送端,让发送端降速。

DCQCN(RoCE 常见)

一种结合 ECN 标记 + 端侧速率调节 的拥塞控制方案,用来减少队列增长、降低触发 PFC 的概率,避免“全网暂停”。

直觉:PFC 是“刹车”,ECN/DCQCN 是“提前松油门”。


无损网络带来的典型问题

HOL Blocking(队头阻塞)

同一队列/同一优先级里,前面的流被堵住,会把后面本来没问题的也一起拖住。

拥塞扩散(congestion spreading)

下游 pause 上游,上游排队又 pause 更上游,拥塞从局部扩散成更大范围的停顿。

死锁风险(deadlock)

多方向流互相占着缓冲,大家又被 PFC 暂停,可能形成循环等待(网络“僵住”)。

所以无损网络通常需要:队列隔离、合理阈值、拥塞控制(ECN/DCQCN)、以及小心的拓扑/路由与缓冲规划。


RDMA 里你遇到的协议/端侧概念

RDMA 的收益与约束(相对 TCP/IP)

  • 收益:内核旁路、零拷贝/少拷贝、低 CPU、低延迟、尾延迟更好(在网络稳定时)
  • 约束:内存注册/页固定、权限与 rkey/lkey、QP 语义、对网络更敏感(丢包/乱序/拥塞更“伤”)

QP(Queue Pair)

RDMA 通信端点(发送队列 SQ + 接收队列 RQ),很多可靠/有序语义在 QP 层实现。

post RECV / message passing

两边要先准备接收缓冲(post RECV),发送是“两边协作”的消息语义;对比 one-sided 是远端内存读写语义。

QP 超时重传

可靠语义下丢包/ACK 缺失会触发超时,进入重传/恢复;这就是“丢包导致尾延迟爆炸”的常见来源。


可靠传输的三个经典概念(你提到的)

Go-Back-N(回退 N 帧)

丢一个包,后面一串一起重传;实现简单但浪费带宽、延迟抖动大。

选择性重传(Selective Repeat / SACK 思想)

只重传丢的;需要乱序缓存与更复杂的确认信息。

乱序重排(reordering & reassembly)

包可能乱序到达,接收端需要缓存并按序交付;缓存不足会退化(丢/等待),缓存过大有成本与时延抖动。


一句话把全链路串起来

微突发/多发一收 → 交换机队列暴涨 →(要么丢包,要么 PFC 暂停)→ 丢包会触发端侧重传/重排/超时(尾延迟变差)→ 所以用 ECN/DCQCN 这类拥塞控制尽量“少 pause、少丢包”,但无损机制本身会带来 HOL、扩散、死锁与运维复杂度。

如果你接下来要继续学,我建议按这个顺序:
队列与突发 → PFC/缓冲阈值 → ECN 标记与端侧降速 → RDMA 端侧可靠性(QP/重传/乱序)→ 再回头理解 HOL/扩散/死锁为什么出现。

1/1