超文本傳輸協定HTTP(HyperText Transfer Protocol)

一種OSI 模型應用層的協定

邱秉誠
7 min readJan 2, 2022
參考來源

今天我要介紹的是HTTP通訊協定。

大家聽到通訊協定(Protocol)不要被嚇到,以為是什麼高深莫測的詞彙,其實就是電腦之間交換資料的格式規範,就像是每個國家都有各自的語言,如果要溝通就需要一個共同語言,比如英文、西班牙文,以此來達到訊息交流的目的。

本文的章節

  1. HTTP簡介
  2. HTTP的組成
  3. HTTP請求流程
  4. HTTP訊息
  5. HTTP 命令與回覆
  6. HTTP中GET方法的實際範例

HTTP簡介

HTTP(HyperText Transfer Protocol)是一個屬於 OSI 模型中應用層的協定,通常用來作為網頁瀏覽器(客戶端)和網頁伺服器(伺服器端)的溝通方式,採取『要求/回應』的存取方式這種『要求/回應』的存取方式,只能由客戶端主動發出請求,而伺服端被動地接受命令來回應、工作。

HTTP的組成

以下為簡易的資料流程圖。

參考來源

客戶端就是主動發出請求的一端,通常會透過Proxy(網路代理)與伺服器端交換資料,使用Proxy可以帶來以下幾個好處

  • 提高快取速度(caching):使用者再存取相同的資訊時, 可以直接由緩衝區中取出資訊,傳給使用者。
  • 過濾內容(filtering) :限制對特定電腦的存取,避免網路攻擊。
  • 控制對內部資源的存取(authentication) :使用教育網內位址段免費代理伺服器,就可以用於對教育網開放的各類FTP下載上傳,以及各類資料查詢共享等服務。

HTTP請求流程

接下來要介紹HTTP在實務上的請求流程,關於HTTP訊息會在下文細說,在此看不懂無妨。

雖然無明文規定,但HTTP在實務上大多搭配位於OSI傳輸層的TCP協定進行實作,以客戶端的角度,請求流程大致如下:

  1. 開啟TCP連線:由客戶端開啟TCP連線來送出一個/多個請求,並且等待回復。
  2. 客戶端送出HTTP訊息(向developer.mozilla.org網站發出GET請求):
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 come the 29769 bytes of the requested web page)

4. 關閉TCP連線。

以上是HTTP一個簡易的請求流程,下面來解釋HTTP訊息的格式。

HTTP訊息

上述提到HTTP的流程就是

  1. 開啟TCP連線
  2. 客戶端送出HTTP訊息(稱為Request Message)
  3. 客戶端接受伺服器端的HTTP訊息(稱為Responses Message)
  4. 關閉TCP連線

以下來介紹上文提及HTTP訊息的具體格式。

HTTP 主要有0.9、1.0、1.1、2.0 版本,依照不同版本有不同的訊息格式規範,這裡以1.1版本為主,詳細內容可參閱RFC

Request Message

客戶端發出請求的訊息格式。在第一行是由Method、Path、Version組成,Method以1.1版本為例共有八種,常見的有GET、POST等Method,請參考下個章節HTTP 命令與回覆的介紹。

參考來源

Responses Message

伺服器端回應請求的訊息格式。第一行是由Version、Status Code、Status Message組成。Status Code請參考下個章節HTTP 命令與回覆的介紹

參考來源

HTTP 命令與回覆

因為Request Message的Method和Responses Message的Status Code是非常重要的欄位,因此特別拉出來介紹。

Request Message的Method

HTTP的1.1版本,定義了八種Request Message的Method[RFC],也就是客戶端能向伺服器端發出的命令種類,簡述如下:

  • GET:向指定的資源發出讀取的請求。例如你在瀏覽器上輸入https://www.google.com.tw/的網址,就是以GET方法發出讀取請求。
  • HEAD:同上,只是僅讀取網頁的檔頭(header),不包含資源的本文部份。
  • POST:向指定資源提交資料,請求伺服器進行處理(例如提交表單或者上傳檔案)
  • PUT:向指定資源位置上傳其最新內容。
  • DELETE:請求伺服器刪除Request-URI所標識的資源
  • TRACE:回顯伺服器收到的請求,主要用於測試或診斷
  • OPTIONS:使伺服器傳回該資源所支援的所有HTTP請求方法
  • CONNECT:將連接改為隧道方式的代理伺服器

Responses Message的Status Code

在伺服器接收上述命令後會做出回應,來告知客戶端本次請求的狀態,HTTP回應的第一行都是狀態行,其中包含3位數字組成的狀態代碼(Status Code)如下:

  • 1xx訊息 — — 請求已被伺服器接收,繼續處理
  • 2xx成功 — — 請求已成功被伺服器接收、理解、並接受
  • 3xx重新導向 — — 需要後續操作才能完成這一請求
  • 4xx請求錯誤 — — 請求含有詞法錯誤或者無法被執行
  • 5xx伺服器錯誤 — — 伺服器在處理某個正確請求時發生錯誤

以下將以實際例子說明GET兩種常見的請求方法。

HTTP中GET方法的實際範例

我們平常在瀏覽網頁時,背後就是遵從HTTP協定,以瀏覽google首頁作為例子。我們從網址輸入https://www.google.com.tw/,其實就是透過Proxy向google伺服器發出一個GET請求,並等待google回覆我們的請求,在瀏覽器上顯示HTML。

我們打開瀏覽器進入到google首頁,按下滑鼠右鍵,從選單中選擇"檢查(Inspection)",右邊會出現監控主控台,從選單中選擇Network,重新整理頁面(F5),選擇左下方清單內的google網址,右下角的選單選擇Headers,你會在General部份看到以下資訊:

  • Request URL:請求的網址為https://www.google.com.tw/
  • Request Method:發出請求的方式為GET。
  • Status Code:狀態碼為200,表示伺服器順利接受指令。
  • Remote Address:伺服器端的位址為172.217.161.195:443。

當然這只是General的說明,你可以展開下方Response Headers和Request Headers的清單,詳細看每個欄位的資訊。

參考資料

  1. Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content
  2. Wikipedia - Proxy server
  3. Mozilla blog - HTTP

--

--

邱秉誠
邱秉誠

Written by 邱秉誠

畢業於台大工業工程所,目前任職於台積電。

No responses yet