原创 网站如何开启 HTTP/2
HTTP/2是什么?
在 RFC 9113 HTTP/2新窗口打开 介绍了 HTTP/2: 通过引入字段压缩和允许在同一连接上进行多个并发交换,使网络资源得到更有效的利用,并减少了延迟。
This specification describes an optimized expression of the semantics of the Hypertext Transfer Protocol (HTTP), referred to as HTTP version 2 (HTTP/2). HTTP/2 enables a more efficient use of network resources and a reduced latency by introducing field compression and allowing multiple concurrent exchanges on the same connection.
This document obsoletes RFCs 7540 and 8740.
在之前的 RFC 7540 Hypertext Transfer Protocol Version 2 (HTTP/2)新窗口打开 可以找到 Frame Format
4.1. Frame Format
All frames begin with a fixed 9-octet header followed by a variable-
length payload.
+-----------------------------------------------+
| Length (24) |
+---------------+---------------+---------------+
| Type (8) | Flags (8) |
+-+-------------+---------------+-------------------------------+
|R| Stream Identifier (31) |
+=+=============================================================+
| Frame Payload (0...) ...
+---------------------------------------------------------------+
Figure 1: Frame Layout
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
客户端如何检测 HTTP/2
CURL
查看 Response Header 来确认服务器支持的 HTTP 的版本。
$ curl -I https://ipw.cn
HTTP/2 200
server: nginx
content-type: text/html
accept-ranges: bytes
content-length: 11710
strict-transport-security: max-age=16070400;
2
3
4
5
6
7
HTTP/2 需要客户端和服务端都支持,一般浏览器都支持。
从 CURL 的官方文档新窗口打开 可以支持 curl 7.47.0 才支持 HTTP/2 访问。
Since 7.47.0, the curl tool enables HTTP/2 by default for HTTPS connections.
Chrome
在审查模式中,切换到 Network Tab
,列表页中增加 Protocol
一列,访问支持 HTTP2 的页面,可以看到值为 h2
Wireshark 抓取并分析 HTTP2协议
HTTP2 位于 TLS 协议之上,消息会被加密,需要把通信的 Pre-Master-Secret
打印出来,并被 Wireshark 读取,以便 Wireshark 能解开被 TLS 加密的上层 HTTP2 协议。
以 macOS 系统为例。
打印 Pre-Master-Secret
mkdir -p ~/tls
echo -e "\nexport SSLKEYLOGFILE=~/tls/sslkeylog.log"
souce ~/.bash_profile
2
3
设置 Wireshark TLS 协议读取 Pre-Master-Secret
在 Wireshark Preferences 的 Protocols 中找到 TLS,做如下配置:
启动 Chrome
退出 Chrome,在刚才的终端中打开 Chrome,确保能加载到上面的环境变量。
open /Applications/Google\ Chrome.app
开启 Wireshark 抓包
可以看到建立了 TLS1.3 的链接后,就开始 HTTP2 的协议通信。
- Chrome 请求首页
Stream ID = 1,这也是与 HTTP/1.1 最大的区别,是流,而不是 文本。
- 服务端返回首页
Stream ID = 1
Nginx 开启 HTTP/2
从 Nginx 官网 Module ngx_http_v2_module新窗口打开 可以了解到 Nginx 从 1.9.5 版本开始支持 HTTP/2。
目前主流发行版中的 Nginx 默认支持 HTTP2,自行编译可加上 --with-http_v2_module
参数。
The ngx_http_v2_module module (1.9.5) provides support for HTTP/2 and supersedes the ngx_http_spdy_module module.
This module is not built by default, it should be enabled with the --with-http_v2_module configuration parameter.
执行命令 nginx -V
看编译参数中是否带 --with-http_v2_module
来确认 Nginx 是否已经支持 HTTP2
开启 HTTP2的前提是开启 SSL,只需要在 ssl 后面加上 http2 即可。
server {
listen 443 ssl http2;
ssl_certificate server.crt;
ssl_certificate_key server.key;
}
2
3
4
5
6
具体示例详见 Nginx 开启 IPv6
IPv6工具箱 小程序 和 iOS App
小程序
微信扫一扫,唤起小程序
你也可以复制小程序短链接,发送给任意一个微信好友,在聊天对话框中打开该短链接即可唤起小程序。
#小程序://IPv6工具箱/U1R4edQusuF2zpa
注:如果你觉得这个小程序还不错,欢迎在微信搜一搜中搜索 IPv6工具箱
并给予评价,你的鼓励是本站前进的动力😘!
苹果 iOS App
如果你正在使用 iPhone 打开本站,可点击 IPv6工具箱新窗口打开 快速进入 App Store 下载 App,当然你也可以使用微信扫描下方二维码。
注:如果你觉得这个 App 还不错,欢迎在 App Store新窗口打开 轻点评分+评论,你的鼓励是本站前进的动力!😘