点赞
评论
收藏
分享
举报
NGINX 中 QUIC 流量控制的提升与优化
发表于2026-02-11 17:00

浏览 745

文章标签

原文作者:Roman Arutyunyan - F5 Principal engineer
原文链接:NGINX 中 QUIC 流量控制的提升与优化
转载来源:NGINX 中文社区

NGINX 唯一中文官方社区 ,尽在 nginx.org.cn



想象一下,在繁忙的高速公路上,车辆在高峰时段挤进有限的车道。这与计算机网络中,过多数据同时传输的情况类似。就像交通堵塞一样,网络拥堵会显著减慢数据传输速度,而这时流量控制机制就显得尤为重要。


流量控制:确保数据流畅传输

流量控制是防止网络拥堵的关键机制,确保数据在网络中顺畅、高效地流动。每个计算机网络都有其带宽限制,如果数据同时发送过多,可能会导致数据丢失或由于重传引发延迟。为了避免网络拥堵,终端需要知道在某一时刻能传输多少数据。


为跟上 Web 性能的最新进展,NGINX 在最新版本中引入了一种新的流量控制算法——CUBIC。同时,这一版本对 QUIC 协议的实现进行了多个增强,显著提升了下载速度并修复了 BUG。


流量控制如何工作?

流量控制是 TCP 和 QUIC 协议的核心部分。这两个协议通常依赖于确认机制,接收方在成功接收数据包后会发送确认信息,表明数据已成功传输。在确认到达之前,数据包被认为是“在飞行中”。


流量控制算法通过限制“在飞行中”数据的数量来运作,这个数量限制称为拥塞窗口(CWND)。如果对端要发送数据,它要等到前一个数据包的确认到达,并且“在飞行中”的数据量降到拥塞窗口之内。


拥塞窗口从小值开始。当接收到确认后,窗口会增大,允许发送更多的“在飞行中”数据。如果拥塞窗口增长超过了网络的容量,数据包可能会丢失,导致流量控制算法减少窗口大小。


历史上的流量控制算法

最早的流量控制算法之一是 Reno 算法,它自 1980 年代以来一直是 BSD 操作系统中的基础。经过多年的改进,最终版本 NewReno 在 RFC 6585 中定义。NewReno 被认为是 QUIC 的标准流量控制算法,按照 RFC 9002 的规定,它也被实现于 NGINX,从 1.25.0 到 1.27.4 版本中。


Reno 算法的过程从连接的慢启动模式开始。在这一模式下,拥塞窗口从一个较小的值开始呈指数增长。当检测到数据包丢失时,窗口被减少一半,连接切换到拥塞避免模式。在此模式下,拥塞窗口会线性增长,直到下一次数据包丢失为止,然后窗口再次减半,整个过程重复。


为什么选择 CUBIC 流量控制?

Reno 算法的一个主要缺点是无法充分利用高速网络。Reno 使用线性函数增加拥塞窗口,而对于高速网络,这种增长可能过于缓慢。这时,CUBIC 流量控制算法就能发挥作用。


CUBIC(如 RFC 9438 中所述)在拥塞避免阶段使用立方函数,而不是线性函数。这种方法有助于更动态地管理拥塞窗口。当预计发生数据包丢失时,立方函数会减缓拥塞窗口的增长;而当数据包丢失的可能性较小时,窗口增长会加速。


在每次拥塞避免迭代开始时,拥塞窗口刚刚减少,此时数据包丢失的可能性较低。此时,立方函数会加速窗口的增长。当窗口接近之前的丢失点时,立方函数会减慢增长,以避免再次丢失。如果没有丢失,表明之前的丢失可能是偶然的,或者网络带宽有所增加,那么窗口的增长速度会再次加快。这种动态调整使得 CUBIC 能够迅速利用高速网络带宽。


大多数现代操作系统(如 Linux、FreeBSD 14.0+、MacOS 和 Windows)已经将 CUBIC 作为默认的流量控制算法。


NGINX 中流量控制的基准测试

在 NGINX 1.25.0 版本中,首次实验性地支持 QUIC,并使0用 NewReno 流量控制算法,如 RFC 9002 所述。而在 NGINX 1.27.5 版本中,CUBIC 流量控制被添加到 QUIC 中。随着这次更新,QUIC 实现也进行了多项显著改进,减少了流量控制算法的激进性,提升了数据包乱序的容忍度,并修复了 RFC 合规性问题。


这次更新带来了显著的性能提升,下面是基准测试的结果。这些测试对比了 NGINX 1.27.4 与 NGINX 1.27.5,使用 MTU 1500 的接口。


测试网络条件模拟使用了 tc-netem,配置了 6000 个数据包队列和 50ms 的延迟。这相当于 100ms 的 RTT、9M 带宽延迟产品(BDP)和 720Mbps 的带宽。


基准测试结果:


基准测试结果表明,NGINX 1.27.5 在下载速度方面有显著提升,特别是在高 BDP 环境下。这一提升得益于引入了 CUBIC 流量控制算法以及对 QUIC 实现的其他优化。



NGINX 唯一中文官方社区 ,尽在 nginx.org.cn

更多 NGINX 相关的技术干货、互动问答、系列课程、活动资源: 开源社区官网 | 微信公众号 | B 站


已修改于2026-02-11 17:00
本作品系原创
创作不易,留下一份鼓励
NGINX官方账号

暂无个人介绍

关注



写下您的评论
发表评论
全部评论(0)

按点赞数排序

按时间排序

关于作者
NGINX官方账号
这家伙很懒还未留下介绍~
331
文章
21
问答
201
粉丝
相关文章
介绍nginx网页配置工具QQ技术交流群1:1106758598QQ技术交流群2:560797506邮箱: cym1102@qq.com官网地址: http://www.nginxwebui.cn码云: https://gitee.com/cym1102/nginxWebUIgithub: https://github.com/cym1102/nginxWebUI功能特点nginxWebUI也可管理多个nginx服务器集群,随时一键切换到对应服务器上进行nginx配置,也可以一键将某台服务器配置同步到其他服务器,方便集群管理.部署此项目后,配置nginx再也不用上网各种搜索配置代码,再也不用手动申请和配置ssl证书,只需要在本项目中进行增删改查就可方便的配置和启动nginx。技术说明本项目是基于springBoot的web系统,数据库使用sqlite,因此服务器上不需要安装任何数据库项目启动时会释放一个.sqlite.db到系统用户文件夹中,注意进行备份本系统通过Let'sencrypt申请证书,使用acme.sh脚本
点赞 6
浏览 23.4k
  前三周学习了陶辉老师的“NGINX基础培训系列课程”,感觉受益良多,在这里想把一些知识点记录一下,和大家分享一下知识点,也方便日后的随手查看,温故知新。  首先,我们了解到了Nginx的版本,Nginx发布版本分为主线版本和稳定版本,区分两个版本也非常简单,主线版本版本号为单数,比如1.19,稳定版本为双数,比如1.18,今天我要说的是稳定版本,这个版本会尽量少的减少Nginx的bug问题,适用于生产环境,这里我不建议使用Nginx和其他软件一样在生产环境中落后一个或多个大版本使用,之前生产环境做过漏扫,发现我们编译自带的Nginx版本为:nginx/1.13.3(查询命令为nginx-V),结果出现了多个漏洞,四个高危和一个中危漏洞:        通过升级Nginx到稳定版最新版本后修复!  其次,是Nginx发行版本的选择,目前比较流行的有:nginx、nginxplus、Tengine、openresty、ope
点赞 1
浏览 16.8k
感谢您参加“NGINX从入门到精通进阶系列培训”!以下为培训的问答、课件和录像,希望您能通过此培训学有所得,祝学习进步!>问与答:- 基础篇+高级篇 - 应用篇+实战篇(New)>课件(PPT):基础篇:-NGINX概要、安装、配置:https://interact.f5.com/rs/653-SMC-783/images/CNFEB22-NginxCoreCourse-Setup.pdf-NGINX日志、运维:https://interact.f5.com/rs/653-SMC-783/images/cnfeb22-nginxcorecourse-maintenance.pdf高级篇:-NGINX变量、API:https://interact.f5.com/rs/653-SMC-783/images/CNFEB22-NginxCoreCourse-API.pdf-NGINXSSL、NJS:https://interact.f5.com/rs/653-SMC-783/images/CNFEB22-NginxCoreCourse-SSL.pdf
点赞 10
浏览 19.3k