HTTP - 發展歷程

寫不好程式碼的格子襯衫發表於2019-01-09

web專案開發中,我們通過http來傳輸資料,這裡我們來看一下,http是什麼以及發展歷程。

what

HTTP,超文字傳輸協議。

在我們非常頁面的開發中,用來傳輸html、css、js、圖片、cgi等。

HTTP 0.9

HTTP 0.9版本,很簡單,只有一行請求(請求方法+路徑),響應只有一個HTML。

HTTP 1.0

正式的版本是HTTP 1.0

請求:請求版本 + 首部

響應:響應狀態 + 首部(響應物件可以包含任何型別:html、純文字、圖片等)

HTTP 1.1

HTTP 1.1 是對於HTTP 1.0的優化,減少延遲。下面看下1.1增加的新功能。

持久連結

1.1的持久連結可以說是1.1的一大特色。

在1.0中,每次http連結都要進行tcp的三次握手和四次揮手。如果說請求不多的話,影響倒是不大,但是請求多的話,那麼請求的總時間就會大大延長。

於是,1.1支援了持久連結(keep-alive),第一次連結之後,如果客戶端&伺服器都沒有進行斷開的操作,那麼,tcp連結就一直保持。這樣,當http請求多的時候,自然,速度相比於1.0的話就快得多了。

我們可以抓一下掘金的請求,響應頭中可以看到,使用的是http 1.1 ,並且connection的狀態是keep-alive。

HTTP - 發展歷程

HTTP管道

http的請求佇列,是一個先進先出的佇列,在1.0的時候,這個佇列是由客戶端控制的,每次傳送請求的時候,需求等待上一個請求回包之後,再繼續發下一個請求。這樣會出現伺服器會有大部分時間是屬於空閒狀態的。

所以1.1的版本,把http請求佇列放到了伺服器,客戶端可以不用等待回包就可以繼續傳送下一個請求,伺服器直接在佇列中獲取請求,然後一個一個處理,這樣,就可以有效提升請求的效率。

使用多個tcp連結

http請求佇列的處理移動到服務端之後,確實速度可以加快,不過這也是序列的,要提升伺服器的效率,那我們需要進行並行的操作。

所以,1.1做的就是可以同時開多個tcp連結,這樣就可以做到並行啦。不過,由於瀏覽器限制,每個域名的tcp連結最多隻能開6個。

當然,如果頁面想開更多的tcp連結,也是有辦法的,tcp連結數是按域名區分的,那麼我們只要再新增域名就可以增加tcp連結數啦~

HTTP 2.0

2.0是第二個正式的版本,對1.1做了更多的優化。

二進位制分幀層

1.1版本傳輸的資料是文字,相比於文字,二進位制傳輸起來更加方便,底層不用再進行解析。

多路複用

1.1的時候,為了解決並行,開了多個tcp連結。多路服用,就是為了解決並行而出現的。

1.1傳輸的資料是文字,不能亂序傳輸,所以只能序列。

2.0傳輸的是二進位制,幀是最小的單位,這裡對幀標誌順序,既然有順序,傳輸就可以並行了,接受資料方再根據資料幀進行拼接,就可以得到正確的資訊。

於是,多路複用解決了單個tcp並行傳輸的問題。

首部壓縮

客戶端&伺服器對首部表進行儲存

第一次傳送整個首部,之後根據diff來更新diff部分的資料。

雖然首部內容不多,但是每條資料都少一點的話,世界也將更加美好。

伺服器推送

伺服器推送,有點像websocket。

當使用者請求頁面的時候,伺服器先返回html,然後客戶端再根據html解析請求需要的資源,這樣子客戶端其實要進行多個請求。

那麼伺服器推送的效果呢?當客戶端訪問html之後,伺服器就先把客戶端需要的資源傳送給客戶端,那麼,客戶端需要資源的時候,就不用傳送請求來,因為客戶端預先就拿到來資源,從而減少請求的時間。

HTTP 3.0

3.0的版本,可以說是改頭換貌。

我們知道http 2.0之前,都是基於tcp的,因為tcp穩定。

而3.0卻拋棄來tcp,擁抱udp,穩定的事情就交給上層來做,也就是quic。

這個後面再細講,先留白。

寫在最後

http無處不在,無論是開發需求也好,還是優化專案也好,都要熟悉http,才能更好的理解。

最後補充一下樓主之前的文章 HTTP1.1 vs HTTP2.0

相關文章