HTTP 演進史
在面試相關開發崗位的同學中,我經常會問一些跟程式語言不相關的東西,比如下面這些問題:
1. 你平時是怎麼學習的?學習渠道有哪些?
2. 專案組中,你認為最重要的是什麼?
3. 你在專案組中遇到的最大困難(非程式設計問題)是什麼,你是怎麼解決的?
4. 專案執行過程中,其他同事遇到困難,你是如何做的?
這些問題可以讓面試者自由發揮的題目,並沒有固定的標準的答案。這樣的問題問出來有諸多好處,首先可以讓面試者穩定一下心態不至於太緊張,其次可以看看他的語言組織能力和表達能力,從中也能看出他有沒有過實際的專案經驗。
很多人的簡歷上面寫的很完美,做過諸多專案,精通某某語言的程式設計,精通各種網路協議,熟悉各大作業系統等等,當深入問他們熟悉的知識時,發現他們的回答卻含糊不清。不排除世界上有這樣的全才,但是肯定不會被我們輕易遇到,至少我覺得自己還沒有達到那個能力。
如果你還沒有但又想精通各種知識,就慢慢去學習並精通相關的知識,循序漸進,相信自己會做到的。好了,不扯了,今天聊聊 HTTP 的發展歷史。
我敢保證有絕大部分的人不知道 HTTP/2,雖然他早就來臨.
HTTP 0.x 到 HTTP/2
HTTP/1 是 HTTP 1.0 和 HTTP 1.1 的統稱,分別指 HTTP 協議的版本是 1.0 和 1.1.
1960年美國人 Ted Nelson 構思了一種通過計算機處理文字資訊的方法,並稱之為超文字(hypertext), 這成為了 HTTP 超文字傳輸協議標準架構的發展根基,所以他被稱之為 HTTP 之父
。
1989年3月在 CERN(歐洲核子研究組織)工作的 Tim Berners-Lee(蒂姆.伯納斯.李) 提交了一個提案 Information Management: A Proposal
,該提案描繪了其對全球資訊網(World Wide Web)最初的設想即能讓遠隔兩地的人們共享知識,Tim 是 全球資訊網之父
,成就和貢獻也是不計其數。
直到1990年 HTTP 才算是問世,姑且稱之為 HTTP 0.x 版本,也有些地方稱之為 HTTP 0.9 版本,總之這不是一個正式版。1996年5月,HTTP 1.0 作為 HTTP 的第一個正式版本正式公佈,並記載於 RFC1945 中。
隨著人們對網際網路的認知和技術的發展(尤其是瀏覽器等相關的技術),發現 HTTP 1.0 缺點還是比較多,無法滿足快速的網際網路發展需求。於是在1997年1月釋出了 HTTP 1.1 版本,並記載於 RFC2068 中,後來在1999年6月,對 RFC2068 又做了補充和修正,稱之為 RFC2616 , 至此 HTTP 1.1 開始一統天下,直到現在絕大數開發者使用的都是 HTTP 1.1 版本。
另外一個版本 HTTP/2 標準於2015年5月以 RFC 7540 正式發表,多數主流瀏覽器已經在2015年底支援了該協議,時隔多年,HTTP/2 才問世。
蘋果從 iOS9 開始支援 HTTP2.0,對 iOS 開發人員來說從 iOS9 開始 NSURLSession 可以支援 HTTP2.0 了。目前 Android 絕大部分系統不支援 HTTP/2,Android 原生 HttpURLConnection 框架並不支援 HTTP/2,但可以選用三方開源庫 okhttp 作為網路框架,Android 5.0+(系統版本)裝置才支援 HTTP/2。所以想全面使用 HTTP/2 還是要付出一定的代價,不過隨著技術的革新,相信 HTTP/2 將會大放光彩。
HTTP 不斷的改進
用一張圖來描述 HTTP 的不斷改進和演變史,如下圖所示:

下面具體看看這些協議版本的演進過程中,究竟是新增和改進了哪些東西?
HTTP 0.9
HTTP 0.9 並非出自某個標準化組織,只是 Tim 的個人作品而已,比較簡單。可以參閱這篇文章 The Original HTTP as defined in 1991 ,該版本規定了 HTTP 使用 TCP/IP 連線,HTTP 請求只有一個請求行,只有一個 GET 方法加上請求的URI。HTTP 響應則直接返回 HTML 文字,沒有狀態碼,所以也沒有辦法區分錯誤訊息和正常的文字。可以看出,HTTP/0.9並不完善,也不是那麼完美,但是這的確是 Tim 堅持下來的結晶。
HTTP 1.0
HTTP 1.0 增加了請求頭域和響應頭域,增加了 HEAD 和 POST 方法,響應物件不再侷限於 HTML 文字,支援長連線和快取機制等等。
HTTP 1.0 具體特點
1.可以傳送更多格式的內容,如影象、視訊、二進位制檔案,不僅僅侷限於文字了。
2.增加了 POST 和 HEAD 方法。
3.改變了 HTTP 請求和迴應的格式。除了資料部分,每次通訊都必須包括頭資訊(HTTP header),用來描述一些元資料,即增加了請求頭資訊,響應資料不再侷限於 HTML 文字。
4.新增狀態碼(status code)、多字符集支援、多部分發送(multi-part type)、許可權(authorization)、快取(cache)、內容編碼(content encoding)等功能。
5.增加了長連線的支援,不過 HTTP 1.0 需要在 request 中增加 ”Connection: keep-alive“ header 才能夠支援,後面要說到的 HTTP 1.1 預設就支援了。
可以看出,HTTP 1.0在 HTTP 0.9 的基礎上做了大量的擴充和改進。
HTTP 1.0 主要缺點
1.每次請求都需要建立 TCP 連線,即每對 Request/Response 都使用一個新的連線。
2.不支援斷點續傳。
HTTP 1.1
每個新版本的誕生基本都是對上一個版本的補充和改進,就像我們的軟體開發一樣,協議也需要迭代。
HTTP 1.1 具體特點
1.加強和優化了持久連線即長連線。
HTTP 1.1 支援長連線(Persistent Connection)和請求的流水線(Pipelining)處理,在一個 TCP 連線上可以傳送多個 HTTP 請求和響應,減少了建立和關閉連線的消耗和延遲,在 HTTP 1.1 中預設開啟 Connection: keep-alive
,一定程度上彌補了 HTTP 1.0 每次請求都要建立連線的缺點。
2.增強了快取機制。
引入了更多的快取控制策略例如 Entity tag,If-Unmodified-Since, If-Match, If-None-Match 等可供選擇的快取頭。
3.請求頭引入了 range 頭域。
它允許只請求資源的某個部分,即返回碼是 206(Partial Content),這樣就方便了開發者自由的選擇以便於充分利用頻寬和連線。
4.將 Content-length 欄位的作用進行擴充,即宣告本次迴應的資料長度(一個TCP連線現在可以傳送多個迴應,勢必就要有一種機制,區分資料包是屬於哪一個迴應的)。
5.採用分塊傳輸編碼。
對於一些很耗時的動態操作,伺服器需要等到所有操作完成,才能傳送資料,顯然這樣的效率不高。更好的處理方法是,產生一塊資料,就傳送一塊,採用流模式(stream)取代快取模式(buffer)。
6.新增了許多動詞方法:PUT、PATCH、HEAD、OPTIONS、DELETE。另外,客戶端請求的頭資訊新增了 Host 欄位,用來指定伺服器的域名。
7.新增了 24 個錯誤狀態響應碼。
HTTP 1.0 主要缺點
HTTP 1.1 雖然增加了很多功能,在一定程度上已經很強大了,但是他自身也是有缺點的,換句話說有優化的空間,主要問題如下:
1.隊頭堵塞(Head-of-line blocking),各個請求到達的伺服器的速度是不同的,如果先發的請求先到達可能會發生阻塞,剩下所有的工作都會被阻塞在那次請求應答之後,這樣就降低了頻寬。
為了避免這個問題,有兩種方法:一是減少請求數,二是同時多開持久連線。
2.臃腫的訊息頭部
3.不支援服務端推送,例如要求使用 HTTP 協議做一個服務端資料變動頁面立即改變的元件就不好做,可用輪詢的方式進行,這樣就會對頻寬影響較大。
SPDY
在說到 HTTP/2 之前,必須要先說說 SPDY 。SPDY 是由 Google 公司推出的,SPDY 的推出是為了解決 HTTP 1.1 中存在的一些問題的。
1.多路複用(multiplexing)
多路複用通過多個請求 stream 共享一個 TCP 連線的方式,解決了HOL blocking 的問題,降低了延遲同時提高了頻寬的利用率。
2.可以對請求設定優先順序
多路複用帶來一個新的問題是,在連線共享的基礎之上有可能會導致關鍵請求被阻塞。SPDY允許給每個request設定優先順序,這樣重要的請求就會優先得到響應。比如瀏覽器載入首頁,首頁的html內容應該優先展示,之後才是各種靜態資原始檔,指令碼檔案等載入,這樣可以保證使用者能第一時間看到網頁內容。
3.對請求頭的壓縮
選擇合適的壓縮演算法可以減小包的大小和數量,這樣在一定程度上可以提高網路使用效率。
4.為了資料傳輸的安全性,強制使用基於 HTTPS 的加密協議傳輸。
5.支援服務端推送。
稱之為 Server Push 功能,伺服器在還沒有收到客戶端的請求,伺服器就可以把各種資源推送給客戶端。
比如,客戶端只請求了 index.html,但是伺服器把 index.html、x.css、x.jpg 等資源全部發送給客戶端。這樣的話,只需要一輪 HTTP 通訊,客戶端就得到了全部資源,提高了通訊的效能,也提高了使用者體驗。
HTTP/2
本質上來講,HTTP/2 是建立在 SPDY 基礎之上的,借鑑了很多 SPDY 的設計思想和策略。 HTTP 具有 SPDY 的優點,同時自己也有與 SPDY 的不同點,主要如下:
1.HTTP/2 支援明文 HTTP 傳輸,而 SPDY 強制使用 HTTPS。這一點 HTTP/2 相對人性化一些。
2.HTTP/2 會對請求頭和響應頭做壓縮以提升請求效能,HTTP/2 訊息頭的壓縮演算法不同於 SPDY。 HTTP/2 採用 HPACK ,SPDY 採用的 DEFLATE 演算法。
HTTP/2 支援所有的 HTTP 1.1 的核心特徵,其提供了 HTTP 語義的傳輸優化,並且在各方面做到更高效。HTTP/2 的頭資訊是一個徹底的二進位制協議,頭資訊和資料體都是二進位制,並且統稱為幀(frame),即頭資訊幀和資料幀。對 HTTP/2 感興趣的可以看一下 HTTP2 協議初識 這篇文章。
掃碼關注,你我就各多一個朋友~