HTTP

HTTP是網頁運作的核心。HTTP是應用層的通訊協定。

HTTP全名為Hypertext Transfer Protocol,中文稱為「超文件傳送協定」或「超本文傳輸協定」,目前通訊協定的版本是1.1,由IETF定義在RFC 2616文件當中。

摘要(abstract)

HTTP是應用層(application-layer)的通訊協定,用於分散的(distributed)、共同的(collaborative)、超媒體(hypermedia)的資訊系統上。HTTP是一個通用(generic)且無狀態(stateless)的通訊協定,藉由擴展通訊協定的請求方法、錯誤碼與標頭等,HTTP不僅用於傳輸超文件(hypertext)的用途,也能用於名稱伺服器或分散式物件管理系統等。HTTP的一個特點在於資料表示形式的呈現(typing)與協商(negotiation)方式,這使得系統的建立獨立於資料的傳輸。

HTTP自從1990年開始用於全球資訊網(World-Wide Web),這份RFC 2616文件定義的稱為「HTTP/1.1」,是RFC 2068的更新版本。

1. 序(Introduction)

1.1 目的(Purpose)

HTTP自從1990年開始已經使用在全球資訊網(World-Wide Web)上。

第一個版本的HTTP稱為「HTTP/0.9」,這是一個簡單的通訊協定,目的是將原始資料(raw data)經由網際網路(the Internet)傳送。

第二個版本「HTTP/1.0」定義在RFC 1945,主要是改善通訊協定以允許多用途網際網路郵件延伸(Multipurpose Internet Mail Extensions, MIME)格式的信息,包含傳送資料的中繼資訊(metainformation),以及請求/回覆語意上的修飾詞語。然而,HTTP/1.0沒有考慮到階層式代理、快取、持續連線的需要、虛擬主機等這些影響。另外,未完全實現HTTP/1.0的應用越來越多,需要一個新版本讓兩個應用是確定相容的通訊。

這份文件定義的稱為「HTTP/1.1」,比HTTP/1.0包含更多嚴格的要求,為了確認實現這些特色。

實際的資訊系統不僅可以簡單取回(retrieval)資料,還要更多功能,例如搜尋、前端更新和註解等。HTTP開放方法和標頭的結尾,允許我們指出請求的目的。請求則是建立在URI的參考,對於URI存在的資源指示使用何種方法。信息則是以類似郵件的MIME格式進行傳遞。

HTTP是一種通用的通訊協定,用於兩個應用之間的通訊,HTTP允許超媒體(hypermedia)存取各式各樣應用上的資源。

1.2 要求(Requirements)

這份文件中使用RFC 2219所定義的關鍵字,包含

    • MUST,必須

    • MUST NOT,必須不

    • REQUIRED,需要

    • SHALL,應該要

    • SHELL NOT,應該不要

    • SHOULD,應該

    • SHOULD NOT,不應該

    • RECOMMENDED,建議

    • MAY,可能

    • OPTIONAL,非必須的

通訊協定的實現(implementation)依據滿足不同等級的條件可以分為下列幾類:

    • 不相容(not compliant)

    • 沒有滿足一個或多個MUST與REQUIRED條件。

    • 無條件地相容(unconditionally compliant)

    • 滿足所有MUST與REQUIRED以及SHOULD的條件。

    • 有條件地相容(unconditionally compliant)

    • 滿足所有MUST的條件,但沒有滿足所有SHOULD的條件。

1.3 術語(Terminology)

    • 連線(connection)

    • 兩個程式為了通訊的目的而建立的一個虛擬線路。

    • 信息(message)

    • HTTP最基本的通訊單位,由一個結構化的八位元(octet)序列所組成,信息是藉由連線傳輸,而且必須符合RFC2616第4節定義的語法。

    • 請求(request)

    • HTTP請求信息,定義在RFC2616第5節。

    • 回應(response)

    • HTTP回應信息,定義在RFC2616第6節。

    • 資源(resource)

    • 資源是能夠被URI識別的資料物件或服務,並且可利用於多種表現的形式或變化的方式。

    • 實體(entity)

    • 請求信息或回應信息中所傳遞(payload)的資訊。一個實體是由實體標頭(entity-header)的中繼資訊(metainformation)與實體本文(entity-body)的內容兩部分所組成。定義在RFC2616第7節。

    • 表示形式(representation)

    • 一個表示形式包含內容協商的回應。一個特定的回應狀態(response status)也許存在多種表示形式。

    • 內容協商(content negotiation)

    • 服務請求時,所選擇適當表示形式的機制。任何回應的表示形式都能夠被協商。

    • 變化(variant)

    • 在任何時刻,一個資源也許具有一個或多個表示形式,每一個表示形式則稱為「變化(varriant)」,使用變化(variant)一詞不表示資源必定受到內容協商的改變。

    • 用戶端(client)

    • 為了傳送請求信息而建立連線的程式。

    • 使用者代理(user agent)

    • 開始建立請求的用戶端,通常是瀏覽器(browsers)、編輯器(editors)、網路爬蟲(spiders)或是任何終端使用者的工具。

    • 伺服端(server)

    • 應用程式接受連線,為了服務請求而送出回應信息。任何程式都能是用戶端和伺服端,這裡所指的是針對特定連線所表現的角色,而不是程式本身具備的功能。

    • 來源伺服器(origin server)

    • 存在資源的伺服端,或建立資源的伺服端。

    • 代理伺服器(proxy)

    • 閘道器(gateway)

    • 一台伺服器扮演其他伺服器的中間者(intermediary)。不像代理伺服器,閘道器接收請求,如同自己是來源伺服器請求資源,發送請求的用戶端也許不會察覺自己和閘道器通訊。

    • 通道(tunnel)

    • 在兩個連建之間用作轉送的中介程式。雖然通道也許經由請求初始化,但通道不被視為HTTP通訊的一部分。當兩端的連線關閉時,通道停止存在。

    • 快取(cache)

    • 回應信息的本地端儲存空間,以及控制信息儲存、取回和刪除的子系統。快取儲存可快取的回應,為了減少回應時間與網路頻寬的消耗,對於請求也是。任何用戶端或伺服端也許包含一個快取,雖然一個當作通道的伺服器不能被使用作為快取。

    • 可快取(cacheable)

    • 如果一個快取允許儲存回覆信息的副本(copy),為了回應後來的請求,則稱回應是可快取。決定快取的規則定義在第13節。即使一個資源是可快取的,仍有可能有額外限制讓特定的請求使用快取。

    • 第一手(first-hand)

    • 如果回覆從來源伺服器直接過來而沒有不必要的延遲,也許經過一或多個代理伺服器,則稱回應是第一手。

    • 明確式過期時間(explicit expiration time)

    • 啟發式過期時間(heuristic expiration time)

    • 年齡(age)

    • 保鮮存留期(freshness lifetime)

    • 回應產生至它的過期時間的期間長度。

    • 新鮮的(fresh)

    • 如果回應的年齡沒有超過保鮮存留期,則是新鮮的。

    • 腐壞的(stale)

    • 如果回應的年齡超過保鮮存留期,則是腐壞的。

    • 語義透明(semantically transparent)

    • 驗證器(validator)

    • 上游/下游(upstream/downstream)

    • 描述信息的流動。所有的信息都是從上游流向下游。

    • 入站/出站(inbound/outbound)

    • 信息在請求或回應的路徑。入站指的是信息行進前往來源伺服器,出站指的是信息行進前往使用者代理。

1.4 整體的運作(Overall Operation)

2 符號慣例與通用文法(Notational Conventions and Generic Grammar)

2.1 擴大的BNF(Augmented BNF)

2.2 基本規則(Basic Rules)

3 通訊協定參數(Protocol Parameters)

3.1 HTTP版本(HTTP Version)

3.2 通用資源識別符(Uniform Resource Identifiers)

3.3 日期/時間格式(Date/Time Formats)

3.4 字元集(Character Sets)

4 HTTP信息(HTTP Message)

4.1 信息類型(Message Types)

HTT信息有兩種,一種是用戶端向伺服端的請求(request),另一種是伺服端向用戶端的回應(response)。請求和回應信息是使用RFC 822的通用信息格式,用來傳送實體。這兩種信息包含一個起始行(start-line),零或多個標頭欄位(header field),一個空白行(empty line)用來指示標頭的結束,也可能包含信息本文。

針對系統的穩建性(robustness),伺服端應該忽略任何請求行(request line)出現的空白行,換句話說,伺服端從信息串流的開始讀取,應該忽略第一個CRLF(即空白行)。

4.2 信息標頭(Message Headers)

HTTP標頭包含下列欄位:

    • 一般標頭(general header)

    • 請求標頭(request header)

    • 回應標頭(response header)

    • 實體標頭(entity header)

每個標頭欄位由名稱與值組成,欄位名稱後接著冒號(colon),且名稱不區分大小寫,欄位值前面可能有任意個空白。標頭欄位可以是多行的。

4.3 信息本文(Message Body)

4.4 信息長度(Message Length)

4.5 一般標頭欄位(General Header Fields)

5 請求(Request)

Request-Line = Method SP Request-URI SP HTTP-Version CRLF

Header lines

Blank line

Entity body

6 回應(Response)

Status-Line = HTTP-Version SP Status-Code SP Reason-Phrase CRLF

Header lines

Blank line

Entity body

7 實體(entity)

8 連線(connection)

9 方法定義(Method Definitions)

10 狀態碼定義(Status Code Definitions)

HTTP共定義5大類狀態碼,分別是Informational、Successful、Redirection、Client Error與Server Error,總共有41個狀態碼。

Informational 1xx

    • 100 Continue

    • 101 Switching Protocols

Successful 2xx

    • 200 OK

    • 201 Created

    • 202 Accepted

    • 203 Non-Authoritative Information

    • 204 No Content

    • 205 Reset Content

    • 206 Partial Content

Redirection 3xx

    • 300 Multiple Choices

    • 301 Moved Permanently

    • 302 Found

    • 303 See Other

    • 304 Not Modified

    • 305 Use Proxy

    • 306 (Unused)

    • 307 Temporary Redirect

Client Error 4xx

    • 400 Bad Request

    • 401 Unauthorized

    • 402 Payment Required

    • 403 Forbidden

    • 404 Not Found

    • 405 Method Not Allowed

    • 406 Not Acceptable

    • 407 Proxy Authentication Required

    • 408 Request Timeout

    • 409 Conflict

    • 410 Gone

    • 411 Length Required

    • 412 Precondition Failed

    • 413 Request Entity Too Large

    • 414 Request-URI Too Long

    • 415 Unsupported Media Type

    • 416 Requested Range Not Satisfiable

    • 417 Expectation Failed

Server Error 5xx

    • 500 Internal Server Error

    • 501 Not Implemented

    • 502 Bad Gateway

    • 503 Service Unavailable

    • 504 Gateway Timeout

    • 505 HTTP Version Not Supported

11 存取認證(Access Authentication)

12 內容協商(Content Negotiation)

13 HTTP快取(Caching in HTTP)

14 標頭欄位定義(Header Field Definitions)

15 安全考量(Security Considerations)