?
This document uses PHP Chinese website manual Release
HTTP消息是數據在服務器和客戶端之間交換的方式。有兩種類型的消息:請求客戶端發(fā)送到觸發(fā)服務器上的動作,并且響應,從服務器的答案。
HTTP消息由以ASCII編碼的文本信息組成,并跨越多行。在HTTP / 1.1及其早期版本的協(xié)議中,這些消息是通過連接公開發(fā)送的。在HTTP / 2中,曾經人類可讀的消息現(xiàn)在被劃分為HTTP幀,從而提供優(yōu)化和性能改進。
Web開發(fā)人員或網站管理員很少制作這些文本HTTP消息:軟件,Web瀏覽器,代理或Web服務器,執(zhí)行此操作。他們通過配置文件(代理或服務器),API(瀏覽器)或其他接口提供HTTP消息。
HTTP / 2二進制組幀機制被設計為不需要對應用的API或配置文件進行任何修改:它對用戶來說是廣泛透明的。
HTTP請求和響應共享相似的結構并由以下部分組成:
一個起始行描述的要求來實現(xiàn),或者它無論成功或失敗的狀態(tài)。這條起始線總是一條線。
一組可選的HTTP標頭,用于指定請求或描述消息中包含的主體。
表示請求的所有元信息的空白行已經發(fā)送。
包含與請求相關的數據的可選主體(如HTML表單的內容)或與響應關聯(lián)的文檔。主體和其大小的存在由開始行和HTTP標頭指定。
HTTP消息的起始行和HTTP標頭統(tǒng)稱為請求頭,而其有效負載稱為主體。
HTTP請求是客戶端發(fā)送的消息,以在服務器上啟動一個操作。他們的起點包含三個要素:
1.一個HTTP方法,動詞(例如GET
,PUT
或POST
),或者名詞(像HEAD
或OPTIONS
要被執(zhí)行),描述動作。例如,GET
表示應該提取資源或者POST
意味著數據被推送到服務器(創(chuàng)建或修改資源或生成臨時文檔以發(fā)回)。
2.所述請求對象,通常是一個URL,或協(xié)議,端口和域的絕對路徑通常特征在于請求上下文。這個請求目標的格式因不同的HTTP方法而異。有可能
絕對路徑,最后是一個'?'
查詢字符串。這是最常見的形式,被稱為起源形式,并用于與GET
,POST
,HEAD
,和OPTIONS
方法。 POST / HTTP 1.1
GET /background.png HTTP/1.0
HEAD /test.html?query=alibaba HTTP/1.1
OPTIONS /anypage.html HTTP/1.0
當連接到代理服務器時,完整的URL稱為絕對表單,主要用于GET
。 GET http://developer.mozilla.org/en-US/docs/Web/HTTP/Messages HTTP/1.1
URL的權威組成部分由域名和可選的端口(前綴為a ':'
)組成,稱為權威表單。它僅CONNECT
在設置HTTP隧道時使用。 CONNECT developer.mozilla.org:80 HTTP/1.1
的星號形式,一個簡單的星號('*'
)用于OPTIONS
表示該服務器作為一個整體。 OPTIONS * HTTP/1.1
3.HTTP版本,它定義了剩余的消息的結構,充當的預期版本的指示符以用于響應。
來自請求的HTTP標頭遵循HTTP標頭的相同基本結構:不區(qū)分大小寫的字符串,后跟冒號(':'
)和結構取決于標頭的值。包括該值在內的整個標題由一條單獨的行組成,該行可能相當長。
有許多請求頭可用。他們可以分成幾組:
一般標題,如Via
整個應用于郵件。
請求標頭,比如User-Agent
,通過給定上下文(比如)或者通過有條件地限制它(比如)Accept-Type
來進一步指定它(比如Accept-Language
)來修改請求。Referer
If-None
實體標題,如Content-Length
適用于請求的主體。顯然,如果請求中沒有主體,則不會傳輸此頭。
請求的最后部分是它的主體。并非所有的請求有一個:獲取資源,如請求GET
,HEAD
,DELETE,或選項,通常不需要一個。有些請求會將數據發(fā)送到服務器以更新它:與POST
請求(包含HTML表單數據)的情況相同。
主體大致可以分為兩類:
單資源主體,由一個單一文件組成,由兩個標頭定義:Content-Type
和Content-Length
。
多資源主體,由多部分主體組成,每個主體包含不同位的信息。這通常與HTML表單相關聯(lián)。
HTTP響應的起始行(稱為狀態(tài)行)包含以下信息:
協(xié)議版本:通常為HTTP/1.1
。
狀態(tài)碼:指示請求的成功或失敗。常見的狀態(tài)代碼為200
,404
或302
一個狀態(tài)文本:簡要的,純粹的信息性的狀態(tài)代碼的文本描述,以幫助人們理解HTTP消息。
典型的狀態(tài)行如下所示: HTTP/1.1 404 Not Found.
響應的HTTP頭與其他報頭的結構相同:不區(qū)分大小寫的字符串,后跟冒號(':'
)和結構取決于頭部類型的值。包括其價值在內的整個表頭呈現(xiàn)為一條線。
有許多響應頭可用。這些可以分成幾個組:
一般報頭,如Via
適用于整個消息。
響應報頭,Vary
并Accept-Ranges
提供有關不適合狀態(tài)行的服務器的其他信息。
實體報頭,如Content-Length
適用于請求的主體。當請求中沒有主體時顯然不會傳輸這樣的頭文件。
答復的最后部分是主體。并不是所有的答復都是:有狀態(tài)代碼的答復,就像201
或204
通常不會。
主體大致可以分為三類:
單一資源主體,由一個已知長度的單個文件組成,由兩個標頭定義:Content-Type
和Content-Length
。
單一資源主體,由一個長度未知的單個文件組成,由塊Transfer-Encoding
設置為chunked
。
多資源主體,由多部分主體組成,每個主體包含不同的信息部分。這些比較少見。
HTTP / 1.x消息在性能方面有一些缺點:
與主體不同,標題是未壓縮的。
從一條消息到另一條消息,標題通常非常相似,但仍然在連接中重復。
不能多路復用。多個連接需要在同一臺服務器上打開:熱TCP連接比冷連接更有效。
HTTP / 2引入了一個額外的步驟:它將HTTP / 1.x消息分成嵌入流中的幀。數據和標題幀是分開的,這允許標題壓縮。多個流可以組合在一起,這個過程稱為多路復用,允許更高效的底層TCP連接。
HTTP框架現(xiàn)在對Web開發(fā)人員是透明的。這是HTTP / 2中HTTP / 1.1消息和底層傳輸協(xié)議之間的附加步驟。Web開發(fā)人員使用HTTP幀所使用的API不需要進行任何更改; 當瀏覽器和服務器都可用時,HTTP / 2將打開并使用。
HTTP消息是使用HTTP的關鍵; 它們的結構很簡單,而且它們具有高度的可擴展性。HTTP / 2成幀機制在HTTP / 1.x語法和底層傳輸協(xié)議之間添加了一個新的中間層,而不需要從根本上對其進行修改:基于成熟的機制。