三代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依靠證書來驗證伺服器的身份,併為瀏覽器和伺服器之間的通訊加密。