一次完整的HTTP/2通信

最后更新于:2022-04-02 01:04:02

## **一次完整的HTTP/2通信** ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2015-10-27_562ee2cab79a3.jpg) 1. 在尚未知道服务器是否支持HTTP/2时,http请求头部加上upgrade: h2c,表明客户端支持HTTP/2,询问服务器要不要切换协议。 2. 浏览器同时发送HTTP2-Settings头部,带上base64编码的SETTINGS frame。 3. 对于https请求,是在TLS握手时进行协商,浏览器发送ClientHello时,带上h2标志,表明客户端支持HTTP/2。 4. 若服务器不支持,则忽略upgrade头部,正常响应。若支持,则发送101响应,以空行结束响应,并开始发送HTTP/2帧。 5. 服务器要先响应connection preface,带上SETTINGS frame。 6. 服务器创建新流,推送a.js。然后继续发送index.html和a.js的response header、response body。 7. 浏览器收到PUSH_PROMISE帧,发现服务器要推送的内容已经在浏览器缓存里了,遂发送RST_STREAM拒绝推送。 8. 服务器收到RST_STREAM后,不再推送a.js剩下的数据。 9. 服务器因为一些原因想要关闭连接,发送GOAWAY帧。也可以由浏览器关闭,只要浏览器觉得之后不再有请求了。
';