1. 程式人生 > >三代HTTP協議間的差異與優化

三代HTTP協議間的差異與優化

目前我們使用的HTTP協議是HTTP1.1,對於現在的網路來說這個版本的協議足夠好用和穩定。HTTP2相比較HTTP1.x進行了更多的優化,大幅度的提升了web的效能,讓網路足夠優秀,進一步減少了網路的延遲。這裡我們探討一下HTTP的1.0、1.1、2.0這三個版本的差異和升級後對前一代的優化情況。

HTTP1.0 與 HTTP1.1 的區別

增加方法

增加了很多請求方法,1.0中只有POST、GET,增加了DELETE、PUT、HEAD等,完善了restful風格的編寫問題。其中HEAD可以不獲取響應體,比如我們要下載一個資源,我們可以先通過HEAD在響應頭檢視一下具體下載的內容有多大,做一些空間的分配等操作。

keep-alive

加入了keep-alive的概念,在TCP連線完成後不會立刻釋放連線,而是維持一段時間,這段時間中如果出現新的請求則複用之前的通道,節省資源。HTTP 1.0需要使用keep-alive引數來告知伺服器端要建立一個長連線,而HTTP1.1預設支援長連線。HTTP是基於TCP/IP協議的,建立一個TCP連線是需要經過三次握手的,有一定的開銷,如果每次通訊都要重新建立連線的話,對效能有影響。因此最好能維持一個長連線,可以用個長連線來發多個請求。

請求頭增加host站點

由於HTTP 1.0不支援Host請求頭欄位,WEB瀏覽器無法使用主機頭名來明確表示要訪問伺服器上的哪個WEB站點,這樣就無法使用WEB伺服器在同一個IP地址和埠號上配置多個虛擬WEB站點。在HTTP 1.1中增加Host請求頭欄位後,WEB瀏覽器可以使用主機頭名來明確表示要訪問伺服器上的哪個WEB站點,這才實現了在一臺WEB伺服器上可以在同一個IP地址和埠號上使用不同的主機名來建立多個虛擬WEB站點。

HTTP1.1 與 HTTP2.0 的區別

伺服器推送

意思是說,當我們對支援HTTP2.0的web server請求資料的時候,伺服器會順便把一些客戶端需要的資源一起推送到客戶端,免得客戶端再次建立連線傳送請求到伺服器端獲取。這種方式非常合適載入靜態資源。伺服器端推送的這些資源其實存在客戶端的某處地方,客戶端直接從本地載入這些資源就可以了,不用走網路,速度自然是快很多的。

二進位制協議

HTTP1.1不支援header資料的壓縮,HTTP2.0使用HPACK演算法對header的資料進行壓縮,這樣資料體積小了,在網路上傳輸就會更快。HTTP/1.1 版的頭資訊肯定是文字(ASCII編碼),資料體可以是文字,也可以是二進位制。HTTP/2 則是一個徹底的二進位制協議,頭資訊和資料體都是二進位制,並且統稱為”幀”(frame):頭資訊幀和資料幀。二進位制協議的一個好處是,可以定義額外的幀。HTTP/2 定義了近十種幀,為將來的高階應用打好了基礎。如果使用文字實現這種功能,解析資料將會變得非常麻煩,二進位制解析則方便得多。

多工/多路複用

在HTTP1.1協議中客戶端在同一時間,針對同一域名下的請求有一定數量限制。超過限制數目的請求會被阻塞。這也是為何一些站點會有多個靜態資源CDN域名的原因之一,目的就是變相的解決瀏覽器針對同一域名的請求限制阻塞問題。多路複用允許同時通過單一的HTTP2.0連線發起多重的請求-響應訊息。

HTTP報文頭

  • 請求報文請求行:請求方法、url、版本
  • 應答報文應答行:版本、狀態、描述
  • 請求頭、應答頭:kv的n個引數
  • 請求體、應答體:存放資料
請求報文
----------------------------------------------
請求行:
POST /index.html HTTP/1.1
請求頭:
HOST: www.XXX.com
User-Agent: Mozilla/5.0(Windows NT 6.1;rv:15.0) Firefox/15.0
請求體:
Username=admin&password=admin
 
響應報文
----------------------------------------------
應答行:
HTTP/1.1 200 OK
應答頭:
Content-Encoding: gzip
Content-Type: text/html;charset=utf-8
應答體:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8" />
    <title>Document</title>
</head>
<body>
    <p>this is http response</p>
</body>

響應碼

  • 1XX:資訊提示。表示請求已被伺服器接受,但需要繼續處理,範圍為100~101。
  • 2XX:請求成功。伺服器成功處理了請求。範圍為200~206。
  • 3XX:客戶端重定向。重定向狀態碼用於告訴客戶端瀏覽器,它們訪問的資源已被移動,並告訴客戶端新的資源位置。客戶端收到重定向會重新對新資源發起請求。範圍為300~305。
  • 4XX:客戶端資訊錯誤。客戶端可能傳送了伺服器無法處理的東西,比如請求的格式錯誤,或者請求了一個不存在的資源。範圍為400~415。
  • 5XX:伺服器出錯。客戶端傳送了有效的請求,但是伺服器自身出現錯誤,比如Web程式執行出錯。範圍是500~505。

  • 200:客戶端請求成功。

  • 302:重定向。
  • 404:請求資源不存在。
  • 400:請求語法錯誤,伺服器無法理解。
  • 403:伺服器收到請求,但拒絕提供服務。
  • 500:伺服器內部錯誤。
  • 503:伺服器當前不能處理客戶端請求,可能需要一段時間後才能恢復正常。

cookie和session的區別

Cookie是一種存在的資料,session是一種概念。一般我們用cookie實現session。

Cookie技術是客戶端認證的解決方案,Cookie就是由伺服器發給客戶端的特殊資訊,而這些資訊以文字檔案的方式存放在客戶端,然後客戶端每次向伺服器傳送請求的時候都會帶上這些特殊的資訊。除了使用Cookie,Web應用程式中還經常使用Session來記錄客戶端狀態。Session是伺服器端使用的一種記錄客戶端狀態的機制,使用上比Cookie簡單一些,相應的也增加了伺服器的儲存壓力。

POST和GET的請求差別

從本質上來講POST和GET都是http請求,底層都是TCP連線。他們的不同是在語義上定義的。POST用來更新資訊,是動作操作,GET是獲取資源是類似於搜尋select的操作。

get:

  • GET 方法請求的資料會直接存放在URL裡,會看到的很明顯
  • GET 請求可被快取
  • GET 請求保留在瀏覽器歷史記錄中、可被收藏為書籤
  • GET 請求有長度限制
  • GET 請求只應當用於取回資料

post:

  • POST 將資料存放在請求體中
  • POST 請求不會被快取
  • POST 請求不會保留在瀏覽器歷史記錄中、不能被收藏為書籤
  • POST 請求對資料長度沒有要求
  • POST 用來更新資源

head:

  • head和get很類似,但是head沒有響應體,所以作用就是從相應的頭部獲取一些資訊
  • 比如下載前先獲取一下,預估下載的內容有多大

HTTP和HTTPS的差別

HTTP協議被用於在Web瀏覽器和網站伺服器之間傳遞資訊,HTTP協議以明文方式傳送內容,不提供任何方式的資料加密,如果攻擊者截取了Web瀏覽器和網站伺服器之間的傳輸報文,就可以直接讀懂其中的資訊,因此,HTTP協議不適合傳輸一些敏感資訊,比如:信用卡號、密碼等支付資訊。為了解決HTTP協議的這一缺陷,需要使用另一種協議:安全套接字層超文字傳輸協議HTTPS,為了資料傳輸的安全,HTTPS在HTTP的基礎上加入了SSL協議,SSL依靠證書來驗證伺服器的身份,併為瀏覽器和伺服器之間的通訊加密。