HTTP協議以及HTTP2.0/1.1/1.0區別
一.簡介
摘自百度百科:
超文本傳輸協議(HTTP,HyperText Transfer Protocol)是互聯網上應用最為廣泛的一種網絡協議。所有的WWW文件都必須遵守這個標准。設計HTTP最初的目的是為了提供一種發布和接收HTML頁面的方法。
- HTTP屬於OSI網絡七層協議模型中的"最上層":應用層。由請求和響應構成,是一個標准的客戶端服務器模型。HTTP是一個無狀態的協議。
- HTTP默認端口號為80。它也可以承載在TLS和SSL之上,通過加密、認證的方式實現數據傳輸的安全,稱為HTTPS,HTTPS默認端口號為443。
- 早期HTTP用於傳輸網頁HTML文件,發展到現在,應用變得廣泛,客戶端軟件(PC,Android,iOS等)大部分通過HTTP傳輸數據。
二.通信過程
角色:客戶端和服務端
-
首先,客戶端發起一個與服務器的TCP連接,建立連接之后,A中的瀏覽器進程就可以通過Socket訪問該TCP連接。
-
客戶端A進程通過該TCP連接向服務端B發送一個HTTP請求報文(ASCII碼),報文中包含(百度首頁為例)
請求行(request line) : 3個字段:方法字段、URL字段和HTTP版本字段
GET / HTTP/1.1
請求頭(header line) : 位於請求行之后
Host www.baidu.com
Connection keep-alive
Cache-Control max-age=0
Upgrade-Insecure-Requests 1
User-Agent Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36
Accept text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,/;q=0.8
Referer https://www.baidu.com/s?wd=Https&rsv_spt=1&rsv_iqid=0xc28e80ff00002ae1&issp=1&f=8&rsv_bp=1&rsv_idx=2&ie=utf-8&rqlang=cn&tn=baiduhome_pg&rsv_enter=0&oq=Http%E5%8D%8F%E8%AE%AE&rsv_pq=de652d0900004bfb&inputT=691&rsv_sug3=47&rsv_sug1=48&rsv_sug7=100&rsv_sug4=756
Accept-Encoding gzip, deflate, br
Accept-Language zh-CN,zh;q=0.9,en;q=0.8
空行 :
位於請求頭和請求體之間,必須要有
請求體(entity body) : 在使用GET方法時,請求體為空。POST時可以類似如下格式:
username=test&password=123123
- HTTP服務器進程通過Socket接收到該請求報文,從存儲器(內存或磁盤)中得到URL字段中指定的對象(如:/index.html),然后封裝到響應報文中,通過Socket發送到客戶端。
響應報文:
狀態行(status line) :
HTTP/1.1 200 OK
響應頭(header line):
Cache-Control: private
Connection: Keep-alive
Content-Encoding: gzip
Content-Type: text/html;charset=utf-8
Date: Thu, 29 Mar 2018 16:01:47 GMT
Expires: Thu, 29 Mar 2018 16:01:46 GMT
Set-Cookie: BD_HOME=1; path=/
空行:
響應體(entity body):
<html>...</html>
- 發送響應報文后,服務器進程通知TCP斷開TCP連接(只是通知,此時TCP連接不一定關閉),TCP發送完數據后,實際斷開該連接。
- 客戶端收到響應報文后,將響應實體中的文件信息提取出來,用瀏覽器引擎繪制或者通過別的進程處理該數據。
實際中,可能一個HTML中有許多資源引用(如CSS文件,圖片,JS文件等),對於每一個引用對象,重復該過程(HTTP1.0短連接)
三.HTTP1.0/1.1/2.0區別
- HTTP1.1默認使用長連接,可有效減少TCP的三次握手開銷。
- HTTP 1.1支持只發送header信息(不帶任何body信息),如果服務器認為客戶端有權限請求服務器,則返回100,否則返回401。客戶端如果接受到100,才開始把請求body發送到服務器。這樣當服務器返回401的時候,客戶端就可以不用發送請求body了,節約了帶寬。另外HTTP還支持傳送內容的一部分。這樣當客戶端已經有一部分的資源后,只需要跟服務器請求另外的部分資源即可。這是支持文件斷點續傳的基礎。
- HTTP1.0是沒有host域的,HTTP1.1才支持這個參數。
- HTTP2.0使用多路復用技術(Multiplexing),多路復用允許同時通過單一的 HTTP/2 連接發起多重的請求-響應消息。
"HTTP1.1在同一時間對於同一個域名的請求數量有限制,超過限制就會阻塞請求"。多路復用底層采用"增加二進制分幀層"的方法,使得不改變原來的語義、首部字段的情況下提高傳輸性能,降低延遲。
二進制分幀將所有傳輸信息分割為更小的幀,用二進制進行編碼,多個請求都在同一個TCP連接上完成,可以承載任意數量的雙向數據流。HTTP/2更有效的使用TCP連接,得到性能上的提升。
網上不錯的一個過程圖片:
* HTTP/2新增首部壓縮(Header Compression):采用HPACK算法 * HTTP/2新增服務端推送(Header Compression)