https://my729.github.io/blog/internetwork/http%E7%89%88%E6%9C%AC%E5%8C%BA%E5%88%AB.htmlhtml
對於無狀態的特性能夠藉助cookie/session機制來作身份認證和狀態記錄git
無鏈接致使的性能缺陷有兩種:github
1. 沒法複用鏈接
每次發送請求,都須要進行一次tcp鏈接(即3次握手4次揮手),使得網絡的利用率很是低瀏覽器
2. 隊頭阻塞
http1.0規定在前一個請求響應到達以後下一個請求才能發送,若是前一個阻塞,後面的請求也給阻塞的緩存
爲了解決http1.0的性能缺陷,http1.1出現了服務器
http1.1特性:cookie
http1.1默認保持長鏈接,數據傳輸完成保持tcp鏈接不斷開,繼續用這個通道傳輸數據網絡
基於長鏈接的基礎,咱們先看沒有管道化請求響應:session
tcp沒有斷開,用的同一個通道tcp
請求1 > 響應1 --> 請求2 > 響應2 --> 請求3 > 響應3
管道化的請求響應:
請求1 --> 請求2 --> 請求3 > 響應1 --> 響應2 --> 響應3
即便服務器先準備好響應2,也是按照請求順序先返回響應1
雖然管道化,能夠一次發送多個請求,可是響應還是順序返回,仍然沒法解決隊頭阻塞的問題
當瀏覽器請求資源時,先看是否有緩存的資源,若是有緩存,直接取,不會再發請求,若是沒有緩存,則發送請求
經過設置字段cache-control來控制
在上傳/下載資源時,若是資源過大,將其分割爲多個部分,分別上傳/下載,若是遇到網絡故障,能夠從已經上傳/下載好的地方繼續請求,不用從頭開始,提升效率
在 Header 裏兩個參數實現的,客戶端發請求時對應的是 Range 服務器端響應時對應的是 Content-Range
將全部傳輸的信息分割爲更小的消息和幀,並對它們採用二進制格式的編碼
基於二進制分幀,在同一域名下全部訪問都是從同一個tcp鏈接中走,http消息被分解爲獨立的幀,亂序發送,服務端根據標識符和首部將消息從新組裝起來