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的請求佇列,是一個先進先出的佇列,在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