关于QUIC-HTTP/3你需要知道的一切

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-testhttps://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, 转载需注明原文链接。谢谢!

7 thoughts on “关于QUIC-HTTP/3你需要知道的一切”

  1. 问下,curl好像支持quic,但是只看到linux上的,windows上的libcurl.dll没看到有支持quic协议的

    Reply

Leave a Comment