HTTP學習小結
HTTP是一種能夠獲取如 HTML 這樣的網路資源的 protocol(通訊協議)。它是在 Web 上進行數據交換的基礎,是一種 client-server 協議,也就是說,請求通常是由像瀏覽器這樣的接受方發起的。一個完整的Web文檔通常是由不同的子文檔拼接而成的,像是文本、布局描述、圖片、視頻、腳本等等。
HTTP控制的常見特性:1、緩存 2、開放同源限制 3、認證 4、代理和隧道 5、會話
HTTP流
當客戶端想要和服務端進行信息交互時(服務端是指最終伺服器,或者是一個中間代理),過程表現為下面幾步:
- 打開一個TCP連接:TCP連接被用來發送一條或多條請求,以及接受回應消息。客戶端可能打開一條新的連接,或重用一個已經存在的連接,或者也可能開幾個新的TCP連接連向服務端。
- 發送一個HTTP報文:HTTP報文(在HTTP/2之前)是語義可讀的。在HTTP/2中,這些簡單的消息被封裝在了幀中,這使得報文不能被直接讀取,但是原理仍是相同的。GET / HTTP/1.1Host: http://developer.mozilla.orgAccept-Language: fr
- 讀取服務端返回的報文信息:HTTP/1.1 200 OK
Date: Sat, 09 Oct 2010 14:28:02 GMT
Server: ApacheLast-Modified: Tue, 01 Dec 2009 20:18:22 GMTETag: "51142bc1-7449-479b075b2891b"Accept-Ranges: bytesContent-Length: 29769
Content-Type: text/html<!DOCTYPE html... (here comes the 29769 bytes of the requested web page) - 關閉連接或者為後續請求重用連接。
當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
或者一個名詞像OPTIONS
,HEAD
來定義客戶端的動作行為。通常客戶端的操作都是獲取資源(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
參考文檔:
https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Overview
推薦閱讀:
※ngrok - 免費的內網穿透
※Linux GRE tunnel的構建原理及應用
※計算機網路:適配器
※除夕練習:自動掛bilibili直播
※OSFP協議特點詳解以及OSFP單多區域配置實例
TAG:計算機網路 |