1. 程式人生 > >HTTP狀態碼及HTTP 1.1與HTTP 1.0的比較

HTTP狀態碼及HTTP 1.1與HTTP 1.0的比較

HTTP 1.1與HTTP 1.0的比較

一個WEB站點每天可能要接收到上百萬的使用者請求,為了提高系統的效率,HTTP 1.0規定瀏覽器與伺服器只保持短暫的連線,瀏覽器的每次請求都需要與伺服器建立一個TCP連線,伺服器完成請求處理後立即斷開TCP連線,伺服器不跟蹤每個客戶也不記錄過去的請求。但是,這也造成了一些效能上的缺陷,例如,一個包含有許多影象的網頁檔案中並沒有包含真正的影象資料內容,而只是指明瞭這些影象的URL地址,當WEB瀏覽器訪問這個網頁檔案時,瀏覽器首先要發出針對該網頁檔案的請求,當瀏覽器解析WEB伺服器返回的該網頁文件中的HTML內容時,發現其中的< img>影象標籤後,瀏覽器將根據< img>標籤中的src屬性所指定的URL地址再次向伺服器發出下載影象資料的請求,如圖所示。

這裡寫圖片描述

顯 然,訪問一個包含有許多影象的網頁檔案的整個過程包含了多次請求和響應,每次請求和響應都需要建立一個單獨的連線,每次連線只是傳輸一個文件和影象,上一次和下一次請求完全分離。即使影象檔案都很小,但是客戶端和伺服器端每次建立和關閉連線卻是一個相對比較費時的過程,並且會嚴重影響客戶機和伺服器的性 能。當一個網頁檔案中包含Applet,JavaScript檔案,CSS檔案等內容時,也會出現類似上述的情況。

為了克服HTTP 1.0的這個缺陷,HTTP 1.1支援持久連線,在一個TCP連線上可以傳送多個HTTP請求和響應,減少了建立和關閉連線的消耗和延遲。一個包含有許多影象的網頁檔案的多個請求和應答可以在一個連線中傳輸,但每個單獨的網頁檔案的請求和應答仍然需要使用各自的連線。HTTP 1.1還允許客戶端不用等待上一次請求結果返回,就可以發出下一次請求,但伺服器端必須按照接收到客戶端請求的先後順序依次回送響應結果,以保證客戶端能夠區分出每次請求的響應內容,這樣也顯著地減少了整個下載過程所需要的時間。

基於HTTP 1.1協議的客戶機與伺服器的資訊交換過程,如圖所示。

這裡寫圖片描述

HTTP1.0中認為每臺伺服器都繫結一個唯一的IP地址,因此,請求訊息中的URL並沒有傳遞主機名(hostname)。但隨著虛擬主機技術的發展,在一臺物理伺服器上可以存在多個虛擬主機(Multi-homed Web Servers),並且它們共享一個IP地址。
HTTP1.1的請求訊息和響應訊息都應支援Host頭域,且請求訊息中如果沒有Host頭域會報告一個錯誤(400 Bad Request)。此外,伺服器應該接受以絕對路徑標記的資源請求。

HTTP 1.1還提供了與身份認證、狀態管理和Cache快取等機制相關的請求頭和響應頭。

HTTP 協議老的標準是HTTP/1.0,目前最通用的標準是HTTP/1.1。HTTP/1.1是在HTTP/1.0基礎上的升級,增加了一些功能,全面相容 HTTP/1.0。HTTP/1.0不支援檔案斷點續傳,目前的Web伺服器絕大多數都採用了HTTP/1.1。

RANGE:bytes是HTTP/1.1新增內容,HTTP/1.0每次傳送檔案都是從檔案頭開始,即0位元組處開始。RANGE:bytes=XXXX表示要求伺服器從檔案XXXX位元組處開始傳送,這就是我們平時所說的斷點續傳!

1xx(臨時響應)

表示臨時響應並需要請求者繼續執行操作的狀態程式碼。
程式碼 說明
100(繼續) 請求者應當繼續提出請求。 伺服器返回此程式碼表示已收到請求的第一部分,正在等待其餘部分。
101(切換協議) 請求者已要求伺服器切換協議,伺服器已確認並準備切換。

2xx (成功)

表示成功處理了請求的狀態程式碼。
程式碼 說明
200(成功) 伺服器已成功處理了請求。 通常,這表示伺服器提供了請求的網頁。 如果針對您的 robots.txt 檔案顯示此狀態程式碼,則表示 Googlebot 已成功檢索到該檔案。
201(已建立) 請求成功並且伺服器建立了新的資源。
202(已接受,但未處理) 伺服器已接受請求,但尚未處理。
203(非授權資訊) 伺服器已成功處理了請求,但返回的資訊可能來自另一來源。
204(無內容) 伺服器成功處理了請求,但沒有返回任何內容。
205(重置內容) 伺服器成功處理了請求,但沒有返回任何內容。 與 204 響應不同,此響應要求請求者重置文件檢視(例如,清除表單內容以輸入新內容)。
206(部分內容) 伺服器成功處理了部分 GET 請求。 類似於 FlashGet 或者迅雷這類的 HTTP 下載工具都是使用此類響應實現斷點續傳或者將一個大文件分解為多個下載段同時下載。

3xx (重定向)

要完成請求,需要進一步操作。 通常,這些狀態程式碼用來重定向。 Google 建議您在每次請求中使用重定向不要超過 5 次。 您可以使用網站管理員工具檢視一下 Googlebot 在抓取重定向網頁時是否遇到問題。 診斷下的網路抓取頁中列出了由於重定向錯誤而導致 Googlebot 無法抓取的網址。
程式碼 說明
300(多種選擇) 客戶請求的文件可以在多個位置找到,這些位置已經在返回的文件內列出。如果伺服器要提出優先選擇,則應該在Location應答頭指明。
301(永久移動) 客戶請求的文件在其他地方,新的URL在Location頭中給出,瀏覽器應該自動地訪問新的URL。
302(臨時移動) 類似於301,但新的URL應該被視為臨時性的替代,而不是永久性的。注意,在HTTP1.0中對應的狀態資訊是“Moved Temporatily”。
出現該狀態程式碼時,瀏覽器能夠自動訪問新的URL,因此它是一個很有用的狀態程式碼。
注意這個狀態程式碼有時候可以和301替換使用。例如,如果瀏覽器錯誤地請求http://host/~user(缺少了後面的斜槓),有的伺服器返回301,有的則返回302。
嚴格地說,我們只能假定只有當原來的請求是GET時瀏覽器才會自動重定向。請參見307。
303(檢視其他位置) 類似於301/302,不同之處在於,如果原來的請求是POST,Location頭指定的重定向目標文件應該通過GET提取(HTTP 1.1新)。
304(未修改) 自從上次請求後,請求的網頁未修改過。 伺服器返回此響應時,不會返回網頁內容。
如果網頁自請求者上次請求後再也沒有更改過,您應當將伺服器配置為返回此響應(稱為 If-Modified-Since HTTP 標頭)。 由於伺服器可以告訴 Googlebot 自從上次抓取後網頁沒有變更,因此可節省頻寬和開銷

305(使用代理) 請求者只能使用代理訪問請求的網頁。 如果伺服器返回此響應,還表示請求者應使用代理。
307(臨時重定向) 和302(Found)相同。許多瀏覽器會錯誤地響應302應答進行重定向,即使原來的請求是POST,即使它實際上只能在POST請求的應答是303時 才能重定向。由於這個原因,HTTP 1.1新增了307,以便更加清除地區分幾個狀態程式碼:當出現303應答時,瀏覽器可以跟隨重定向的GET和POST請求;如果是307應答,則瀏覽器只能跟隨對GET請求的重定向。(HTTP 1.1新)

4xx(請求錯誤)

這些狀態程式碼表示請求可能出錯,妨礙了伺服器的處理。
程式碼 說明
400(語法錯誤請求) 伺服器不理解請求的語法。 1、語義有誤,當前請求無法被伺服器理解。除非進行修改,否則客戶端不應該重複提交這個請求。2、請求引數有誤。
401(未授權) 請求要求身份驗證。 對於需要登入的網頁,伺服器可能返回此響應。
403(禁止) 伺服器拒絕請求。伺服器理解客戶的請求,但拒絕處理它。通常由於伺服器上檔案或目錄的許可權設定導致。
404(未找到) 伺服器找不到請求的網頁。 例如,對於伺服器上不存在的網頁經常會返回此程式碼。
405(方法禁用) 請求方法(GET、POST、HEAD、DELETE、PUT、TRACE等)對指定的資源不適用。(HTTP 1.1新)
406(不接受) 指定的資源已經找到,但它的MIME型別和客戶在Accpet頭中所指定的不相容(HTTP 1.1新)。
407(需要代理授權) 類似於401,表示客戶必須先經過代理伺服器的授權。(HTTP 1.1新)
408(請求超時) 在伺服器許可的等待時間內,客戶一直沒有發出任何請求。客戶可以在以後重複同一請求。(HTTP 1.1新)
409(衝突) 通常和PUT請求有關。由於請求和資源的當前狀態相沖突,因此請求不能成功。(HTTP 1.1新)
410(已刪除) 所請求的文件已經不再可用,而且伺服器不知道應該重定向到哪一個地址。它和404的不同在於,返回407表示文件永久地離開了指定的位置,而404表示由於未知的原因文件不可用。(HTTP 1.1新)
411(需要有效長度) 伺服器不能處理請求,除非客戶傳送一個Content-Length頭。(HTTP 1.1新)
412(未滿足前提條件) 伺服器未滿足請求者在請求中設定的其中一個前提條件。
413(請求實體過大) 伺服器無法處理請求,因為請求實體過大,超出伺服器的處理能力。
414(請求的 URI 過長) 請求的 URI(通常為網址)過長,伺服器無法處理。
415(不支援的媒體型別) 請求的格式不受請求頁面的支援。
416(請求範圍不符合要求) 如果頁面無法提供請求的範圍,則伺服器會返回此狀態程式碼。
417(未滿足期望值) 伺服器未滿足”期望”請求標頭欄位的要求。

5xx(伺服器錯誤)

這些狀態程式碼表示伺服器在嘗試處理請求時發生內部錯誤。 這些錯誤可能是伺服器本身的錯誤,而不是請求出錯。
程式碼 說明
500(伺服器內部錯誤) 伺服器遇到錯誤,無法完成請求。
501(尚未實施) 伺服器不具備完成請求的功能。 例如,伺服器無法識別請求方法時可能會返回此程式碼。
502(錯誤閘道器) 作為閘道器或者代理工作的伺服器嘗試執行請求時,從上游伺服器接收到無效的響應。
503(服務不可用) 伺服器目前無法使用(由於超載或停機維護)。 通常,這只是暫時狀態。 例如,Servlet可能在資料庫連線池已滿的情況下返回503。伺服器返回503時可以提供一個Retry-After頭。
504(閘道器超時) 由作為代理或閘道器的伺服器使用,表示不能及時地從遠端伺服器獲得應答。(HTTP 1.1新)
505(HTTP 版本不受支援) 伺服器不支援請求中所用的 HTTP 協議版本。