做者:楊志曉html
a.HTTP創建在TCP協議之上。瀏覽器
b.HTTP/0.9 於1991年發佈。安全
c.HTTP/1.0 於1996年發佈。服務器
d.HTTP/1.1 於1999年發佈。網絡
e.HTTP/2 於2015年發佈。session
a.工做原理如圖:
2_1.jpg
多線程
b.每次與服務器交互,都須要新開一個鏈接!app
2_2.jpg
dom
c.抓包分析:tcp
demo:4張圖片+html總共5個請求
2_3.jpg
2_4.jpg
每一條tcp連接都會直接返回connection close
試想一下:請求一張圖片,新開一個鏈接,請求一個CSS文件,新開一個鏈接,請求一個JS文件,新開一個鏈接。HTTP協議是基於TCP的,TCP每次都要通過三次握手,四次揮手,慢啓動...這都須要去消耗咱們很是多的資源的!
a.相對於持久化鏈接還有另外比較重要的改動:
b.工做原理如圖:
只創建一條tcp連接,可是每一個請求都是串行的,以下圖所示
2_5.jpg
c.對上面同一個demo 在開啓keep-alive後進行抓包分析:(4張圖片+html總共5個請求)
2_6.jpg
5個請求發起一條tcp鏈接
2_7.jpg
d.圖片增長後抓包以下(開啓keep-alive):
2_8.jpg
e.經過增長圖片個數抓包後發現,瀏覽器同時創建了6條tcp鏈接,觀察瀏覽器網絡請求加載圖以下:
2_9.jpg
f.http1.1 支持pipelining(流水線) 條件是:sever端須要支持,同時瀏覽器也要開啓,工做原理以下圖:
2_10.jpg
HTTP Pipelining實際上是把多個HTTP請求放到一個TCP鏈接中一一發送,而在發送過程當中不須要等待服務器對前一個請求的響應;只不過,客戶端仍是要按照發送請求的順序來接收響應!
g.查詢了 火狐瀏覽器開啓pipelining方法:
在搜索欄輸入 network.http.pipelining ,查詢一下,若是沒有,請右擊鼠標,選擇「新建」——布爾,而後輸入 network.http.pipelining ,賦值true,而後點擊肯定。
解釋:激活這個鍵值以後,Pipelining同時發出成倍數的鏈接請求,從而達到提高鏈接速度的效果。網絡上的大多數網站都是基於HTTP協議,而HTTP1.1能夠支持多線程的鏈接請求,經過這個操做能夠減小Firefox載入網頁的時間。
h.總結:http1.x問題:
在HTTP1.0中,發送一次請求時,須要等待服務端響應了才能夠繼續發送請求。
在HTTP1.1中,發送一次請求時,不須要等待服務端響應了就能夠發送請求了,可是回送數據給客戶端的時候,客戶端仍是須要按照響應的順序來一一接收
因此說,不管是HTTP1.0仍是HTTP1.1提出了Pipelining理論,仍是會出現阻塞的狀況。從專業的名詞上說這種狀況,叫作線頭阻塞(Head of line blocking)簡稱:HOLB
a.SSL(Secure Sockets Layer) 安全套接層,是一種安全協議,經歷了 SSL 1.0、2.0、3.0 版本後發展成了標準安全協議 - TLS(Transport Layer Security) 傳輸層安全性協議。TLS 有 1.0 (RFC 2246)、1.1(RFC 4346)、1.2(RFC 5246)、1.3(RFC 8446) 版本。
TLS 在實現上分爲 記錄層 和 握手層 兩層,其中握手層又含四個子協議: 握手協議 (handshake protocol)、更改加密規範協議 (change cipher spec protocol)、應用數據協議 (application data protocol) 和警告協議 (alert protocol)
2_11.jpg
HTTPS = HTTP over TLS.
b.抓包分析:
ClientHello
2_12.jpg
c.繪製流程圖以下:
2_13.jpg
d.HTTP2與HTTP1.1最重要的區別就是解決了線頭阻塞的問題!其中最重要的改動是:多路複用 (Multiplexing)
如圖所示:
2_14.jpg
e.HTTP2全部性能加強的核心在於新的二進制分幀層(再也不以文本格式來傳輸了),它定義瞭如何封裝http消息並在客戶端與服務器之間傳輸。
2_15.jpg
f.看上去協議的格式和HTTP1.x徹底不一樣了,實際上HTTP2並無改變HTTP1.x的語義,只是把原來HTTP1.x的header和body部分用frame從新封裝了一層而已
2_16.jpg
g.問題:被封裝後,不用每次攜帶header,可是header裏這個body的長度,這怎麼處理呢?
方法:body上加上length解決
Headers Frame: 幀頭
2_17.jpg
h.問題一:body分了許多個strem,怎麼肯定完結?
抓包分析:
2_18.jpg
2_19.jpg
2_20.png
分了三個包分別爲:8192+8192+5281
當前看到的是分包後,最大的包大小是 8192
展現圖以下:
2_21.jpg
i.問題二:怎麼肯定沒丟包,錯沒錯,秩序亂沒亂,怎麼合包
tcp會保證包有序,而且保證了不會丟包
HTTP2全部性能加強的核心在於新的二進制分幀層(再也不以文本格式來傳輸了),它定義瞭如何封裝http消息並在客戶端與服務器之間傳輸。
j.抓包分析請求:
2_22.jpg
觀察http2的瀏覽器網絡請求加載圖以下:
2_23.jpg
2_24.jpg