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)
Hypertext Transfer Protocol -- HTTP/1.1
HTTP - Hypertext Transfer Protocol Overview