1. 程式人生 > >HTTP 協議簡介

HTTP 協議簡介

國外媒體Venturebeat最近報道,谷歌 Chrome 將於今年七月份將所有的 HTTP 網站標記為“不安全” (原文連結)google又要帶一波節奏了…..HTTP 協議是客戶端瀏覽器或其他程式與 Web 伺服器之間的應用層通訊協議;HTTPS 協議可以理解為 HTTP+SSL/TLS, 即 HTTP 下加入 SSL 層,HTTPS 的安全基礎是 SSL,因此加密的詳細內容就需要 SSL,用於安全的 HTTP 資料傳輸。現在網際網路安全越來越重要,如果大家都使用 HTTPS 協議的話會也會更加安全。

下面是對 HTTP 協議的一些總結:

協議概念

  • 超文字傳輸協議(HTTP,HyperText Transfer Protocol)是網際網路上廣泛應用的一種網路協議,是全球資訊網的資料通訊的基礎,HTTP是一個客戶端終端(使用者)和伺服器端(網站)請求和應答的標準(TCP)。通過使用網頁瀏覽器、網路爬蟲或者其它的工具,客戶端發起一個HTTP請求到伺服器上指定埠(預設埠為80)。應答的伺服器上儲存著一些資源,比如HTML檔案和影象。
  • 通常,由HTTP客戶端發起一個請求,建立一個到伺服器指定埠(預設是80埠)的TCP連線。HTTP伺服器則在那個埠監聽客戶端的請求。一旦收到請求,伺服器會向客戶端返回一個狀態,比如”HTTP/1.1 200 OK”,以及返回的內容,如請求的檔案、錯誤訊息、或者其它資訊。
  • 設計HTTP最初的目的是為了提供一種釋出和接收HTML頁面的方法。1960年美國人Ted Nelson構思了一種通過計算機處理文字資訊的方法,並稱之為超文字(hypertext),這成為了HTTP超文字傳輸協議標準架構的發展根基。Ted Nelson組織協調全球資訊網協會(World Wide Web Consortium)和網際網路工程工作小組(Internet Engineering Task Force )共同合作研究,最終釋出了一系列的RFC,其中著名的RFC 2616定義了HTTP 1.1。

主要特點

  • 無連線:無連線的含義是限制每次連線只處理一個請求。伺服器處理完客戶的請求,並收到客戶的應答後,即斷開連線。採用這種方式可以節省傳輸時間。
  • 靈活:HTTP是媒體獨立的,這意味著,只要客戶端和伺服器知道如何處理的資料內容,任何型別的資料都可以通過HTTP傳送。客戶端以及伺服器指定使用適合的MIME-type內容型別。
  • 無狀態:HTTP是一個基於請求/響應模式的無狀態的協議。無狀態是指協議對於事務處理沒有記憶能力。缺少狀態意味著如果後續處理需要前面的資訊,則它必須重傳,這樣可能導致每次連線傳送的資料量增大。另一方面,在伺服器不需要先前資訊時它的應答就較快。
  • HTTP屬於應用層協議,網頁的瀏覽實際上是瀏覽器和伺服器之間通過HTTP在Internet上進行資料的傳送和接收。
  • 絕大多數的Web開發都是構建在HTTP協議之上的Web應用。
  • 簡單快速:客戶向伺服器請求服務時,只需傳送請求方法和路徑。由於HTTP協議簡單,使得HTTP伺服器的程式規模小,因而通訊速度很快。

瀏覽器與伺服器通訊的過程

  1. 客戶端發起連線
  2. 客戶端傳送請求
  3. 伺服器響應請求
  4. 伺服器關閉連線

請求訊息結構

一個請求訊息是由請求行、請求頭欄位、一個空行和訊息主體構成。如

GET / HTTP/1.1
Host: www.google.com

請求行

請求訊息的第一行就是請求行。它指明使用的請求方法、資源標示符、和 HTTP 版本。如
GET / HTTP/1.1

請求方法

請求方法用來定義操作資源的方式,HTTP/1.1 協議中定義了八種請求方法:

  • GET:讀取資源資料
  • POST:新建資源資料
  • PUT:更新資源資料
  • DELETE:刪除資源資料
  • HEAD:讀取資源的元資料
  • OPTIONS:讀取該資源所支援的所有請求方法
  • TRACE:回顯伺服器收到的請求,主要用於測試或診斷
  • CONNECT:HTTP/1.1 協議中預留給能夠將連線改為管道方式的代理伺服器。通常用於SSL加密伺服器的連結(經由非加密的HTTP代理伺服器)

此外,除了上述方法,特定的HTTP伺服器還能夠擴充套件自定義的方法。

資源識別符號

URI、URL和URN是用來識別、定位和命名網際網路上的資源。

因為要通過多樣的方式識別資源(人的名字可能相同,然而計算機檔案只能通過唯一的路徑名稱組合訪問),所以需要標準的識別WWW資源的途徑。為了滿足這種需要,Tim Berners-Lee 引入了標準的識別、定位和命名的途徑:URI、URL和URN。

  • URI:Uniform Resource Identifier,統一資源識別符號
  • URL:Uniform Resource Locator,統一資源定位符
  • URN:Uniform Resource Name,統一資源名稱

URL 和 URN 都屬於 URI,URI 和 URL 的區別是:URL 更具體。URI 和 URL 都定義了什麼是資源。但 URL 還定義瞭如何獲得資源。

請求頭欄位

請求頭用來傳遞客戶端的更多資訊,以及傳遞解析訊息主體的必要資訊。如

User-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows NT)
Host: example.com
Accept-Language: en-us
Accept-Encoding: gzip, deflate

常見請求頭欄位有

  • Accept: 客戶端接受哪些 Mine 型別。如 Accept: text/html
  • Accept-Encoding: 支援的編碼型別。如 gzip, deflate, sdch
  • Accept-Language: 可接受的語言。如 en-US,en;q=0.8
  • User-Agent:一個標識客戶端的字串。如 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML,like Gecko) Chrome/38.0.2125.101 Safari/537.36
  • Cookie: Cookie。如 sessionid=c8422b97-98e2-4bc6-aa31-9b667d6ca4a5; theme=4;
  • Referer: 從那個頁面到的該頁面。

空行

表示頭欄位區完成,訊息主體開始(如果有訊息主體的話)。

訊息主體

訊息主體是可選的,訊息主體是請求訊息的承載資料。比如在提交POST表單,並且表單方法不是GET時,表單資料就是打包在訊息主體內的。

響應訊息結構

響應訊息由一個狀態行、響應頭欄位、一個空行、訊息主體構成。如

HTTP/1.0 200 OK
MIME-Version: 1.0
Date: Mon, 8 Jan 2010 4:59:42 GMT
Server: Apcha-Coyote/1.1
Content-Type: text/html
Content-Length: 42092

<html>
...
</html>

狀態行

由 http 版本、狀態碼、狀態描述文字構成。如
HTTP/1.1 200 OK

狀態碼

HTTP 狀態碼(HTTP Status Code)是用以表示網頁伺服器 HTTP 響應狀態的3位數字程式碼。

所有的狀態碼的第一個數字代表了響應的五種狀態之一:

  • 1xx:代表請求已被接受,需要繼續處理。這類響應是臨時響應,只包含狀態行和某些可選的響應頭資訊,並以空行 結束。
  • 2xx:代表請求接收、理解並且接受。
  • 3xx:代表需要客戶端採取進一步的操作才能完成請求。通常,這些狀態碼用來重定向,後續的請求地址(重定向目 標)在本次響應的Location域中指明。當且僅當後續的請求所使用的方法是GET或者HEAD時,使用者瀏覽器才可以 在沒有使用者介入的情況下自動提交所需要的後續請求。
  • 4xx:代表了客戶端看起來可能發生了錯誤,妨礙了伺服器的處理。除非響應的是一個HEAD請求,否則伺服器就應 該返回一個解釋當前錯誤狀況的實體,以及這是臨時的還是永久性的狀況。
  • 5xx:代表了伺服器在處理請求的過程中有錯誤或者異常狀態發生,,也有可能是伺服器意識到以當前的軟硬體資源 無法完成對請求的處理。

常見狀態碼有:

  • 200: 請求已經成功,請求所希望的響應頭或者資料體將隨著此響應返回
  • 202: 伺服器已接受請求,但尚未處理。正如它可能被拒絕一樣,最終該請求可能會也可能不會被執行。在非同步操作的場合下,沒有比傳送這個狀態碼更方便的做法了
  • 204: 伺服器成功處理了請求,但不需要返回任何實體內容,並且希望返回更新了的元資訊
  • 304: 被請求的資源內容沒有發生更改
  • 400: 包含語法錯誤,無法被伺服器解析
  • 403: 伺服器已經接收請求,但是拒絕執行
  • 404: 請求失敗,請求所希望得到的資源未在伺服器上發現
  • 408: 請求超時。客戶端可以再次提交這一請求而無需任何修改
  • 500: 伺服器內部錯誤,無法處理請求
  • 502: 作為閘道器或者代理工作的伺服器嘗試執行請求時,從上游伺服器接收到無效響應
  • 504: 作為閘道器或者代理工作的伺服器嘗試執行請求時,未能及時從上游伺服器(URI標識出的伺服器,例如HTTP、FTP、LDAP)或者輔助伺服器(例如DNS)收到響應

響應頭欄位

和請求訊息類似,首部欄位會包括伺服器本身的一些資訊指示、以及響應訊息本身的元資料。如

MIME-Version: 1.0
Date: Mon, 8 Jan 2010 4:59:42 GMT
Server: Apcha-Coyote/1.1
Content-Type: text/html
Content-Length: 42092

常見響應頭有:

  • Content-Encoding: 資料的編碼型別。如 Content-Encoding: gzip
  • Server: 伺服器的名稱。如 Server:thin 1.5.0 codename Knife
  • Location: 通知客戶端新的資源位置。如 Location: http://www.github.com/login
  • Content-Type: 響應資料的型別。如 Content-Type:text/html; charset=UTF-8
  • Content-Encoding: 響應資料的編碼格式。如 gzip。客戶端會根據該值對響應內容解碼。

訊息主體

訊息主體是響應訊息的承載資料。