1、基本概念
名稱含義:HTTP協議是Hyper Text Transfer Protocol(超文本傳輸協議)的縮寫。
做用:HTTP是一個基於TCP/IP通訊協議來傳遞數據(HTML 文件, 圖片文件, 查詢結果等),用於從萬維網(WWW:World Wide Web )服務器傳輸超文本到本地瀏覽器的傳送協議。
特色:瀏覽器
-
簡單快速:客戶向服務器請求服務時,只需傳送請求方法和路徑。請求方法經常使用的有GET、HEAD、POST。每種方法規定了客戶與服務器聯繫的類型不一樣。因爲HTTP協議簡單,使得HTTP服務器的程序規模小,於是通訊速度很快。服務器
-
靈活:HTTP容許傳輸任意類型的數據對象。正在傳輸的類型由Content-Type加以標記。架構
-
無鏈接:無鏈接的含義是限制每次鏈接只處理一個請求。服務器處理完客戶的請求,並收到客戶的應答後,即斷開鏈接。採用這種方式能夠節省傳輸時間。ide
- 無狀態:HTTP協議是無狀態協議。無狀態是指協議對於事務處理沒有記憶能力。缺乏狀態意味着若是後續處理須要前面的信息,則它必須重傳,這樣可能致使每次鏈接傳送的數據量增大。另外一方面,在服務器不須要先前信息時它的應答就較快。
- 支持B/S及C/S模式。
2、報文格式
3、HTTP報文
HTTP協議工做於客戶端-服務端架構爲上。瀏覽器做爲HTTP客戶端經過URL向HTTP服務端即WEB服務器發送全部請求。Web服務器根據接收到的請求後,向客戶端發送響應信息。
性能
3.1 HTTP報文之Request
HTTP Request報文由:請求行(request line)、請求頭部(header)、空行(empty line)和請求數據(body)四個部分組成。
編碼
<method><request-URL><version>
<headers>
<entity-body>
start linecode
- 一個 HTTP 方法,一個動詞 (像 GET, PUT 或者 POST) 或者一個名詞 (像 HEAD 或者 OPTIONS), 描述要執行的動做. 例如, GET 表示要獲取資源,POST 表示向服務器推送數據 (建立或修改資源, 或者產生要返回的臨時文件)。
- 請求目標 (request target),一般是一個 URL,或者是協議、端口和域名的絕對路徑,一般以請求的環境爲特徵。請求的格式因不一樣的 HTTP 方法而異。
- HTTP 版本 (HTTP version),定義了剩餘報文的結構,做爲對指望的響應版本的指示符。
Headerorm
來自請求的 HTTP headers 遵循和 HTTP header 相同的基本結構:不區分大小寫的字符串,緊跟着的冒號 (':') 和一個結構取決於 header 的值。 整個 header(包括值)由一行組成,這一行能夠至關長。對象
- General headers,例如 Via,適用於整個報文。
- Request headers,例如 User-Agent,Accept-Type,經過進一步的定義(例如 Accept-Language),或者給定上下文(例如 Referer),或者進行有條件的限制 (例如 If-None) 來修改請求。
- Entity headers,例如 Content-Length,適用於請求的 body。顯然,若是請求中沒有任何 body,則不會發送這樣的頭文件。
bodyblog
請求的最後一部分是它的 body。不是全部的請求都有一個 body:例如獲取資源的請求,GET,HEAD,DELETE 和 OPTIONS,一般它們不須要 body。 有些請求將數據發送到服務器以便更新數據:常見的的狀況是 POST 請求(包含 HTML 表單數據)。
- Single-resource bodies,由一個單文件組成。該類型 body 由兩個 header 定義: Content-Type 和 Content-Length.
- Multiple-resource bodies,由多部分 body 組成,每一部分包含不一樣的信息位。一般是和 HTML Forms 連繫在一塊兒。
3.2 HTTP報文之Response
HTTP Response報文由:狀態行、消息報頭、空行和響應正文組成。
<version<status><reason-phrase>
<headers>
<entity-body>
status line
HTTP 響應的起始行被稱做 狀態行 (status line),包含如下信息:
- 協議版本,一般爲 HTTP/1.1。
- 狀態碼 (status code),代表請求是成功或失敗。常見的狀態碼是 200,404,或 302。
- 狀態文本 (status text)。一個簡短的,純粹的信息,經過狀態碼的文本描述,幫助人們理解該 HTTP 消息。
Header
響應的 HTTP headers 遵循和任何其它 header 相同的結構:不區分大小寫的字符串,緊跟着的冒號 (':') 和一個結構取決於 header 類型的值。 整個 header(包括其值)表現爲單行形式。
有許多響應頭可用,這些響應頭能夠分爲幾組:
- General headers,例如 Via,適用於整個報文。
- Response headers,例如 Vary 和 Accept-Ranges,提供其它不符合狀態行的關於服務器的信息。
- Entity headers,例如 Content-Length,適用於請求的 body。顯然,若是請求中沒有任何 body,則不會發送這樣的頭文件。
body
響應的最後一部分是 body。不是全部的響應都有 body:具備狀態碼 (如 201 或 204) 的響應,一般不會有 body。
Body 大體可分爲三類:
- Single-resource bodies,由已知長度的單個文件組成。該類型 body 由兩個 header 定義:Content-Type 和 Content-Length。
- Single-resource bodies,由未知長度的單個文件組成,經過將 Transfer-Encoding 設置爲 chunked 來使用 chunks 編碼。
- Multiple-resource bodies,由多部分 body 組成,每部分包含不一樣的信息段。但這是比較少見的。
4、HTTP/2
HTTP/1.x 報文有一些性能上的缺點:
- Header 不像 body,它不會被壓縮。
- 兩個報文之間的 header 一般很是類似,但它們仍然在鏈接中重複傳輸。
- 沒法複用。當在同一個服務器打開幾個鏈接時:TCP 熱鏈接比冷鏈接更加有效。
HTTP/2 引入了一個額外的步驟:它將 HTTP/1.x 消息分紅幀並嵌入到流 (stream) 中。數據幀和報頭幀分離,這將容許報頭壓縮。將多個流組合,這是一個被稱爲 多路複用 (multiplexing) 的過程,它容許更有效的底層 TCP 鏈接。