## **一次完整的HTTP/2通信**
![](https://box.kancloud.cn/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帧。也可以由浏览器关闭,只要浏览器觉得之后不再有请求了。