在說HTTP/2伺服器推送之前首先我們要知道,HTTP/2被設計成解決HTTP/1.x的許多缺陷。當代網頁使用了許多資源:HTML、樣式表、腳本、圖片等等。在HTTP/1.x中這些資源每一個都必須明確地請求。這可能是一個很慢的過程。所以瀏覽器從取得HTML開始,然後在它解析和評估頁面的時候,增量地取得更多的資源。因為伺服器必須等待瀏覽器做每個請求,網路經常是空閒的和未充分使用的。
為了改善延遲,HTTP/2引入了server push,它允許服務端推送資源給瀏覽器,在瀏覽器明確地要求之前。一個伺服器經常知道一個頁面需要很多附加資源,在它回應瀏覽器第一個請求的時候,可以開始推送這些資源。這允許服務端去完全充分地利用一個可能空閒的網絡,改善頁面載入時間。
serverpush.svg.png
在協定層,HTTP/2 server push被push_promise 幀所驅動,一個PUSH_PROMISE描述了一個請求,即服務端預測瀏覽器將馬上要發出的請求。瀏覽器一收到PUSH_PROMISE,它馬上知道服務端將要傳輸這個資源。如果瀏覽器後續發現它需要這個資源,它會等待這個推送完成,而不是發送一個新的請求。這減少了瀏覽器花在網路等待上的時間 。
net/http套件中的服務端推送
go1.8引入了來自http.Server對推送回應的支援。如果執行的server是一個HTTP/2的服務,而進來的連線是使用HTTP/2的時候,這個特性是可用的。在任一HTTP handler中,你可以判斷http.ResponseWriter是否支援服務端推送,透過檢查它是否實作了新的http.Pusher介面。
例如,如果server知道app.js將要被要求來渲染頁面,如果http.Pusher可用,handler可以初始化一個push。
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { if pusher, ok := w.(http.Pusher); ok { // Push is supported. if err := pusher.Push("/app.js", nil); err != nil { log.Printf("Failed to push: %v", err) } } // ... })
相信看了以上介紹你已經掌握了方法,更多精彩請關注php中文網其它相關文章!
相關閱讀:
#以上是關於HTTP/2伺服器推送的詳細內容。更多資訊請關注PHP中文網其他相關文章!