Reduce network delays with L4S
System & Services 进阶 20m

用 L4S 降低网络延迟

Reduce network delays with L4S

2023年6月5日

在 Apple 官方观看视频

一句话判断

L4S 能在拥挤网络中将视频通话的延迟降低 50%、丢包率降到接近零——如果你的 app 涉及实时通信,这个技术必须了解。

这场 Session 讲了什么

L4S(Low Latency, Low Loss, Scalable throughput)是一种大幅改善实时应用网络性能的技术。在拥挤的网络环境下,L4S 可以显著降低延迟、减少丢包、提高视频质量。

L4S 的工作原理涉及客户端、服务器和瓶颈路由器的协作。支持 L4S 的发送方使用 ECN(Explicit Congestion Notification)标记 IP 包头来声明合作意愿。当瓶颈处开始排队时,L4S 队列管理通过设置不同的 ECN 标签通知拥塞。接收方统计拥塞标记数量并反馈给发送方,发送方据此调整发送速率。

对于使用 URLSession 和 Network framework 的 app,如果使用 HTTP/3 或 QUIC,L4S 自动支持,无需代码改动。使用 HTTP/2 或 TCP 的下载在 iOS 17 和 macOS Sonoma 中也内置了 L4S 支持。

实际测试数据令人印象深刻:在最坏情况下延迟降低 50%(45ms 到 25ms),丢包率从 40% 降到接近零,视频卡顿几乎完全消除。

值得深挖的点

对于自定义协议,需要实现几个关键行为:可扩展的拥塞控制算法、ECN 验证机制(检测网络是否正确传递 ECN 标记)和拥塞反馈的中继机制。Network framework 的 ECN 属性可以在包元数据上发送和接收 ECN 标志。

服务端的 L4S 支持是启用整个链条的关键。你需要配置服务器使用支持 L4S 的拥塞控制算法,并正确设置 ECN 标记。

代码片段

// 使用 URLSession/Network framework 自动获得 L4S 支持
// HTTP/3 或 QUIC: 自动支持,无需代码改动
let session = URLSession(configuration: .default)
// 使用 HTTP/3 的请求自动启用 L4S

// 使用 Network framework 的自定义协议
// 通过 packet metadata 的 ECN 属性发送和接收 ECN 标志
let metadata = NWPacketMetadata()
metadata.ecn = .enableECT0 // 声明 L4S 支持

// 接收时检查 ECN 标记
// 根据 CE 标记数量调整发送速率
L4S 网络配置清单:

1. 客户端(自动支持)
   - 使用 URLSession 或 Network framework
   - HTTP/3/QUIC: 零代码改动
   - HTTP/2/TCP 下载: iOS 17/macOS Sonoma 自动支持

2. 服务端
   - 启用 L4S 拥塞控制
   - 正确设置 ECN 标记

3. 网络设备
   - 配置 L4S 队列管理
   - 支持双队列(L4S 和传统流量分离)

最佳实践

  • 使用 URLSession 或 Network framework 以自动获得 L4S 支持
  • 优先使用 HTTP/3 或 QUIC 协议
  • 自定义协议需要实现可扩展拥塞控制算法
  • 服务端配置是启用 L4S 的关键
  • 网络设备需要支持双队列区分 L4S 和传统流量

还有什么值得关注

  • RFC 9330 是 L4S 的标准参考文档
  • 测试 L4S 效果需要配置受限网络环境
  • L4S 对视频通话、游戏、协作工具等实时应用效果最显著
  • 传统流量和 L4S 流量在网络设备上使用不同的队列
WWDC 2023