mod_http3 v0.0.72 已新增到 CodeIT 仓库。这些软件包适用于 RHEL、CentOS、AlmaLinux、Rocky Linux 和 Oracle Linux 7、8、9 和 10,以及 Ubuntu 22.04 和 24.04。
主要变更:
- 在 Linux 上,使用 ListenCoresBucketsRatio 时,父进程为每个 listener bucket 绑定一个 SO_REUSEPORT QUIC socket,并由一个子进程来服务,因此会有多个子进程为 HTTP/3 提供服务。子进程启动和停止期间这些 socket 仍保持绑定状态,因此内核会让每个对端始终使用同一个 socket。
- 在 Linux 上,父进程会在仍以 root 运行时完成 QUIC socket 的绑定,因此 H3Port 443 可在不使用 CAP_NET_BIND_SERVICE 的情况下工作。该 socket 在 graceful restarts 期间保持绑定状态;子进程会继承它,并且一次只由一个子进程来服务它。
- Linux:发往单个对端的 QUIC 包现在会通过一次 sendmsg 携带 UDP_SEGMENT(GSO)发出,读取使用 UDP_GRO。若内核不支持,则模块一次只发送一个包。现在进行的 stream 读取会一次性发送新的 flow-control 窗口,因此被阻塞的客户端不会等待。
- 新增了对 H3MaxWindow 的支持(默认 6 MiB)。当客户端在几个 round trips 内将其填满时,客户端上传的 flow-control 窗口会增长,直到达到该上限,因此长且高速路径上的上传不再被固定在 1 MiB 的窗口大小上。
- 新增了对 H3EarlyData 的支持(默认关闭)。恢复会话的客户端可以将其首个请求作为 0-RTT data 发送,并在提前一个 round trip 的时间内获得响应。握手完成之前只会执行安全的方法;其他方法会等待其完成,因为 0-RTT data 可能会被重放(RFC 8470)。
- 将 QUIC 传输从 OpenSSL QUIC server 移到 ngtcp2,同时通过其 QUIC TLS API 使用 OpenSSL 作为 TLS 后端。OpenSSL 仍会丢弃服务端侧的 0-RTT 数据包。ngtcp2 >= 1.25.0 成为新的构建依赖项(WITH_NGTCP2)。stream 数据不再被复制:当对端确认接收后,nghttp3 会释放缓冲区。H3IdleTimeout 现在始终以 NO_ERROR 关闭;QUIC 空闲计时器会比原来多运行 2 秒,并静默关闭。
