Http3 支持
1.功能描述
HTTP3 相关协议主要包括 QUIC 协议(RFC 9000, RFC 9001, RFC 9002 RFC 9221 RFC 8899). 具体的HTTP/3 (RFC 9114), 以及QPACK (RFC 9204). 这些协议在阿里巴巴的xquic项目的doc下有翻译成中文的协议,不过版本不是最新的。还可以参考深入剖析HTTP3协议。
目前在nginx1.25.0中,已经支持http3/quic协议了,不过NINGX宣称目前对HTTP3的支持还是实验性的。
对比之前的quic分支,去除了server端push的功能,原因是浏览器(chrome)中去除了对这个功能的支持。此外还去除了stream的quic支持,开发者说可能会考虑在以后再加回来,之前开发主要是调试quic协议。
QUIC(Quick UDP Internet Connection)是谷歌推出的一套基于UDP的传输协议,它实现了TCP + HTTPS + HTTP/2的功能,目的是保证可靠性的同时降低网络延迟。因为UDP是一个简单传输协议,基于UDP可以摆脱TCP传输确认、重传慢启动等因素,建立安全连接只需要一的个往返时间,它还实现了HTTP/2多路复用、头部压缩等功能。
众所周知UDP比TCP传输速度快,TCP是可靠协议,但是代价是双方确认数据而衍生的一系列消耗。其次TCP是系统内核实现的,如果升级TCP协议,就得让用户升级系统,这个的门槛比较高,而QUIC在UDP基础上由客户端自由发挥,只要有服务器能对接就可以。
2.指令说明
开启、关闭http3功能。
Syntax: | http3 on | off; |
---|---|
Default: | http3 on; |
Context: | http, server |
开启、关闭对QUIC协议对HTTP/0.9功能的支持。
Syntax: | http3_hq on | off; |
---|---|
Default: | http3_hq off; |
Context: | http, server |
设置在一个Connection内允许的请求stream数目最大值
Syntax: | http3_max_concurrent_streams number; |
---|---|
Default: | http3_max_concurrent_streams 128; |
Context: | http, server |
设置在读写QUIC streams时的缓冲区大小
Syntax: | http3_stream_buffer_size size; |
---|---|
Default: | http3_stream_buffer_size 64k; |
Context: | http, server |
设置在Server端保存客户端Cid数目的最大值
Syntax: | quic_active_connection_id_limit number; |
---|---|
Default: | quic_active_connection_id_limit 2; |
Context: | http, server |
开启、关闭ebpf支持
本功能只在 Linux 5.7+ 以上内核版本中支持
Syntax: | quic_bpf on | off; |
---|---|
Default: | quic_bpf off; |
Context: | main |
开启关闭GSO功能
本功能只在支持UDP_SEGMENT功能的Linux(>= 4.18)版本中支持
Syntax: | quic_gso on | off; |
---|---|
Default: | quic_gso off; |
Context: | http, server |
设置host_key文件
设置文件保存在加密状态重置(encrypt stateless reset)及地址验证令牌(address validation tokens)过程中要用到的密钥。缺省情况下,这个密钥会随机产生。
Syntax: | quic_host_key file; |
---|---|
Default: | ——; |
Context: | http, server |
开启关闭地址验证QUIC Address Validation特性
本特性主要用来是防止流量放大攻击。地址验证在连接建立期间和连接迁移期间进行。
Syntax: | quic_retry on | off; |
---|---|
Default: | quic_retry off; |
Context: | http, server |
3.配置样例
njet.conf:
helper broker modules/njt_helper_broker_module.so conf/mqtt.conf;
helper ctrl modules/njt_helper_ctrl_module.so conf/njet_ctrl.conf;
load_module modules/njt_http_split_clients_2_module.so;
load_module modules/njt_agent_dynlog_module.so;
load_module modules/njt_http_location_module.so;
load_module modules/njt_http_dyn_bwlist_module.so;
load_module modules/njt_dyn_ssl_module.so;
load_module modules/njt_http_vtsc_module.so;
cluster_name helper;
node_name node1;
worker_processes auto;
error_log logs/error.log info;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
server_name localhost;
# 为实现更佳的兼容性,建议对QUIC和TCP采用相同的端口号
listen 8443 quic reuseport; # QUIC
listen 8443 ssl; # TCP
ssl_certificate /home/njet/test_http3/9521264_www.tmlake.com.pem;
ssl_certificate_key /home/njet/test_http3/9521264_www.tmlake.com.key;
# ssl_protocols TLSv1.1;
ssl_protocols TLSv1.3;
location / {
add_header Alt-Svc 'h3=":$server_port"; ma=86400';
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
4.调用样例
在centos7下的http3测试工具可从Gitee https://gitee.com/njet-rd/http3-tools)下载
4.1 基于curl_http3 测试HTTP3
curl-http3 -vs -D/dev/stdout -o/dev/null --http3 https://quic.nginx.org
* processing: https://quic.nginx.org
* Trying 35.214.218.230:443...
* CAfile: /etc/pki/tls/certs/ca-bundle.crt
* CApath: none
* Trying 35.214.218.230:443...
......
> Accept: */*
>
< HTTP/3 200
HTTP/3 200
......
4.2 基于hey进行压测
hey -n 10 -c 5 -h3 https://quic.nginx.org
Summary:
Total: 5.8759 secs
Slowest: 3.9820 secs
Fastest: 0.5170 secs
Average: 1.7755 secs
Requests/sec: 1.7019
Total data: 25190 bytes
Size/request: 2519 bytes
Response time histogram:
0.517 [1] |■■■■■■■■■■■■■
0.863 [1] |■■■■■■■■■■■■■
1.210 [1] |■■■■■■■■■■■■■
1.556 [2] |■■■■■■■■■■■■■■■■■■■■■■■■■■■
1.903 [3] |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
2.250 [0] |
2.596 [0] |
2.943 [0] |
3.289 [1] |■■■■■■■■■■■■■
3.636 [0] |
3.982 [1] |■■■■■■■■■■■■
......
4.3 基于浏览器访问HTTP3
在浏览器输入 https://www.tmlake.com:8443/