System & Services 进阶 20m
用 L4S 降低网络延迟
Reduce network delays with L4S
2023年6月5日
一句话判断
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