## **一次完整的HTTP/2通信**

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幀。也可以由瀏覽器關閉,只要瀏覽器覺得之后不再有請求了。