01.20 再談 HTTP,你還要繼續更新不?

之前的第一篇文章我介紹了關於 HTTP 的一些簡單的知識,比如說它的狀態碼,請求方式,以及 HTTP 的報文,這篇文章我將給大家帶來關於 HTTP 版本的那些問題,比如說1.0和1.1和2.0.

HTTP 的發展歷史

之前的文章直接從內容開始,那這篇文章我就先以歷史來開始,HTTP (超文本傳輸協議),在創建之初就是為了將超文本標記語言(HTML)文檔從 web 服務端傳送給瀏覽器的客戶端。隨著我們網頁內容變得複雜,不單單有文字、圖片,還有 css ,js 等等渲染,ajax 的出現、移動互聯網的高速發展,隨著時代的變遷,HTTP 也一直升級優化,豐富自己的功能特性。

HTTP 0.9

0.9協議是適用於各種數據信息的簡潔快速協議,但是遠不能滿足日益發展的各種應用的需要。0.9協議就是一個交換信息的無序協議,僅僅限於文字。由於無法進行內容的協商,在雙發的握手和協議中,並有規定雙發的內容是什麼,也就是圖片是無法顯示和處理的。

這個版本就說圖片都不能處理,那不用想,這個版本很快就被拋棄了。

HTTP 1.0

到了1.0協議階段,也就是在1982年,TimBerners-Lee 提出了 HTTP 1.0。在此後的不斷豐富和發展中,HTTP 1.0 成為最重要的面向事務的應用層協議。該協議對每一次請求/響應建立並拆除一次連接。其特點是簡單、易於管理,所以它符合了大家的需要,得到了廣泛的應用。

HTTP 1.1

在1.0協議中,雙方規定了連接方式和連接類型,這已經極大擴展了 HTTP 的領域,但對於互聯網最重要的速度和效率,並沒有太多的考慮。畢竟,作為協議的制定者,當時也沒有想到 HTTP 協議會有那麼快的普及速度。 關於 HTTP 1.1 協議的具體內容可以參考 RFC 2616。

HTTP 2.0

HTTP 2.0 的前世是 HTTP 1.0 和 HTTP 1.1。雖然之前僅僅只有兩個版本,但這兩個版本所包含的協議規範之龐大,足以讓任何一個有經驗的工程師為之頭疼。網絡協議新版本並不會馬上取代舊版本。實際上,1.0和1.1在之後很長的一段時間內一直並存,這是由於網絡基礎設施更新緩慢所決定的。

HTTP 1.0 和 HTTP 1.1 的區別

1.長連接:減少了建立和關閉連接的消耗和延遲。

HTTP 1.0 : 規定瀏覽器與服務器只保持短暫的連接,瀏覽器的每次請求都需要與服務器建立一個 TCP 連接,服務器完成請求處理後立即斷開 TCP 連接,服務器不跟蹤每個客戶也不記錄過去的請求。

HTTP 1.1 : 則支持持久連接 Persistent Connection, 並且默認使用 persistent connection。 在同一個 TCP 的連接中可以傳送多個 HTTP 請求和響應。 多個請求和響應可以重疊,多個請求和響應可以同時進行。更加多的請求頭和響應頭(比如 HTTP 1.0 沒有 host 的字段)。

2.緩存處理

HTTP 1.0 :中主要使用 header 裡的 If-Modified-Since , Expires 來做為緩存判斷的標準。

HTTP 1.1 :則引入了例如 ETag,If-None-Match 等更多可供選擇的緩存頭來控制緩存策略。

3.Host 頭處理:支持 Host 頭域,不在以 IP 為請求方標誌

HTTP 1.0 :中認為每臺服務器都綁定一個唯一的 IP 地址,因此,請求消息中的 URL 並沒有傳遞主機名。但隨著虛擬主機技術的發展,一臺服務器上可以存在多個虛擬主機,共享一個 IP 地址。

HTTP 1.1 :的請求消息和響應消息都應支持 Host 頭域,且請求消息中如果沒有 Host 頭域會報告一個錯誤(400 Bad Request )。

4.錯誤狀態碼的增多:1.1新增了24個錯誤狀態響應碼,豐富的錯誤碼更加明確各個狀態

HTTP 1.1 中新增了24個錯誤狀態響應碼,如 409(Conflict)表示請求的資源與資源的當前狀態發生衝突;410(Gone)表示服務器上的某個資源被永久性的刪除。

HTTP 1.1 和 HTTP 2.0 的區別

1.新的傳輸格式

HTTP 1.1 :使用基於文本格式

HTTP 2.0 :使用二進制格式

2.多路複用

為什麼會出現多路複用呢?那麼多路複用到底又是什麼呢?看懿來給你解析一波。

為什麼在2.0的時候會出現多路複用,那不用說,肯定1.1出問題了,HTTP 1.1 有什麼問題呢?重點:效率

HTTP 1.1 雖然解決了多次連接的問題,但是它存在一個致命的缺陷,效率低下。

  1. 串行的文件傳輸。當請求 a 文件時,b 文件只能等待,等待 a 連接到服務器、服務器處理文件、服務器返回文件,這三個步驟。我們假設這三步用時都是1秒,那麼 a 文件用時為3秒,b 文件傳輸完成用時為6秒,依此類推。(注:此項計算有一個前提條件,就是瀏覽器和服務器是單通道傳輸)
  2. 連接數過多。我們假設 Apache 設置了最大併發數為300,因為瀏覽器限制,瀏覽器發起的最大請求數為6,也就是服務器能承載的最高併發為50,當第51個人訪問時,就需要等待前面某個請求處理完成。

就這兩個問題,1.1的效率強行的被拉下來了,這時候2.0的多路複用就為解決這個問題而出現了。

說多路複用,不的不說一下1.1的持久連接,而這個持久連接,就是我們接下來所說的 Keep-Alive 。

Keep-Alive

Keep-Alive 是使用同一個 TCP 連接來發送和接收多個 HTTP 請求/應答,而不是為每一個新的請求/應答打開新的連接的方法。我們知道 HTTP 協議採用“請求-應答”模式,當使用普通模式,即非 Keep-Alive 模式時,每個請求/應答客戶和服務器都要新建一個連接,完成 之後立即斷開連接( HTTP 協議為無連接的協議);當使用 Keep-Alive 模式(又稱持久連接)時,Keep-Alive 功能使客戶端到服 務器端的連接持續有效,當出現對服務器的後繼請求時,Keep-Alive 功能避免了建立或者重新建立連接。

再談 HTTP,你還要繼續更新不?

HTTP 1.0中默認是關閉的,需要在 HTTP 頭加入” Connection: Keep-Alive”,才能啟用 Keep-Alive ;HTTP 1.1中默認啟用 Keep-Alive ,如果加入”Connection: close “,才關閉。目前大部分瀏覽器都是用 HTTP 1.1協議,也就是說默認都會發起 Keep-Alive 的連接請求了,所以是否能完成一個完整的 Keep-Alive 連接就看服務器設置情況。

HTTP 1.1 和 HTTP 2.0 的區別來了,多路複用,什麼是多路複用呢?

舉個例最簡單的例子:

<code>從A地到B地
坐公交2塊。打車要20塊
為什麼坐公交便宜呢
這裡所講的就是“多路複用”的原理。

/<code>

我們再來看一幅圖,這圖是網上嫖來的哈,百度上好多,


再談 HTTP,你還要繼續更新不?


這也是 HTTP 2.0的複用連接,雖然依然遵循請求-響應模式,但客戶端發送多個請求和服務端給出多個響應的順序不受限制,這樣既避免了”隊頭堵塞”,又能更快獲取響應。在複用同一個 TCP 連接時,服務器同時(或先後)收到了 A、B 兩個請求,先回應A請求,但由於處理過程非常耗時,於是就發送A請求已經處理好的部分, 接著回應B請求,完成後,再發送A請求剩下的部分。HTTP 2.0長連接可以理解成全雙工的協議。

因為HTTP 2.0引入二進制數據幀和流的概念,其中幀對數據進行順序標識,也就是說,我們傳遞一個字符串的時候,比如說,我要傳遞一個,“別說了,我愛你”,HTTP 1.1是按照一個順序傳輸,那麼 HTTP 2.0是怎麼傳輸的,看圖:

再談 HTTP,你還要繼續更新不?

瀏覽器收到數據之後,就可以按照序列對數據進行合併,而不會出現合併後數據錯亂的情況。同樣是因為有了序列,服務器就可以並行的傳輸數據,這就是流所做的事情。

這也就是解決了問題1,那麼怎麼解決問題2呢?HTTP 2.0 對同一域名下所有請求都是基於流,也就是說同一域名不管訪問多少文件,也只建立一路連接。同樣 Apache 的最大連接數為300,因為有了這個新特性,最大的併發就可以提升到300,比原來提升了6倍!

這就是多路複用,是不是很好理解。

3.頭部header壓縮

HTTP 1.x的 header 帶有大量信息,而且每次都要重複發送,HTTP 2.0使用 encoder 來減少需要傳輸的 header 大小,通訊雙方各自 cache 一份 header fields 表,既避免了重複 header 的傳輸,又減小了需要傳輸的大小。


分享到:


相關文章: