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伺服器的程式規模小,因而通訊速度很快。
瀏覽器與伺服器通訊的過程
- 客戶端發起連線
- 客戶端傳送請求
- 伺服器響應請求
- 伺服器關閉連線
請求訊息結構
一個請求訊息是由請求行、請求頭欄位、一個空行和訊息主體構成。如
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
。客戶端會根據該值對響應內容解碼。
訊息主體
訊息主體是響應訊息的承載資料。