標籤:

HTTP學習小結

HTTP學習小結

HTTP是一種能夠獲取如 HTML 這樣的網路資源的 protocol(通訊協議)。它是在 Web 上進行數據交換的基礎,是一種 client-server 協議,也就是說,請求通常是由像瀏覽器這樣的接受方發起的。一個完整的Web文檔通常是由不同的子文檔拼接而成的,像是文本、布局描述、圖片、視頻、腳本等等。

HTTP控制的常見特性:1、緩存 2、開放同源限制 3、認證 4、代理和隧道 5、會話

HTTP流

當客戶端想要和服務端進行信息交互時(服務端是指最終伺服器,或者是一個中間代理),過程表現為下面幾步:

  1. 打開一個TCP連接:TCP連接被用來發送一條或多條請求,以及接受回應消息。客戶端可能打開一條新的連接,或重用一個已經存在的連接,或者也可能開幾個新的TCP連接連向服務端。
  2. 發送一個HTTP報文:HTTP報文(在HTTP/2之前)是語義可讀的。在HTTP/2中,這些簡單的消息被封裝在了幀中,這使得報文不能被直接讀取,但是原理仍是相同的。GET / HTTP/1.1

    Host: developer.mozilla.org

    Accept-Language: fr
  3. 讀取服務端返回的報文信息:HTTP/1.1 200 OK

    Date: Sat, 09 Oct 2010 14:28:02 GMT

    Server: Apache

    Last-Modified: Tue, 01 Dec 2009 20:18:22 GMT

    ETag: "51142bc1-7449-479b075b2891b"

    Accept-Ranges: bytes

    Content-Length: 29769

    Content-Type: text/html

    <!DOCTYPE html... (here comes the 29769 bytes of the requested web page)
  4. 關閉連接或者為後續請求重用連接。

當HTTP流水線啟動時,後續請求都可以不用等待第一個請求的成功回應就被發送。然而HTTP流水線已被證明很難在現有的網路中實現,因為現有網路中有很多老舊的軟體與現代版本的軟體共存。因此,HTTP流水線已被在有多請求下表現得更穩健的HTTP/2的幀所取代。

HTTP報文

HTTP/1.1以及更早的HTTP協議報文都是語義可讀的。在HTTP/2中,這些報文被嵌入到了一個新的二進位結構,幀。幀允許實現很多優化,比如報文頭部的壓縮和復用。即使只有原始HTTP報文的一部分以HTTP/2發送出來,每條報文的語義依舊不變,客戶端會重組原始HTTP/1.1請求。因此用HTTP/1.1格式來理解HTTP/2報文仍舊有效。

有兩種HTTP報文的類型,請求與回應,每種都有其特定的格式。

請求

HTTP請求的一個例子:

請求由以下元素組成:

  • 一個HTTP的method,經常是由一個動詞像GET, POST 或者一個名詞像OPTIONSHEAD來定義客戶端的動作行為。通常客戶端的操作都是獲取資源(GET方法)或者發送HTML form表單值(POST方法),雖然在一些情況下也會有其他操作。
  • 要獲取的資源的路徑,通常是上下文中就很明顯的元素資源的URL,它沒有protocol(http://),domain(developer.mozilla.org),或是TCP的port(HTTP一般在80埠)。
  • HTTP協議版本號。
  • 為服務端表達其他信息的可選頭部headers。
  • 對於一些像POST這樣的方法,報文的body就包含了發送的資源,這與回應報文的body類似。

回應

HTTP回應的一個例子:

回應報文包含了下面的元素:

  • HTTP協議版本號。
  • 一個狀態碼(status code),來告知對應請求執行成功或失敗,以及失敗的原因。
  • 一個狀態信息,這個信息是非權威的狀態碼描述信息,可以由服務端自行設定。
  • HTTP headers,與請求頭部類似。
  • 可選項,比起請求報文,響應報文中更常見地包含獲取的資源body。

HTTP 的 OPTIONS 方法 用於獲取目的資源所支持的通信選項。客戶端可以對特定的 URL 使用 OPTIONS 方法,也可以對整站(通過將 URL 設置為「*」)使用該方法。

Request has body No

Successful response has body No

Safe Yes

Idempotent Yes

Cacheable No

Allowed in HTML forms No

檢測伺服器所支持的請求方法

可以使用 OPTIONS 方法對伺服器發起請求,以檢測伺服器支持哪些 HTTP 方法:

curl -X OPTIONS http://example.org -i

響應報文包含一個 Allow 首部欄位,該欄位的值表明了伺服器支持的所有 HTTP 方法:

HTTP/1.1 200 OKAllow: OPTIONS, GET, HEAD, POSTCache-Control: max-age=604800Date: Thu, 13 Oct 2016 11:45:00 GMTExpires: Thu, 20 Oct 2016 11:45:00 GMTServer: EOS (lax004/2813)x-ec-custom-error: 1Content-Length: 0

CORS 中的預檢請求

在 CORS 中,可以使用 OPTIONS 方法發起一個預檢請求,以檢測實際請求是否可以被伺服器所接受。預檢請求報文中的 Access-Control-Request-Method 首部欄位告知伺服器實際請求所使用的 HTTP 方法;Access-Control-Request-Headers 首部欄位告知伺服器實際請求所攜帶的自定義首部欄位。伺服器基於從預檢請求獲得的信息來判斷,是否接受接下來的實際請求。

OPTIONS /resources/post-here/ HTTP/1.1 Host: bar.other Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: en-us,en;q=0.5 Accept-Encoding: gzip,deflate Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 Connection: keep-alive Origin: http://foo.example Access-Control-Request-Method: POST Access-Control-Request-Headers: X-PINGOTHER, Content-Type

伺服器所返回的 Access-Control-Allow-Methods 首部欄位將所有允許的請求方法告知客戶端。該首部欄位與 Allow 類似,但只能用於涉及到 CORS 的場景中。

HTTP/1.1 200 OKDate: Mon, 01 Dec 2008 01:15:39 GMT Server: Apache/2.0.61 (Unix) Access-Control-Allow-Origin: http://foo.example Access-Control-Allow-Methods: POST, GET, OPTIONS Access-Control-Allow-Headers: X-PINGOTHER, Content-Type Access-Control-Max-Age: 86400 Vary: Accept-Encoding, Origin Content-Encoding: gzip Content-Length: 0 Keep-Alive: timeout=2, max=100 Connection: Keep-Alive Content-Type: text/plain

參考文檔:

developer.mozilla.org/z


推薦閱讀:

ngrok - 免費的內網穿透
Linux GRE tunnel的構建原理及應用
計算機網路:適配器
除夕練習:自動掛bilibili直播
OSFP協議特點詳解以及OSFP單多區域配置實例

TAG:計算機網路 |