HTTP 的前世今生:一次性搞懂 HTTP、HTTPS、SPDY、HTTP2
作為網際網路通訊協議的一員老將,HTTP 協議走到今天已經經歷了三次版本的變動,現在最新的版本是 HTTP2.0,相信大家早已耳熟能詳。今天就給大家好好介紹一下 HTTP 的前世今生。
HTTP/0.9
HTTP 的最早版本誕生在 1991 年,這個最早版本和現在比起來極其簡單,沒有 HTTP 頭,沒有狀態碼,甚至版本號也沒有,後來它的版本號才被定為 0.9 來和其他版本的 HTTP 區分。HTTP/0.9 只支援一種方法—— Get,請求只有一行。
GET /hello.html
複製程式碼
響應也是非常簡單的,只包含 html 文件本身。
<HTML>
Hello world
</HTML >
複製程式碼
當 TCP 建立連線之後,伺服器向客戶端返回 HTML 格式的字串。傳送完畢後,就關閉 TCP 連線。由於沒有狀態碼和錯誤程式碼,如果伺服器處理的時候發生錯誤,只會傳回一個特殊的包含問題描述資訊的 HTML 檔案。這就是最早的 HTTP/0.9 版本。
HTTP/1.0
1996 年,HTTP/1.0 版本釋出,大大豐富了 HTTP 的傳輸內容,除了文字,還可以傳送圖片、視訊等,這為網際網路的發展奠定了基礎。相比 HTTP/0.9,HTTP/1.0 主要有如下特性:
- 請求與響應支援 HTTP 頭,增加了狀態碼,響應物件的一開始是一個響應狀態行
- 協議版本資訊需要隨著請求一起傳送,支援 HEAD,POST 方法
- 支援傳輸 HTML 檔案以外其他型別的內容 一個典型的 HTTP/1.0 的請求像這樣:
GET /hello.html HTTP/1.0
User-Agent:NCSA_Mosaic/2.0(Windows3.1)
200 OK
Date: Tue, 15 Nov 1996 08:12:31 GMT
Server: CERN/3.0 libwww/2.17
Content-Type: text/html
<HTML>
一個包含圖片的頁面
<IMGSRC="/smile.gif">
</HTML>
複製程式碼
HTTP/1.1
在 HTTP/1.0 釋出幾個月後,HTTP/1.1 就釋出了。HTTP/1.1 更多的是作為對 HTTP/1.0 的完善,在 HTTP1.1 中,主要具有如下改進:
- 可以複用連線
- 增加 pipeline:HTTP 管線化是將多個 HTTP 請求整批提交的技術,而在傳送過程中不需先等待服務端的迴應。管線化機制須通過永久連線(persistent connection)完成。瀏覽器將HTTP請求大批提交可大幅縮短頁面的載入時間,特別是在傳輸延遲(lag/latency)較高的情況下。有一點需要注意的是,只有冪等的請求可以使用 pipeline,如 GET,HEAD 方法。
- chunked 編碼傳輸:該編碼將實體分塊傳送並逐塊標明長度,直到長度為 0 塊表示傳輸結束, 這在實體長度未知時特別有用(比如由資料庫動態產生的資料)
- 引入更多快取控制機制:如 etag,cache-control
- 引入內容協商機制,包括語言,編碼,型別等,並允許客戶端和伺服器之間約定以最合適的內容進行交換
- 請求訊息和響應訊息都支援 Host 頭域:在 HTTP1.0 中認為每臺伺服器都繫結一個唯一的 IP 地址,因此,請求訊息中的URL並沒有傳遞主機名(hostname)。但隨著虛擬主機技術的發展,在一臺物理伺服器上可以存在多個虛擬主機(Multi-homed Web Servers),並且它們共享一個 IP 地址。因此,Host 頭的引入就很有必要了。
- 新增了 OPTIONS,PUT, DELETE, TRACE, CONNECT 方法 雖然 HTTP/1.1 已經優化了很多點,作為一個目前使用最廣泛的協議版本,已經能夠滿足很多網路需求,但是隨著網頁變得越來越複雜,甚至演變成為獨立的應用,HTTP/1.1 逐漸暴露出了一些問題:
- 在傳輸資料時,每次都要重新建立連線,對移動端特別不友好
- 傳輸內容是明文,不夠安全
- header 內容過大,每次請求 header 變化不大,造成浪費
- keep-alive 給服務端帶來效能壓力 為了解決這些問題,HTTPS 和 SPDY 應運而生。
HTTPS
HTTPS 是以安全為目標的 HTTP 通道,簡單講是 HTTP 的安全版,即 HTTP 下加入 SSL 層,HTTPS 的安全基礎是 SSL,因此加密的詳細內容就需要 SSL。
HTTPS 協議的主要作用可以分為兩種:一種是建立一個資訊保安通道,來保證資料傳輸的安全;另一種就是確認網站的真實性。 HTTPS 和 HTTP 的區別主要如下:- HTTPS 協議使用 ca 申請證書,由於免費證書較少,需要一定費用。
- HTTP 是明文傳輸,HTTPS 則是具有安全性的 SSL 加密傳輸協議。
- HTTP 和 HTTPS使用的是完全不同的連線方式,用的埠也不一樣,前者是 80,後者是 443。
SPDY
其實 SPDY 並不是新的一種協議,而是在 HTTP 之前做了一層會話層。
在 2010 年到 2015 年,谷歌通過實踐一個實驗性的 SPDY 協議,證明了一個在客戶端和伺服器端交換資料的另類方式。其收集了瀏覽器和伺服器端的開發者的焦點問題,明確了響應數量的增加和解決複雜的資料傳輸。在啟動 SPDY 這個專案時預設的目標是:- 頁面載入時間 (PLT) 減少 50%。
- 無需網站作者修改任何內容。
- 將部署複雜性降至最低,無需變更網路基礎設施。
- 與開源社群合作開發這個新協議。
- 收集真實效能資料,驗證這個實驗性協議是否有效。 為了達到降低目標,減少頁面載入時間的目標,SPDY 引入了一個新的二進位制分幀資料層,以實現多向請求和響應、優先次序、最小化及消除不必要的網路延遲,目的是更有效地利用底層 TCP 連線。
HTTP/2.0
時間來到 2015 年,HTTP/2.0 問世。先來介紹一下 HTTP/2.0 的特點吧:
- 使用二進位制分幀層:在應用層與傳輸層之間增加一個二進位制分幀層,以此達到在不改動 HTTP 的語義,HTTP 方法、狀態碼、URI 及首部欄位的情況下,突破HTTP1.1 的效能限制,改進傳輸效能,實現低延遲和高吞吐量。在二進位制分幀層上,HTTP2.0 會將所有傳輸的資訊分割為更小的訊息和幀,並對它們採用二進位制格式的編碼,其中 HTTP1.x 的首部資訊會被封裝到 Headers 幀,而我們的 request body 則封裝到 Data 幀裡面。
- 多路複用:對於 HTTP/1.x,即使開啟了長連線,請求的傳送也是序列傳送的,在頻寬足夠的情況下,對頻寬的利用率不夠,HTTP/2.0 採用了多路複用的方式,可以並行傳送多個請求,提高對頻寬的利用率。
- 資料流優先順序:由於請求可以併發傳送了,那麼如果出現了瀏覽器在等待關鍵的 CSS 或者 JS 檔案完成對頁面的渲染時,伺服器卻在專注的傳送圖片資源的情況怎麼辦呢?HTTP/2.0 對資料流可以設定優先值,這個優先值決定了客戶端和服務端處理不同的流採用不同的優先順序策略。
- 服務端推送:在 HTTP/2.0 中,伺服器可以向客戶傳送請求之外的內容,比如正在請求一個頁面時,伺服器會把頁面相關的 logo,CSS 等檔案直接推送到客戶端,而不會等到請求來的時候再發送,因為伺服器認為客戶端會用到這些東西。這相當於在一個 HTML 文件內集合了所有的資源。
- 頭部壓縮:使用首部表來跟蹤和儲存之前傳送的鍵值對,對於相同的內容,不會再每次請求和響應時傳送。 可以看到 HTTP/2.0 的新特點和 SPDY 很相似,其實 HTTP/2.0 本來就是基於 SPDY 設計的,可以說是 SPDY 的升級版。 但是 HTTP/2.0 仍有和 SPDY 不同的地方,主要有如下兩點:
- HTTP2.0 支援明文 HTTP 傳輸,而 SPDY 強制使用 HTTPS。
- HTTP2.0 訊息頭的壓縮演算法採用 HPACK,而非 SPDY 採用的 DEFLATE。
文 / Xss
編 / 熒聲
如果你對 HTTP 的沿襲感興趣,想看到更細緻的介紹,歡迎閱讀我們此前的文章:
此外,我們正在進行限時有獎讀者調查,歡迎參加:
本文已由作者授權釋出,版權屬於創宇前端。歡迎註明出處轉載本文。本文連結:knownsec-fed.com/2018-09-11-…
想要訂閱更多來自知道創宇開發一線的分享,請搜尋關注我們的微信公眾號:創宇前端(KnownsecFED)。歡迎留言討論,我們會盡可能回覆。
感謝您的閱讀。