QUIC – HTTP/3是下一代HTTP技术。众所周知,现在,大部分网站都已经使用了HTTP/2替代第一代HTTP。作为第二代HTTP技术,HTTP/2采用多路复用,使得它比第一代HTTP有更快的速度,且可以降低带宽占用。
然而,TCP协议的局限性导致了HTTP/2无法解决队头阻塞的问题。在丢包率很高的网络环境中,HTTP/2的表现甚至不及第一代HTTP. (https://http3-explained.haxx.se/en/why-quic/why-tcphol)
QUIC (Quick UDP Internet Connections)的出现解决了这一难题。QUIC是基于UDP在用户空间实现的协议,它具有更高的可靠性,更好的安全性,以及显著更快的速度。
而HTTP第三代,HTTP/3 (HTTP-over-QUIC),就是QUIC技术的第一个实现。
今天,我们就介绍如何在各服务器上开启QUIC-HTTP/3,怎样使用支持QUIC-HTTP/3的浏览器,以及怎样判断服务器是否开启QUIC-HTTP/3。本文还将介绍一些其他关于QUIC – HTTP/3的信息,比如CDN, 开启UDP支持等等。本文作者为香菇肥牛,原文链接为https://qing.su/article/157.html, 转载需注明原文链接。谢谢!
使用QUIC-HTTP/3, 需要服务端和客户端的共同支持,两者缺一不可。当前,大部分服务器均可以开启HTTP/3了,可惜只有少部分客户端浏览器支持。我们希望不久的将来,HTTP/3能够得到更好的客户端支持。我们先介绍服务端。
1. 如何在服务器上开启QUIC – HTTP/3
(1) Apache
Apache是世界上用户量最大的服务器程序。很遗憾,Apache至今仍不支持QUIC – HTTP/3. 因此,目前没有办法在Apache上开启QUIC. 如果您使用的是Apache且希望开启QUIC, 建议您无缝切换到Litespeed/OpenLitespeed.
(2) Litespeed/OpenLitespeed
如果您使用的是Litespeed或者OpenLitespeed, 那么HTTP/3已经默认开启了,您不需要任何操作即可使用下一代QUIC-HTTP/3技术。
不过,如果您实在不想启用QUIC, 想要关闭HTTP/3的话也是可以的。在您的Litespeed虚拟主机配置文件中添加下面这两行:
1 2 3 | <IfModule LiteSpeed> QuicEnable off </IfModule> |
然后重启LSWS即可。
1 | /usr/local/lsws/bin/lswsctrl restart |
参考文献: https://docs.litespeedtech.com/cp/cpanel/quic-http3/
(3) Nginx
Nginx没有官方支持QUIC – HTTP/3. 但是,CloudFlare开发了一个Nginx-QUIC补丁,您可以手动编译该Nginx实现QUIC-HTTP/3.
该项目的Github地址:https://github.com/cloudflare/quiche
首先,下载Nginx和Quiche:
1 2 3 | wget https://nginx.org/download/nginx-1.16.1.tar.gz tar zxvf nginx-1.16.1.tar.gz git clone --recursive https://github.com/cloudflare/quiche |
然后,给nginx打Quiche补丁
1 2 | cd nginx-1.16.1 patch -p01 < ../quiche/extras/nginx/nginx-1.16.patch |
接下来就可以编译安装Nginx了:
1 2 | ./configure --prefix=$PWD --build="quiche-$(git --git-dir=../quiche/.git rev-parse --short HEAD)" --with-http_ssl_module --with-http_v2_module --with-http_v3_module --with-openssl=../quiche/deps/boringssl --with-quiche=../quiche make |
安装完毕后,查看nginx版本(nginx -V):
1 2 | nginx version: nginx/1.16.1 (quiche-a0e69ed) built with OpenSSL 1.1.0 (compatible; BoringSSL) (running with BoringSSL) |
如果看到quiche-xxxxxxx的字样说明编译安装成功。
安装好Nginx之后,我们还需要在虚拟主机配置文件中开启QUIC-HTTP/3. 下面是一个范例nginx配置文件,请参考添加到您目前的虚拟主机配置文件中。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | events { worker_connections 1024; } http { server { listen 443 quic reuseport; listen 443 ssl http2; ssl_certificate cert.crt; ssl_certificate_key cert.key; ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; proxy_request_buffering off; add_header alt-svc 'h3-27=":443"; ma=86400'; } } |
(4) Caddy
Caddy是近年来热门的轻量Web服务器之一。从Caddy 2版本开始,已经官方支持了QUIC. 因此,我们只需在服务器中开启QUIC-HTTP/3即可。
在Caddy配置文件Caddyfile头部添加下面的行:
1 2 3 | { experimental_http3 } |
然后重启Caddy即可。
https://ma.ttias.be/how-run-http-3-with-caddy-2/
(5) 其他服务器
这里有一个Go实现的QUIC-HTTP/3.
https://github.com/lucas-clemente/quic-go
如果您还知道有其他的HTTP/3实现,欢迎在评论中列出。
2. 使用支持QUIC – HTTP/3的浏览器
目前,只有两款浏览器支持HTTP/3, Chrome Canary和Firefox Nightly, 且两款浏览器均需修改默认设定。
如果您使用Chrome Canary, 则需配置chrome://flags/, 搜索QUIC和TLS 1.3,并开启对应的Flag.
如果您使用客户端,则需要配置about:config, 将network.http.http3.enabled项的值改为true, 然后重启浏览器。
3. 判断网站是否支持QUIC – HTTP/3
有很多种方法可以判断一个网站的服务器是否开启了QUIC-HTTP/3的支持。我们介绍两种方法。
(1) 使用浏览器
如果您使用Chrome Canary, 则可以打开审查元素,找到Network然后刷新网页,则可以在Protocol栏目中看到网站传输网页使用的协议,如下图。
可以看到,我们的博客大部分内容都是通过”http/2+quic/46″协议传输的,这就说明是开启了HTTP/3. 图中有部分js和css文件的协议值为”h2″,说明这几个文件是通过HTTP/2传输的,这是因为我们采用JSDelivr CDN来分发一些JS/CSS文件,而JSDelivr还没有支持HTTP/3.
如果您使用Firefox Nightly, 也可以通过类似方式查看。
(2) 使用测试网站
目前,有两个网站可以用来测试我们的网站是否支持QUIC-HTTP/3。
这两个网站分别是https://gf.dev/http3-test和https://http3check.net/
输入您的域名之后即可获得QUIC-HTTP/3检测结果。下图是这个博客的检测结果,可以看到,我们的博客支持QUIC-HTTP/3.
您还可以通过使用curl命令的方式测试QUIC支持。不过,curl只有最新的部分版本支持QUIC-HTTP/3, 因此需要手动编译安装,而手动编译半天仅仅为了做这么一个小小的测试,我觉得不太值得,因此就不在这里介绍了,大家直接用上面的网站测试就好。
4. 其他
(1) CDN
如果您的服务器不支持QUIC而且暂时没有办法开启,但你又希望能够给访客提供HTTP3,那么您可以使用支持QUIC-HTTP/3的CDN服务。目前,市面上比较有名的支持QUIC-HTTP/3的CDN服务有两家,第一个是大名鼎鼎的CloudFlare, 第二个是Quic.cloud.
需要注意的是,虽然这两个CDN在节点和客户端之间都支持QUIC-HTTP/3传输,但是CloudFlare和服务器之间的传输只能通过HTTP/1.1进行,而Quic.cloud和服务器之间的传输也可以通过QUIC-HTTP/3传输。因此,如果您的服务器自身也支持QUIC-HTTP/3, 那么quic.cloud能够完美地在您的服务器–CDN节点–客户端浏览器之间进行传输。
(2) UDP
前面说过,QUIC-HTTP/3是基于UDP协议的,因此您需要开放服务器的UDP 443端口。我们可以使用iptables开放443端口。
1 2 3 | iptables -I INPUT -p udp --dport 443 -j ACCEPT service iptables save service iptables restart |
设置好之后,您可以检测一下自己的UDP 443端口是否开放。在本地电脑上,执行下面的命令:
1 | nc -v -u 88.88.88.88 443 |
其中,88.88.88.88为您的服务器IP地址。若收到类似下面的回显,则说明进入服务器的UDP443端口开放了。
1 | Connection to 88.88.88.88 443 port [udp/*] succeeded! |
我们再测试一下出服务器的UDP 443端口。在您的服务器上执行下面的命令:
1 | nc -v -u google.com 443 |
如果收到类似下面的回显,说明设置成功。
1 | Connection to google.com 443 port [udp/*] succeeded! |
至此,我们详细介绍了如何分别在服务端和客户端开启QUIC-HTTP/3实现下一代高速HTTP. 如果您有任何疑问,欢迎在这里留言与我讨论。本文作者为香菇肥牛,原文链接为https://qing.su/article/157.html, 转载需注明原文链接。谢谢!
大佬威武
感谢大佬支持
问下,curl好像支持quic,但是只看到linux上的,windows上的libcurl.dll没看到有支持quic协议的
可以带参数编译curl, 这样就支持quic了
就是编译不了,编译支持quic协议的libcurl.dll时,需要好像要加这个 –with-quiche= ,这个没有windows的
嗯,看了下他们的Github repo, 好像确实不支持 https://github.com/curl/curl-for-win