週末一大早,我正在電腦前面瀏覽一些技術網站,突然女朋友大喊起來:哇,杭州又下大雪啦,快來看啊。我並沒有理她,於是她跑過來拉我。
 圖,雪後杭州上次杭州下雪的時候,[給女朋友介紹了什麼是RPC],這次下雪將要介紹的HTTP和RPC也有點關係,都是通訊方式。
什麼是HTTP協議
HTTP是HyperText Transfer Protocol的縮寫,中文翻譯為超文字傳輸協議。他是一種用於分散式、協作式和超媒體資訊系統的應用層協議。HTTP是全球資訊網的資料通訊的基礎。
說的簡單點,其實HTTP協議主要就是用來進行客戶端和伺服器之間進行通訊的標準協議。HTTP主要規定了客戶端如何與伺服器建立連結、客戶端如何從伺服器請求資料、伺服器如何響應請求,以及最後連線如何關閉。
當我們在瀏覽器中輸入一個url,如http://www.taobao.com ,然後按下回車,一直到頁面顯示淘寶網的首頁的過程就是一次HTTP的網路通訊。
這次通訊過程中,我們檢視淘寶使用的電腦就是客戶端,而搭建淘寶網的那些計算機機器就是伺服器。
1、建立連線:老闆撥通手下員工的電話
2、進行請求:老闆提出自己的要求
3、響應:員工應答老闆的請求
4、關閉連線:結束通話電話
建立連線
老闆找出自己公司的總機電話號並撥通,員工接聽電話的過程就是建立連線。
根據使用者輸入的URL地址,通過DNS、負載均衡等技術找到一臺伺服器,客戶端與伺服器的80埠建立一個TCP連結。
進行請求
電話被接通之後,老闆可能要求某個具體員工來進行接聽,並且會對該員工下達一些命令,比如幫他取個快遞,幫他預訂個酒店,幫他收購一家公司等。這個過程就進行請求(request)。
客戶端向伺服器傳送訊息,請求URL中指定的頁面,要求執行指定的操作。
老闆對員工下達的命令中,可以分為很多種,比如有些命令只是簡單的事情詢問、而有些命令則要求員工執行某些決定,如收購公司等。
同樣的,HTTP的請求方法也有很多種,主要的有GET、POST、HEAD等。
響應
員工在接收到老闆下單的命令後,需要對該命令做出回應。比如直接告知老闆他接下來的行程,幫老闆預訂好酒店後告訴他已經預訂成功等。這個過程就是響應(response)
伺服器向客戶端傳送響應。響應以狀態碼開頭。常見的狀態碼有:200、302、404、500等。
HTTP狀態碼由三個十進位制數字組成,第一個十進位制數字定義了狀態碼的型別,後兩個數字沒有分類的作用。HTTP狀態碼共分為5種型別:
分類 | 分類描述 |
---|---|
1** | 資訊,伺服器收到請求,需要請求者繼續執行操作 |
2** | 成功,操作被成功接收並處理 |
3** | 重定向,需要進一步的操作以完成請求 |
4** | 客戶端錯誤,請求包含語法錯誤或無法完成請求 |
5** | 伺服器錯誤,伺服器在處理請求的過程中發生了錯誤 |
關閉連線
老闆在下達完命令,並且員工給予響應之後,雙方會結束通話電話。這個過程就是關閉連線。
客戶端或服務端都可以關閉連線。每個請求都是用一個單獨的網路連線。
特別的是:伺服器不回記憶前面一次連線或者其結果,這種不記憶過去請求的協議被稱為無狀態(stateless)協議。
HTTP協議的迭代
前面我們把HTTP通訊比喻成打電話,嚴格一點來說,HTTP/2更像是現在的打電話。HTTP協議主要的版本有3個,分別是HTTP/1.0、HTTP/1.1和HTTP/2。
HTTP/1.0
1996年5月,HTTP/1.0 版本釋出,為了提高系統的效率,HTTP/1.0規定瀏覽器與伺服器只保持短暫的連線,瀏覽器的每次請求都需要與伺服器建立一個TCP連線,伺服器完成請求處理後立即斷開TCP連線,伺服器不跟蹤每個客戶也不記錄過去的請求。
這種方式就好像我們打電話的時候,只能說一件事兒一樣,說完之後就要結束通話,想要說另外一件事兒的時候就要重新撥打電話。
HTTP/1.0中瀏覽器與伺服器只保持短暫的連線,連線無法複用。也就是說每個TCP連線只能傳送一個請求。傳送資料完畢,連線就關閉,如果還要請求其他資源,就必須再新建一個連線。
我們知道TCP連線的建立需要三次握手,是很耗費時間的一個過程。所以,HTTP/1.0版本的效能比較差。
HTTP/1.1
為了解決HTTP/1.0存在的缺陷,HTTP/1.1於1999年誕生。相比較於HTTP/1.0來說,最主要的改進就是引入了持久連線。所謂的持久連線即TCP連線預設不關閉,可以被多個請求複用。
由於之前打一次電話只能說一件事兒,效率很低。後來人們提出一種想法,就是電話打完之後,先不直接結束通話,而是持續一小段時間,這一小段時間內,如果還有事情溝通可以再次進行溝通。
客戶端和伺服器發現對方一段時間沒有活動,就可以主動關閉連線。或者客戶端在最後一個請求時,主動告訴服務端要關閉連線。
HTTP/1.1版還引入了管道機制(pipelining),即在同一個TCP連線裡面,客戶端可以同時傳送多個請求。這樣就進一步改進了HTTP協議的效率。
有了持久連線和管道,大大的提升了HTTP的效率。但是服務端還是順序執行的,效率還有提升的空間。
HTTP/2
HTTP/2 是 HTTP 協議自 1999 年 HTTP 1.1 釋出後的首個更新,主要基於 SPDY 協議。
HTTP/2 為了解決HTTP/1.1中仍然存在的效率問題,HTTP/2 採用了多路複用。即在一個連線裡,客戶端和瀏覽器都可以同時傳送多個請求或回應,而且不用按照順序一一對應。能這樣做有一個前提,就是HTTP/2進行了二進位制分幀,即 HTTP/2 會將所有傳輸的資訊分割為更小的訊息和幀(frame),並對它們採用二進位制格式的編碼。
也就是說,老闆可以同時下達多個命令,員工也可以收到了A請求和B請求,於是先回應A請求,結果發現處理過程非常耗時,於是就傳送A請求已經處理好的部分, 接著回應B請求,完成後,再傳送A請求剩下的部分。A請求的兩部分響應在組合到一起發給老闆。
除此之外,還有一些其他的優化,比如做Header壓縮、服務端推送等。
Header壓縮就是壓縮老闆和員工之間的對話。
服務端推送就是員工事先把一些老闆可能詢問的事情提現傳送到老闆的手機(快取)上。這樣老闆想要知道的時候就可以直接讀取簡訊(快取)了。
目前,主流的HTTP協議還是HTTP/1.1 和 HTTP/2。並且各大網站的HTTP/2的使用率也在逐年增加。
HTTP-over-QUIC
據國際網際網路工程任務組(The Internet Engineering Task Force,簡稱 IETF )訊息,HTTP-over-QUIC 實驗性協議將被重新命名為 HTTP/3,並有望成為 HTTP 協議的第三個正式版本。
QUIC (Quick UDP Internet Connections)是 Google 推出的一個專案,旨在降低基於 TCP 通訊的 Web 延遲。QUIC 非常類似 TCP+TLS+SPDY ,但是基於 UDP 實現的。
這種通訊方式有點像現在我們使用的微信語言,在通話之前,老闆和下屬之間並沒有直接的建立可靠連線,即不需要撥通電話,而是拿起微信,直接通過語音直接下達了命令。
我們經常使用的“ping”命令的原理就是向對方主機傳送UDP資料包,然後對方主機確認收到資料包, 如果資料包是否到達的訊息及時反饋回來,那麼網路就是通的。
至於,這種基於QUIC的HTTP協議究竟未來發展如何,目前只能拭目以待了。
下面是一張大圖,通過圖解來介紹HTTP/1.0、HTTP/1.1、HTTP/2.0(SDPY)和HTTP over QUIC(HTTP/3)
HTTPS
HTTPS是Hypertext Transfer Protocol Secure的縮寫,翻譯為超文字傳輸安全協議。HTTPS經由HTTP進行通訊,但利用SSL/TLS來加密資料包。
HTTPS就像是加密電話,通過一些手段來加密通話內容的。他是基於普通電話的,但是又不是普通的電話,更不是普通電話的升級版。
所以,HTTP和HTTPS是兩個不同的協議。
HTTP的URL是由“http://”起始與預設使用埠80,而HTTPS的URL則是由“https://”起始與預設使用埠443。
HTTP不是安全的,而且攻擊者可以通過監聽和中間人攻擊等手段,獲取網站帳戶和敏感資訊等。HTTPS的設計可以防止前述攻擊,在正確配置時是安全的。
美國民主與技術中心 CDT 首席技術專家 Joseph Hall 表示: "使用 HTTPS,你的網際網路服務供應商不會知道你在網站上幹了些什麼,即使是政府和間諜也不能辦到。"