HTTP - 發展歷程

web項目開發中,咱們經過http來傳輸數據,這裏咱們來看一下,http是什麼以及發展歷程。css

what

HTTP,超文本傳輸協議。html

在咱們很是頁面的開發中,用來傳輸html、css、js、圖片、cgi等。git

HTTP 0.9

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

HTTP 1.0

正式的版本是HTTP 1.0web

請求:請求版本 + 首部瀏覽器

響應:響應狀態 + 首部(響應對象能夠包含任何類型:html、純文本、圖片等)服務器

HTTP 1.1

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

持久連接

1.1的持久連接能夠說是1.1的一大特點。socket

在1.0中,每次http連接都要進行tcp的三次握手和四次揮手。若是說請求很少的話,影響卻是不大,可是請求多的話,那麼請求的總時間就會大大延長。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

相關文章
相關標籤/搜索