超文本傳輸協定HTTP(HyperText Transfer Protocol)
今天我要介紹的是HTTP通訊協定。
大家聽到通訊協定(Protocol)不要被嚇到,以為是什麼高深莫測的詞彙,其實就是電腦之間交換資料的格式規範,就像是每個國家都有各自的語言,如果要溝通就需要一個共同語言,比如英文、西班牙文,以此來達到訊息交流的目的。
本文的章節
- HTTP簡介
- HTTP的組成
- HTTP請求流程
- HTTP訊息
- HTTP 命令與回覆
- HTTP中GET方法的實際範例
HTTP簡介
HTTP(HyperText Transfer Protocol)是一個屬於 OSI 模型中應用層的協定,通常用來作為網頁瀏覽器(客戶端)和網頁伺服器(伺服器端)的溝通方式,採取『要求/回應』的存取方式,這種『要求/回應』的存取方式,只能由客戶端主動發出請求,而伺服端被動地接受命令來回應、工作。
HTTP的組成
以下為簡易的資料流程圖。
客戶端就是主動發出請求的一端,通常會透過Proxy(網路代理)與伺服器端交換資料,使用Proxy可以帶來以下幾個好處
- 提高快取速度(caching):使用者再存取相同的資訊時, 可以直接由緩衝區中取出資訊,傳給使用者。
- 過濾內容(filtering) :限制對特定電腦的存取,避免網路攻擊。
- 控制對內部資源的存取(authentication) :使用教育網內位址段免費代理伺服器,就可以用於對教育網開放的各類FTP下載上傳,以及各類資料查詢共享等服務。
HTTP請求流程
接下來要介紹HTTP在實務上的請求流程,關於HTTP訊息會在下文細說,在此看不懂無妨。
雖然無明文規定,但HTTP在實務上大多搭配位於OSI傳輸層的TCP協定進行實作,以客戶端的角度,請求流程大致如下:
- 開啟TCP連線:由客戶端開啟TCP連線來送出一個/多個請求,並且等待回復。
- 客戶端送出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的流程就是
- 開啟TCP連線
- 客戶端送出HTTP訊息(稱為Request Message)
- 客戶端接受伺服器端的HTTP訊息(稱為Responses Message)
- 關閉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的清單,詳細看每個欄位的資訊。