HTTP2 协议协商机制
1. HTTP Upgrade 机制
服务端支持 HTTP/2,那就可以回应 101 状态码及对应头部,并且在响应正文中可以直接使用 HTTP/2 二进制帧:
- 客户端发起的协议升级请求中,必须通过 HTTP2-Settings 指定一个经过 Base64 编码过的 HTTP/2 SETTINGS 帧;
- 服务端同意协议升级,响应正文中必须包含 HTTP/2 SETTING 帧(二进制格式,不需要 Base64 编码);
- 客户端可以开始发送各种 HTTP/2 帧,但第一个帧必须是 Magic 帧(内容固定为 PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n),做为协议升级的最终确认;
HTTP/2 协议本身并没有要求它必须基于 HTTPS(TLS)部署
HTTPS 传输的数据对中间节点保密,所以它具有更好的连通性。基于 HTTPS 部署的新协议具有更高的连接成功率;
2. 应用层协议协商
基于 HTTPS 的协议协商非常简单,多了 TLS 之后,双方必须等到成功建立 TLS 连接之后才能发送应用数据。而要建立 TLS 连接,本来就要进行 CipherSuite 等参数的协商。引入 HTTP/2 之后,需要做的只是在原本的协商机制中把对 HTTP 协议的协商(ALPN,Application Layer Protocol Negotiation,应用层协议协商)加进去。
客户端在建立 TLS 连接的 Client Hello 握手中,通过 ALPN 扩展(非证书扩展)列出了自己支持的各种应用层协议。其中,HTTP/2 协议名称是 h2。