天天看點

架構基礎之了解一下HTTP協定

作者:微笑橙子mR

一、概念

HTTP協定:即超文本傳輸協定(Hypertext transfer protocol)。是一種詳細規定了浏覽器和Web伺服器之間互相通信的規則,它允許将超文本标記語言(HTML)文檔從Web伺服器傳送到用戶端的浏覽器。

它可以使浏覽器更加高效,使網絡傳輸減少。它不僅保證計算機正确快速地傳輸超文本文檔,還确定傳輸文檔中的哪一部分,以及哪部分内容首先顯示(如文本先于圖形)等。

HTTP是一個應用層協定,由請求和響應構成,是一個标準的用戶端伺服器模型。HTTP是一個無狀态的協定。

在Internet中所有的傳輸都是通過TCP/IP進行的。HTTP協定作為TCP/IP模型中應用層的協定也不例外。HTTP協定通常承載于TCP協定之上,有時也承載于TLS或SSL協定層之上,這個時候,就成了我們常說的HTTPS。

HTTP是一個屬于應用層的面向對象的協定,由于其簡捷、快速的方式,适用于分布式超媒體資訊系統。它于1990年提出,經過幾年的使用與發展,得到不斷地完善和擴充。目前在WWW中使用的是HTTP/1.0的第六版,HTTP/1.1的規範化工作正在進行之中,而且HTTP-NG(Next Generation of HTTP)的建議已經提出。

無狀态協定:

協定的狀态是指下一次傳輸可以“記住”這次傳輸資訊的能力。

HTTP是不會為了下一次連接配接而維護這次連接配接所傳輸的資訊,為了保證伺服器記憶體。

比如客戶獲得一張網頁之後關閉浏覽器,然後再一次啟動浏覽器,再登陸該網站,但是伺服器并不知道客戶關閉了一次浏覽器。

由于Web伺服器要面對很多浏覽器的并發通路,為了提高Web伺服器對并發通路的處理能力,在設計HTTP協定時規定Web伺服器發送HTTP應答封包和文檔時,不儲存送出請求的Web浏覽器程序的任何狀态資訊。這有可能出現一個浏覽器在短短幾秒之内兩次通路同一對象時,伺服器程序不會因為已經給它發過應答封包而不接受第二期服務請求。由于Web伺服器不儲存發送請求的Web浏覽器程序的任何資訊,是以HTTP協定屬于無狀态協定(Stateless Protocol)。

HTTP協定是無狀态的和Connection: keep-alive的差別:

無狀态是指協定對于事務處理沒有記憶能力,伺服器不知道用戶端是什麼狀态。從另一方面講,打開一個伺服器上的網頁和你之前打開這個伺服器上的網頁之間沒有任何聯系。

HTTP是一個無狀态的面向連接配接的協定,無狀态不代表HTTP不能保持TCP連接配接,更不能代表HTTP使用的是UDP協定(無連接配接)。

從HTTP/1.1起,預設都開啟了Keep-Alive,保持連接配接特性,簡單地說,當一個網頁打開完成後,用戶端和伺服器之間用于傳輸HTTP資料的TCP連接配接不會關閉,如果用戶端再次通路這個伺服器上的網頁,會繼續使用這一條已經建立的連接配接。

Keep-Alive不會永久保持連接配接,它有一個保持時間,可以在不同的伺服器軟體(如Apache)中設定這個時間。

HTTP中文譯名問題

HTTP超文本傳輸協定,聽上去像是傳輸層的協定一樣,但事實上大家都知道HTTP和FTP一樣都是屬于應用層的協定。既然是應用層的協定,怎 麼就取這樣一個誤導人的名稱?在對TCP/IP協定還不熟悉的時候,這很容易讓人誤解和納悶的。在wiki上有這麼一段話:

HTTP在中國大陸被翻譯為“超文本傳輸協定”,因為“transfer”在中文裡有“傳輸”的含意。但依據 HTTP 定制者之一的 Roy Fielding博士的論文[1](6.5.3節),作者專門強調“transfer”表示的是“(表述狀态的)轉移” (Representational State Transfer),而不是“傳輸”(transport)。故其中文譯名“超文本傳輸協定”恰恰反映了這種誤解。更符合原義的譯名應該為“超文本轉移協定”。

二、特點

HTTP協定的主要特點可概括如下:

支援客戶/伺服器模式。支援基本認證和安全認證。

簡單快速:客戶向伺服器請求服務時,隻需傳送請求方法和路徑。請求方法常用的有GET、HEAD、POST。每種方法規定了客戶與伺服器聯系的類型不同。由于HTTP協定簡單,使得HTTP伺服器的程式規模小,因而通信速度很快。

靈活:HTTP允許傳輸任意類型的資料對象。正在傳輸的類型由Content-Type加以标記。

HTTP 0.9和1.0使用非持續連接配接:限制每次連接配接隻處理一個請求,伺服器處理完客戶的請求,并收到客戶的應答後,即斷開連接配接。

HTTP 1.1使用持續連接配接:不必為每個Web對象建立一個新的連接配接,一個連接配接可以傳送多個對象,采用這種方式可以節省傳輸時間。

無狀态:HTTP協定是無狀态協定。無狀态是指協定對于事務處理沒有記憶能力。缺少狀态意味着如果後續處理需要前面的資訊,則它必須重傳,這樣可能導緻每次連接配接傳送的資料量增大。另一方面,在伺服器不需要先前資訊時它的應答就較快。

永遠都是用戶端發起請求,伺服器回送響應。這樣就限制了使用HTTP協定,無法實作在用戶端沒有發起請求的時候,伺服器将消息推送給用戶端。

HTTP預設的端口号為80,HTTPS的端口号為443。

三、工作流程

一次HTTP操作稱為一個事務,其工作過程可分為四步:

首先客戶機與伺服器需要建立連接配接。隻要單擊某個超級連結,HTTP的工作開始。

建立連接配接後,客戶機發送一個請求給伺服器,請求方式的格式為:統一資源辨別符(URL)、協定版本号,後邊是MIME資訊包括請求修飾符、客戶機資訊和可能的内容。

伺服器接到請求後,給予相應的響應資訊,其格式為一個狀态行,包括資訊的協定版本号、一個成功或錯誤的代碼,後邊是MIME資訊包括伺服器資訊、實體資訊和可能的内容。

用戶端接收伺服器所傳回的資訊通過浏覽器顯示在使用者的顯示屏上,然後客戶機與伺服器斷開連接配接。

如果在以上過程中的某一步出現錯誤,那麼産生錯誤的資訊将傳回到用戶端,有顯示屏輸出。對于使用者來說,這些過程是由HTTP自己完成的,使用者隻要用滑鼠點選,等待資訊顯示就可以了。

HTTP是基于傳輸層的TCP協定,而TCP是一個端到端的面向連接配接的協定。所謂的端到端可以了解為程序到程序之間的通信。是以HTTP在開始傳輸之前,首先需要建立TCP連接配接,而TCP連接配接的過程需要所謂的“三次握手”。在TCP三向交握之後,建立了TCP連接配接,此時HTTP就可以進行傳輸了。一個重要的概念是面向連接配接,既HTTP在傳輸完成之間并不斷開TCP連接配接。在HTTP1.1中(通過Connection頭設定)這是預設行為。

四、頭域

每個頭域由一個域名,冒号(:)和域值三部分組成。域名是大小寫無關的,域值前可以添加任何數量的空格符,頭域可以被擴充為多行,在每行開始處,使用至少一個空格或制表符。

HTTP消息由用戶端到伺服器的請求和伺服器到用戶端的響應組成。請求消息和響應消息都是由開始行(對于請求消息,開始行就是請求行,對于響應消息,開始行就是狀态行),消息報頭(可選),空行(隻有CRLF的行),消息正文(可選)組成。

1、 請求消息

HTTP請求由三部分組成,分别是:請求行、消息報頭、請求正文。發出的請求消息格式如下:

請求行,例如GET /images/logo.gif HTTP/1.1,表示從/images目錄下請求logo.gif這個檔案。

請求頭,每一個報頭域都是由名字+“:”+空格+值 組成,消息報頭域的名字是大小寫無關的。例如Accept-Language: en

可選的消息體 請求行和标題必須以<CR><LF>作為結尾(也就是,回車然後換行)。空行内必須隻有<CR><LF>而無其他空格。在HTTP/1.1協定中,所有的請求頭,除post外,都是可選的。

(1)請求行

以一個請求方法開頭,以空格分開,後面跟着請求的URI和協定的版本。

格式如下:Method Request-URI HTTP-Version CRLF

Method表示請求方法;

Request-URI是一個統一資源辨別符;

HTTP-Version表示請求的HTTP協定版本;

CRLF表示回車和換行(除了作為結尾的CRLF外,不允許出現單獨的CR或LF字元)。

a.請求方法:

HTTP/1.1協定中共定義了八種方法(有時也叫“動作”)來表明Request-URI指定的資源的不同操作方式:GET 向特定的資源送出請求。注意:GET方法不應當被用于産生“副作用”的操作中,例如在web app.中。其中一個原因是GET可能會被網絡蜘蛛等随意通路。POST 向指定資源送出資料進行處理請求(例如送出表單或者上傳檔案)。資料被包含在請求體中。POST請求可能會導緻新的資源的建立和/或已有資源的修改。HEAD 向伺服器索要與GET請、求相一緻的響應,隻不過響應體将不會被傳回。這一方法可以在不必傳輸整個響應内容

一般情況下,就可以擷取包含在響應消息頭中的元資訊。該方法常用于測試超連結的有效性,是否可以通路,以及最近是否更新。PUT 向指定資源位置上傳其最新内容。DELETE 請求伺服器删除Request-URI所辨別的資源。TRACE 回顯伺服器收到的請求,主要用于測試或診斷。CONNECT HTTP/1.1協定中預留給能夠将連接配接改為管道方式的代理伺服器。OPTIONS 傳回伺服器針對特定資源所支援的HTTP請求方法。也可以利用向Web伺服器發送'*'的請求來測試伺服器的功能性。注:HTTP伺服器至少應該實作GET和HEAD方法,其他方法都是可選的。此外,除了上述方法,特定的HTTP伺服器還能夠擴充自定義的方法。

b.GET和POST的差別:

GET送出的資料會放在URL之後,以?分割URL和傳輸資料,參數之間以&相連,如EditPosts.aspx?name=test1&id=123456. POST方法是把送出的資料放在HTTP包的Body中。

GET送出的資料大小有限制,最多隻能有1024位元組(因為浏覽器對URL的長度有限制),而POST方法送出的資料沒有限制。

GET方式需要使用Request.QueryString來取得變量的值,而POST方式通過Request.Form來擷取變量的值。

GET方式送出資料,會帶來安全問題,比如一個登入頁面,通過GET方式送出資料時,使用者名和密碼将出現在URL上,如果頁面可以被緩存或者其他人可以通路這台機器,就可以從曆史記錄獲得該使用者的賬号和密碼。

(2)請求報頭

請求報頭允許用戶端向伺服器端傳遞請求的附加資訊以及用戶端自身的資訊。

常用的請求報頭:

Accept:浏覽器端可以接受的MIME類型。例如:Accept:image/gif,表明用戶端希望接受GIF圖象格式的資源;Accept:text/html,表明用戶端希望接受html文本。

Accept-Charset:Accept-Charset請求報頭域用于指定用戶端接受的字元集。例如:Accept-Charset:iso-8859-1,gb2312.如果在請求消息中沒有設定這個域,預設是任何字元集都可以接受。

Accept-Encoding:浏覽器申明自己可接收的編碼方法,通常指定壓縮方法,是否支援壓縮,支援什麼壓縮方法(gzip,deflate)

Accept-Language :浏覽器申明自己接收的語言。語言跟字元集的差別:中文是語言,中文有多種字元集,比如big5,gb2312,gbk等等;例如:Accept-Language: en-us。如果請求消息中沒有設定這個報頭域,伺服器假定用戶端對各種語言都可以接受。

Accept-Charset:浏覽器可接受的字元集。如果在請求消息中沒有設定這個域,預設表示任何字元集都可以接受。

User-Agent:告訴HTTP伺服器,用戶端使用的作業系統和浏覽器的名稱和版本。

例如:User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; CIBA; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0C; InfoPath.2; .NET4.0E)

Authorization:授權資訊,通常出現在對伺服器發送的WWW-Authenticate頭的應答中。主要用于證明用戶端有權檢視某個資源。當浏覽器通路一個頁面時,如果收到伺服器的響應代碼為401(未授權),可以發送一個包含Authorization請求報頭域的請求,要求伺服器對其進行驗證。

Host:(發送請求時,該頭域是必需的)主要用于指定被請求資源的Internet主機和端口号,它通常從HTTP URL中提取出來的,發送請求時,該報頭域是必需的。HTTP/1.1請求必須包含主機頭域,否則系統會以400狀态碼傳回。

例如: 我們在浏覽器中輸入:http://luyucheng.cnblogs.com/index.html

浏覽器發送的請求消息中,就會包含Host請求報頭域,如下:

Host:luyucheng.cnblogs.com

此處使用預設端口号80,若指定了端口号,則變成:Host:luyucheng.cnblogs.com:指定端口号

Cookie:最重要的請求頭之一, 将cookie的值發送給HTTP伺服器。

Content-Length:表示請求消息正文的長度。例如:Content-Length: 38。

Content-Type:例如:Content-Type: application/x-www-form-urlencoded。

From:請求發送者的email位址,由一些特殊的Web客戶程式使用,浏覽器不會用到它。

Range:可以請求實體的一個或者多個子範圍。例如,

表示頭500個位元組:bytes=0-499

表示第二個500位元組:bytes=500-999

表示最後500個位元組:bytes=-500

表示500位元組以後的範圍:bytes=500-

第一個和最後一個位元組:bytes=0-0,-1

同時指定幾個範圍:bytes=500-600,601-999

但是伺服器可以忽略此請求頭,如果無條件GET包含Range請求頭,響應會以狀态碼206(PartialContent)傳回而不是以200(OK)。

If-Modified-Since:把浏覽器端緩存頁面的最後修改時間發送到伺服器去,伺服器會把這個時間與伺服器上實際檔案的最後修改時間進行對比。如果時間一緻,那麼傳回304,用戶端就直接使用本地緩存檔案。如果時間不一緻,就會傳回200和新的檔案内容。用戶端接到之後,會丢棄舊檔案,把新檔案緩存起來,并顯示在浏覽器中。

例如:If-Modified-Since: Thu, 09 Feb 2012 09:07:57 GMT

If-None-Match:If-None-Match和ETag一起工作,工作原理是在HTTP Response中添加ETag資訊。當使用者再次請求該資源時,将在HTTP Request 中加入If-None-Match資訊(ETag的值)。如果伺服器驗證資源的ETag沒有改變(該資源沒有更新),将傳回一個304狀态告訴用戶端使用本地緩存檔案。否則将傳回200狀态和新的資源和Etag. 使用這樣的機制将提高網站的性能。例如: If-None-Match: "03f2b33c0bfcc1:0"。

Referer:包含一個URL,使用者從該URL代表的頁面出發通路目前請求的頁面。提供了Request的上下文資訊的伺服器,告訴伺服器我是從哪個連結過來的,比如從我首頁上連結到一個朋友那裡,他的伺服器就能夠從HTTP Referer中統計出每天有多少使用者點選我首頁上的連結通路他的網站。

例如: Referer:http://luyucheng.cnblogs.com/

Pragma:指定“no-cache”值表示伺服器必須傳回一個重新整理後的文檔,即使它是代理伺服器而且已經有了頁面的本地拷貝;在HTTP/1.1版本中,它和Cache-Control:no-cache作用一模一樣。Pargma隻有一個用法, 例如:Pragma: no-cache

注意: 在HTTP/1.0版本中,隻實作了Pragema:no-cache, 沒有實作Cache-Control

Connection:

例如:Connection: keep-alive 當一個網頁打開完成後,用戶端和伺服器之間用于傳輸HTTP資料的TCP連接配接不會關閉,如果用戶端再次通路這個伺服器上的網頁,會繼續使用這一條已經建立的連接配接。HTTP 1.1預設進行持久連接配接。利用持久連接配接的優點,當頁面包含多個元素時(例如Applet,圖檔),顯著地減少下載下傳所需要的時間。要實作這一點,Servlet需要在應答中發送一個Content-Length頭,最簡單的實作方法是:先把内容寫入ByteArrayOutputStream,然後在正式寫出内容之前計算它的大小。

Connection: close 代表一個Request完成後,用戶端和伺服器之間用于傳輸HTTP資料的TCP連接配接會關閉,當用戶端再次發送Request,需要重建立立TCP連接配接。

Host:(發送請求時,該頭域是必需的)主要用于指定被請求資源的Internet主機和端口号,它通常從HTTP URL中提取出來的。HTTP/1.1請求必須包含主機頭域,否則系統會以400狀态碼傳回。

例如: 我們在浏覽器中輸入:http://luyucheng.cnblogs.com/index.html,浏覽器發送的請求消息中,就會包含Host請求頭域:Host:http://luyucheng.cnblogs.com,此處使用預設端口号80,若指定了端口号,則變成:Host:指定端口号。

Cookie:最重要的請求頭之一, 将cookie的值發送給HTTP伺服器。

Authorization:授權資訊,通常出現在對伺服器發送的WWW-Authenticate頭的應答中。主要用于證明用戶端有權檢視某個資源。當浏覽器通路一個頁面時,如果收到伺服器的響應代碼為401(未授權),可以發送一個包含Authorization請求報頭域的請求,要求伺服器對其進行驗證。

UA-Pixels,UA-Color,UA-OS,UA-CPU:由某些版本的IE浏覽器所發送的非标準的請求頭,表示螢幕大小、顔色深度、作業系統和CPU類型。

From:請求發送者的email位址,由一些特殊的Web客戶程式使用,浏覽器不會用到它。

Range:可以請求實體的一個或者多個子範圍。例如,

表示頭500個位元組:bytes=0-499

表示第二個500位元組:bytes=500-999

表示最後500個位元組:bytes=-500

表示500位元組以後的範圍:bytes=500-

第一個和最後一個位元組:bytes=0-0,-1

同時指定幾個範圍:bytes=500-600,601-999

但是伺服器可以忽略此請求頭,如果無條件GET包含Range請求頭,響應會以狀态碼206(PartialContent)傳回而不是以200(OK)。

Cache-Control:指定請求和響應遵循的緩存機制。緩存指令是單向的(響應中出現的緩存指令在請求中未必會出現),且是獨立的(在請求消息或響應消息中設定Cache-Control并不會修改另一個消息處理過程中的緩存處理過程)。請求時的緩存指令包括no-cache、no-store、max-age、max-stale、min-fresh、only-if-cached,響應消息中的指令包括public、private、no-cache、no-store、no-transform、must-revalidate、proxy-revalidate、max-age、s-maxage。

Cache-Control:Public 可以被任何緩存所緩存

Cache-Control:Private 内容隻緩存到私有緩存中

Cache-Control:no-cache 所有内容都不會被緩存

Cache-Control:no-store 用于防止重要的資訊被無意的釋出。在請求消息中發送将使得請求和響應消息都不使用緩存。

Cache-Control:max-age 訓示客戶機可以接收生存期不大于指定時間(以秒為機關)的響應。

Cache-Control:min-fresh 訓示客戶機可以接收響應時間小于目前時間加上指定時間的響應。

Cache-Control:max-stale 訓示客戶機可以接收超出逾時期間的響應消息。如果指定max-stale消息的值,那麼客戶機可以接收超出逾時期指定值之内的響應消息。

2、響應消息

HTTP響應由三部分組成,分别是:狀态行、響應報頭、響應正文。

用戶端向伺服器發送一個請求,伺服器以一個狀态行作為響應,響應的内容包括:消息協定的版本、成功或者錯誤編碼、伺服器資訊、實體元資訊以及必要的實體内容。根據響應類别的類别,伺服器響應裡可以含實體内容,但不是所有的響應都有實體内容。

(1)狀态行

響應頭第一行也稱為狀态行,格式如下:

HTTP-Version 空格 Status-Code 空格 Reason-Phrase CRLF

HTTP-Version表示HTTP版本,例如為HTTP/1.1。

Status-Code是結果狀态響應碼,用三個數字表示。

Reason-Phrase是個簡單的文本描述,解釋Status-Code的具體原因。Status-Code用于機器自動識别,Reason-Phrase用于人工了解。Status-Code的第一個數字代表響應類别,可能取5個不同的值。後兩個數字沒有分類作用。Status-Code的第一個數字代表響應的類别,後續兩位描述在該類響應下發生的具體狀況

a.狀态響應碼:

無論你何時浏覽一個網頁,你的電腦都會通過一個使用HTTP協定的伺服器來擷取所請求的資料。在你請求的網頁顯示在浏覽器之前,支配網頁的網站伺服器會傳回一個包含有狀态碼的HTTP頭檔案。這個狀态碼提供了有關所請求網頁的相關條件資訊。如果一切正常,一個标準網頁會收到一條諸如200的狀态碼。當然我們的目的不是去研究200響應碼,而是去探讨那些代表出現錯誤資訊的伺服器頭檔案響應碼,例如表示“未找到指定網頁”的404碼。

搜尋公衆号後端架構師背景回複“架構整潔”,擷取一份驚喜禮包。

1xx(資訊類):表示接收到請求并且繼續處理

100 客戶必須繼續送出請求

101 客戶要求伺服器根據請求轉換HTTP協定版本

2xx(響應成功):表示動作被成功接收、了解和接受

200 表明該請求被成功地完成,所請求的資源發送回用戶端

201 提示知道新檔案的URL

202 接受和處理、但處理未完成

203 傳回資訊不确定或不完整

204 請求收到,但傳回資訊為空

205 伺服器完成了請求,使用者代理必須複位目前已經浏覽過的檔案

206 伺服器已經完成了部分使用者的GET請求

3xx(重定向類):為了完成指定的動作,必須接受進一步處理

300 請求的資源可在多處得到

301 本網頁被永久性轉移到另一個URL

302 請求的網頁被轉移到一個新的位址,但客戶通路仍繼續通過原始URL位址,重定向,新的URL會在response中的Location中傳回,浏覽器将會使用新的URL發出新的Request。

303 建議客戶通路其他URL或通路方式

304 自從上次請求後,請求的網頁未修改過,伺服器傳回此響應時,不會傳回網頁内容,代表上次的文檔已經被緩存了,還可以繼續使用

305 請求的資源必須從伺服器指定的位址得到

306 前一版本HTTP中使用的代碼,現行版本中不再使用

307 申明請求的資源臨時性删除

4xx(用戶端錯誤類):請求包含錯誤文法或不能正确執行

400 用戶端請求有文法錯誤,不能被伺服器所了解

401 請求未經授權,這個狀态代碼必須和WWW-Authenticate報頭域一起使用

HTTP 401.1 未授權:登入失敗

HTTP 401.2 未授權:伺服器配置問題導緻登入失敗

HTTP 401.3 ACL 禁止通路資源

HTTP 401.4 未授權:授權被篩選器拒絕

HTTP 401.5 未授權:ISAPI 或 CGI 授權失敗

402 保留有效ChargeTo頭響應

403 禁止通路,伺服器收到請求,但是拒絕提供服務

HTTP 403.1 禁止通路:禁止可執行通路

HTTP 403.2 禁止通路:禁止讀通路

HTTP 403.3 禁止通路:禁止寫通路

HTTP 403.4 禁止通路:要求 SSL

HTTP 403.5 禁止通路:要求 SSL 128

HTTP 403.6 禁止通路:IP 位址被拒絕

HTTP 403.7 禁止通路:要求客戶證書

HTTP 403.8 禁止通路:禁止站點通路

HTTP 403.9 禁止通路:連接配接的使用者過多

HTTP 403.10 禁止通路:配置無效

HTTP 403.11 禁止通路:密碼更改

HTTP 403.12 禁止通路:映射器拒絕通路

HTTP 403.13 禁止通路:客戶證書已被吊銷

HTTP 403.15 禁止通路:客戶通路許可過多

HTTP 403.16 禁止通路:客戶證書不可信或者無效

HTTP 403.17 禁止通路:客戶證書已經到期或者尚未生效

404 一個404錯誤表明可連接配接伺服器,但伺服器無法取得所請求的網頁,請求資源不存在。例如:輸入了錯誤的URL

405 使用者在Request-Line字段定義的方法不允許

406 根據使用者發送的Accept拖,請求資源不可通路

407 類似401,使用者必須首先在代理伺服器上得到授權

408 用戶端沒有在使用者指定的餓時間内完成請求

409 對目前資源狀态,請求不能完成

410 伺服器上不再有此資源且無進一步的參考位址

411 伺服器拒絕使用者定義的Content-Length屬性請求

412 一個或多個請求頭字段在目前請求中錯誤

413 請求的資源大于伺服器允許的大小

414 請求的資源URL長于伺服器允許的長度

415 請求資源不支援請求項目格式

416 請求中包含Range請求頭字段,在目前請求資源範圍内沒有range訓示值,請求也不包含If-Range請求頭字段

417 伺服器不滿足請求Expect頭字段指定的期望值,如果是代理伺服器,可能是下一級伺服器不能滿足請求長。

5xx(服務端錯誤類):伺服器不能正确執行一個正确的請求

500 伺服器遇到錯誤,無法完成請求

HTTP 500.11 伺服器關閉

HTTP 500.12 應用程式重新啟動

HTTP 500.13 伺服器太忙

HTTP 500.14 應用程式無效

HTTP 500.15 不允許請求 global.asa

HTTP 500.100 内部伺服器錯誤 - ASP 錯誤

501 未實作

502 網關錯誤

503 由于超載或停機維護,伺服器目前無法使用,一段時間後可能恢複正常

(2)響應報頭

伺服器需要傳遞許多附加資訊,這些資訊不能全放在狀态行裡。是以,需要另行定義響應報頭,用來描述這些附加資訊。響應報頭主要描述伺服器的資訊和Request-URI的資訊。

常用的響應報頭:

Location:重定向接受者到一個新的位置。Location響應報頭域常用在更換域名的時候。

Server:指明HTTP伺服器用來處理請求的軟體資訊。例如:Server: Microsoft-IIS/7.5、Server:Apache-Coyote/1.1。此域能包含多個産品辨別和注釋,産品辨別一般按照重要性排序。

Refresh:表示浏覽器應該在多少時間之後重新整理文檔,以秒計。

WWW-Authenticate:WWW-Authenticate響應報頭域必須被包含在401(未授權的)響應消息中,用戶端收到401響應消息時候,并發送Authorization報頭域請求伺服器對其進行驗證時,服務端響應報頭就包含該報頭域。

WWW-Authenticate:Basic realm="Basic Auth Test!" //可以看出伺服器對請求資源采用的是基本驗證機制。

Connection:

例如:

Connection: keep-alive 當一個網頁打開完成後,用戶端和伺服器之間用于傳輸HTTP資料的TCP連接配接不會關閉,如果用戶端再次通路這個伺服器上的網頁,會繼續使用這一條已經建立的連接配接。

Connection: close 代表一個Request完成後,用戶端和伺服器之間用于傳輸HTTP資料的TCP連接配接會關閉,當用戶端再次發送Request,需要重建立立TCP連接配接。

Referer:包含一個URL,使用者從該URL代表的頁面出發通路目前請求的頁面。提供了Request的上下文資訊的伺服器,告訴伺服器我是從哪個連結過來的,例如從我首頁上連結到一個朋友那裡,他的伺服器就能夠從HTTP Referer中統計出每天有多少使用者點選我首頁上的連結通路他的網站。

例如: Referer:http://luyucheng.cnblogs.com/

Content-Encoding:WEB伺服器表明自己使用了什麼壓縮方法(gzip,deflate)壓縮響應中的對象。隻有在解碼之後才可以得到Content-Type頭指定的内容類型。利用gzip壓縮文檔能夠顯著地減少HTML文檔的下載下傳時間。例如:Content-Encoding:gzip

Content-Language:WEB伺服器告訴浏覽器自己響應的對象所用的自然語言。沒有設定該域則認為實體内容将提供給所有的語言閱讀。例如:Content-Language:da。

Content-Range:用于指定整個實體中的一部分的插入位置,他也訓示了整個實體的長度。在伺服器向客戶傳回一個部分響應,它必須描述響應覆寫的範圍和整個實體長度。一般格式:Content-Range:bytes-unitSPfirst-byte-pos-last-byte-pos/entity-length。例如,傳送頭500個位元組次字段的形式:Content-Range:bytes0-499/1234如果一個HTTP消息包含此節(例如,對範圍請求的響 應或對一系列範圍的重疊請求),Content-Range表示傳送的範圍。

Content-Type:發送給接收者的實體正文的媒體類型。媒體類型的格式為:大類/小類,例如text/html。

例如:

Content-Type: text/html;charset=utf-8

Content-Type: image/jpeg

Last-Modified:資源的最後修改日期和時間。

ETag:和If-None-Match 配合使用。

Expires:響應過期的日期和時間。為了讓代理伺服器或浏覽器在一段時間以後更新緩存中(再次通路曾通路過的頁面時,直接從緩存中加載,縮短響應時間和降低伺服器負載)的頁面,我們可以使用Expires實體報頭域指定頁面過期的時間。例如:Expires:Thu,15 Sep 2006 16:23:12 GMT

HTTP1.1的用戶端和緩存必須将其他非法的日期格式(包括0)看作已經過期。例如:為了讓浏覽器不要緩存頁面,我們也可以利用Expires實體報頭域,設定為0,jsp中程式如下:response.setDateHeader("Expires","0");

Allow:伺服器支援哪些請求方法(如GET、POST等)。

Date:表示消息發送的時間,時間的描述格式由rfc822定義。例如,Date:Mon,31Dec200104:25:57GMT。Date描述的時間表示世界标準時,換算成本地時間,需要知道使用者所在的時區。你可以用setDateHeader來設定這個頭以避免轉換時間格式的麻煩

Expires:指明應該在什麼時候認為文檔已經過期,進而不再緩存它,重新從伺服器擷取,會更新緩存。過期之前使用本地緩存。HTTP1.1的用戶端和緩存會将非法的日期格式(包括0)看作已經過期。例如:為了讓浏覽器不要緩存頁面,我們也可以将Expires實體報頭域,設定為0。

例如: Expires: Tue, 08 Feb 2022 11:35:14 GMT

P3P:用于跨域設定Cookie, 這樣可以解決iframe跨域通路cookie的問題

例如: P3P: CP=CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR

Set-Cookie:非常重要的header, 用于把cookie發送到用戶端浏覽器,每一個寫入cookie都會生成一個Set-Cookie。

例如: Set-Cookie: sc=4c31523a; path=/; domain=.acookie.taobao.com

IANA(The Internet Assigned Numbers Authority,網際網路數字配置設定機構)定義了8個大類的媒體類型,分别是:

application (例如: application/vnd.ms-excel)

audio (例如: audio/mpeg)

image (例如: image/png)

message (例如,:message/HTTP)

model(例如:model/vrml)

multipart (例如:multipart/form-data)

text(例如:text/html)

video(例如:video/quicktime)

五、緩存的實作原理

Web緩存(cache)位于Web伺服器和用戶端之間,緩存會根據請求儲存輸出内容的副本,例如html頁面,圖檔,檔案,當下一個請求來到的時候:如果是相同的URL,緩存直接使用副本響應通路請求,而不是向源伺服器再次發送請求。

HTTP協定定義了相關的消息頭來使Web緩存盡可能好的工作。

1.緩存的優點

減少相應延遲:因為請求從緩存伺服器(離用戶端更近)而不是源伺服器被相應,這個過程耗時更少,讓Web伺服器看上去相應更快。

減少網絡帶寬消耗:當副本被重用時會減低用戶端的帶寬消耗;客戶可以節省帶寬費用,控制帶寬的需求的增長并更易于管理。

2.用戶端緩存生效的常見流程伺服器收到請求時,會在200OK中回送該資源的Last-Modified和ETag頭,用戶端将該資源儲存在cache中,并記錄這兩個屬性。當用戶端需要發送相同的請求時,會在請求中攜帶If-Modified-Since和If-None-Match兩個頭。兩個頭的值分别是響應中Last-Modified和ETag頭的值。伺服器通過這兩個頭判斷本地資源未發生變化,用戶端不需要重新下載下傳,傳回304響應。

3.Web緩存機制

HTTP/1.1中緩存的目的是為了在很多情況下減少發送請求,同時在許多情況下可以不需要發送完整響應。前者減少了網絡回路的數量;HTTP利用一個“過期(expiration)”機制來為此目的。後者減少了網絡應用的帶寬;HTTP用“驗證(validation)”機制來為此目的。

HTTP定義了3種緩存機制:

(1)、Freshness:允許一個回應消息可以在源伺服器不被重新檢查,并且可以由伺服器和用戶端來控制。例如,Expires回應頭給了一個文檔不可用的時間。Cache-Control中的max-age辨別指明了緩存的最長時間;

(2)、Validation:用來檢查以一個緩存的回應是否仍然可用。例如,如果一個回應有一個Last-Modified回應頭,緩存能夠使用If-Modified-Since來判斷是否已改變,以便判斷根據情況發送請求;

(3)、Invalidation:在另一個請求通過緩存的時候,常常有一個副作用。例如,如果一個URL關聯到一個緩存回應,但是其後跟着POST、PUT和DELETE的請求的話,緩存就會過期。

六、應用

1. 斷點續傳的實作原理

HTTP協定的GET方法,支援隻請求某個資源的某一部分;

206 Partial Content 部分内容響應;

Range 請求的資源範圍;

Content-Range 響應的資源範圍;

在連接配接斷開重連時,用戶端隻請求該資源未下載下傳的部分,而不是重新請求整個資源,來實作斷點續傳。

分塊請求資源執行個體:

Eg1:Range: bytes=306302- :請求這個資源從306302個位元組到末尾的部分;

Eg2:Content-Range: bytes 306302-604047/604048:響應中訓示攜帶的是該資源的第306302-604047的位元組,該資源共604048個位元組;

用戶端通過并發的請求相同資源的不同片段,來實作對某個資源的并發分塊下載下傳。進而達到快速下載下傳的目的。目前流行的FlashGet和迅雷基本都是這個原理。

2. 多線程下載下傳的原理

下載下傳工具開啟多個發出HTTP請求的線程;

每個HTTP請求隻請求資源檔案的一部分:Content-Range: bytes 20000-40000/47000;

合并每個線程下載下傳的檔案。

3.HTTP代理

HTTP代理伺服器:

代理伺服器英文全稱是Proxy Server,其功能就是代理網絡使用者去取得網絡資訊。形象地說:它是網絡資訊的中轉站。

代理伺服器是介于浏覽器和Web伺服器之間的一台伺服器,有了它之後,浏覽器不是直接到Web伺服器去取回網頁而是向代理伺服器送出請求,Request信号會先送到代理伺服器,由代理伺服器來取回浏覽器所需要的資訊并傳送給你的浏覽器。

而且,大部分代理伺服器都具有緩沖的功能,就好象一個大的Cache,它有很大的存儲空間,它不斷将新取得資料儲存到它本機的存儲器上,如果浏覽器所請求的資料在它本機的存儲器上已經存在而且是最新的,那麼它就不重新從Web伺服器取資料,而直接将存儲器上的資料傳送給使用者的浏覽器,這樣就能顯著提高浏覽速度和效率。更重要的是:Proxy Server(代理伺服器)是Internet鍊路級網關所提供的一種重要的安全功能,它的工作主要在開放系統互聯(OSI)模型的對話層。

HTTP代理伺服器的主要功能:

(1)、突破自身IP通路限制,通路國外站點。如:教育網、169網等網絡使用者可以通過代理通路國外網站;

(2)、通路一些機關或團體内部資源,如某大學FTP(前提是該代理位址在該資源的允許通路範圍之内),使用教育網内位址段免費代理伺服器,就可以用于對教育 網開放的各類FTP下載下傳上傳,以及各類資料查詢共享等服務;

(3)、突破中國電信的IP封鎖:中國電信使用者有很多網站是被限制通路的,這種限制是人為的,不同Serve對位址的封鎖是不同的。是以不能通路時可以換一個國外的代理伺服器試試;

(4)、提高通路速度:通常代理伺服器都設定一個較大的硬碟緩沖區,當有外界的資訊通過時,同時也将其儲存到緩沖區中,當其他使用者再通路相同的資訊時,則直接由緩沖區中取出資訊,傳給使用者,以提高通路速度;

(5)、隐藏真實IP:上網者也可以通過這種方法隐藏自己的IP,免受攻擊。

對于用戶端浏覽器而言,HTTP代理伺服器相當于伺服器。

而對于Web伺服器而言,HTTP代理伺服器又擔當了用戶端的角色。

4.虛拟主機

虛拟主機:是在網絡伺服器上劃分出一定的磁盤空間供使用者放置站點、應用元件等,提供必要的站點功能與資料存放、傳輸功能。

所謂虛拟主機,也叫“網站空間”就是把一台運作在網際網路上的伺服器劃分成多個“虛拟”的伺服器,每一個虛拟主機都具有獨立的域名和完整的Internet伺服器(支援WWW、FTP、E-mail等)功能。一台伺服器上的不同虛拟主機是各自獨立的,并由使用者自行管理。但一台伺服器主機隻能夠支援一定數量的虛拟主機,當超過這個數量時,使用者将會感到性能急劇下降。

虛拟主機的實作原理:

虛拟主機是用同一個Web伺服器,為不同域名網站提供服務的技術。Apache、Tomcat等均可通過配置實作這個功能。

相關的HTTP消息頭:Host。

例如:Host: luyucheng.cnblogs.com

用戶端發送HTTP請求的時候,會攜帶Host頭,Host頭記錄的是用戶端輸入的域名。這樣伺服器可以根據Host頭确認客戶要通路的是哪一個域名。

1

作者:成九

來源:cnblogs.com/luyucheng/p/6264387.html

繼續閱讀