$bytes_sent仅统计响应体原始字节数,HTTP/2下不包含帧头、HPACK压缩、TLS开销等;HTTP/3下因QUIC/UDP封装完全失效;真实传输量需分层监控:浏览器transferSize、网卡TX字节数、QUIC metrics或eBPF捕获。

$bytes_sent 是 Nginx 日志变量,表示服务器向客户端实际发送的响应体字节数(不含响应头)。但它在 HTTP/2 和 HTTP/3 场景下不能直接反映“真实传输字节数”,原因在于协议层的封装、压缩、帧开销和连接复用机制。要准确监控真实传输量,需分层理解并组合指标。
HTTP/2 下 $bytes_sent 的局限与补充方式
HTTP/2 基于 TCP,但引入了二进制帧、头部压缩(HPACK)、多路复用等特性:
-
$bytes_sent仅统计应用层响应体原始字节(如 HTML、JSON 内容长度),不包括:- HTTP/2 帧头(9 字节 per DATA/HEADERS frame)
- HPACK 动态表编码后的头部字节(可能远小于明文 header)
- TCP/IP 协议栈的包头(IP + TCP,通常 40–60 字节/segment)
- TLS 加密开销(如 AEAD nonce、tag,约 16–32 字节/record)
实际网络中传输的字节数 ≈
$bytes_sent+ 帧封装开销 + TLS record 开销 + TCP segmentation overhead。
实用建议:
- 启用 Nginx 的
http_v2模块日志变量(如$http2可确认是否为 HTTP/2 连接); - 使用
nginx-module-vts或nginx-plus的实时连接统计,获取sent字段(含帧和 header 封装后 TCP 层发送字节数); - 结合系统级工具抓包验证:
tcpdump -i any 'tcp port 443 and (tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x16030100)' -w http2.pcap # 然后用 Wireshark 查看 TLS 应用数据(即 HTTP/2 流)的总 TCP payload 长度
HTTP/3 下 $bytes_sent 完全失效的原因
HTTP/3 运行在 QUIC(UDP)之上,Nginx 当前(截至 2026 年)原生不支持 HTTP/3;主流支持需依赖 quiche(Cloudflare)或 nginx-quic 补丁版,且其日志模块未暴露 QUIC 层传输字节数。
关键差异:
-
$bytes_sent仍是应用层响应体长度,与 QUIC 无关; - 真实传输发生在 UDP 数据报中,每个 QUIC packet 包含:
- UDP header(8 字节)
- QUIC long/short header(可变,通常 12–24 字节)
- 加密 payload(含 STREAM frames、ACK frames、CRYPTO frames 等)
- 同一 HTTP/3 连接可并发多个 stream,每个 stream 的 DATA frame 独立加密、分片、重传 ——
$bytes_sent无法映射到任一 packet。
可行监控路径:
- 使用支持 QUIC 的服务端(如
Caddy 2.8+或LiteSpeed Web Server),启用其内置 QUIC metrics:quic_bytes_sent_totalquic_packets_sent_totalquic_stream_bytes_sent_total
- 若用 Nginx + quiche 补丁,可通过
ngx_http_quic_module的共享内存 zone 导出quic_sent_bytes计数器(需自定义 log_format 引用); - 在内核层用
eBPF工具(如bpftrace)捕获 UDP socket 发送字节数:bpftrace -e 'kprobe:udp_sendmsg { printf("UDP send %d bytes to %s:%d\n", arg2, ntop(((struct sockaddr_in*)arg3)->sin_addr), ntohs(((struct sockaddr_in*)arg3)->sin_port)); }'
更贴近“真实传输”的替代方案
与其依赖 $bytes_sent,不如按目标分层选择:
-
想评估用户侧加载性能? → 监控浏览器
PerformanceResourceTiming.encodedBodySize(含压缩后响应体)和transferSize(实际网络接收字节数,Chrome/Firefox 支持); -
想统计服务端出口带宽? → 直接采集网卡 TX 字节数(
/sys/class/net/eth0/statistics/tx_bytes),或使用iftop -P udp/nethogs; -
想调试协议效率? → 用
quic-trace(Cloudflare)或qlog格式分析 QUIC trace,提取metrics.total_bytes_sent; -
想做计费或限流? → 在应用层埋点,记录
response.body.length(原始) + 预估压缩率(如 gzip 通常 30%~70% 压缩比) + 固定帧开销(HTTP/2 约 +5%,HTTP/3 约 +8~12%)。
不复杂但容易忽略。











