天天看點

HTTP請求模型和頭資訊參考

轉載于:http://www.cnblogs.com/riky/archive/2007/04/09/705848.html

參考: http://blog.csdn.net/baggio785/archive/2006/04/13/661410.aspx

模型: http://blog.csdn.net/baggio785/archive/2006/04/13/661412.aspx

HTTP請求模型

一、連接配接至Web伺服器

一個用戶端應用(如Web浏覽器)打開到Web伺服器的HTTP端口的一個套接字(預設為80)。

例如:http://www.myweb.com:8080/index.html

在Java中,這将等同于代碼:

Soceet socket=new Socket("www.myweb.com",8080);

InputStream in=socket.getInputStream();

OutputStream out=socket.getOutputStream();

二、發送HTTP請求

通過連接配接,用戶端寫一個ASCII文本請求行,後跟0或多個HTTP頭标,一個空行和實作請求的任意資料。

一個請求由四個部分組成:請求行、請求頭标、空行和請求資料

1.請求行:請求行由三個标記組成:請求方法、請求URI和HTTP版本,它們用空格分隔。

例如:GET /index.html HTTP/1.1

HTTP規範定義了8種可能的請求方法:

GET            檢索URI中辨別資源的一個簡單請求

HEAD            與GET方法相同,伺服器隻傳回狀态行和頭标,并不傳回請求文檔

POST            伺服器接受被寫入用戶端輸出流中的資料的請求

PUT            伺服器儲存請求資料作為指定URI新内容的請求

DELETE            伺服器删除URI中命名的資源的請求

OPTIONS        關于伺服器支援的請求方法資訊的請求

TRACE            Web伺服器回報Http請求和其頭标的請求

CONNECT        已文檔化但目前未實作的一個方法,預留做隧道處理

2.請求頭标:由關鍵字/值對組成,每行一對,關鍵字和值用冒号(:)分隔。

請求頭标通知伺服器有關于用戶端的功能和辨別,典型的請求頭标有:

User-Agent        用戶端廠家和版本

Accept            用戶端可識别的内容類型清單

Content-Length    附加到請求的資料位元組數

3.空行:最後一個請求頭标之後是一個空行,發送回車符和退行,通知伺服器以下不再有頭标。

4.請求資料:使用POST傳送資料,最常使用的是Content-Type和Content-Length頭标。

三、服務端接受請求并傳回HTTP響應

Web伺服器解析請求,定位指定資源。伺服器将資源副本寫至套接字,在此處由用戶端讀取。

一個響應由四個部分組成;狀态行、響應頭标、空行、響應資料

1.狀态行:狀态行由三個标記組成:HTTP版本、響應代碼和響應描述。

HTTP版本:向用戶端指明其可了解的最高版本。

響應代碼:3位的數字代碼,指出請求的成功或失敗,如果失敗則指出原因。

響應描述:為響應代碼的可讀性解釋。

例如:HTTP/1.1 200 OK

HTTP響應碼:

1xx:資訊,請求收到,繼續處理

2xx:成功,行為被成功地接受、了解和采納

3xx:重定向,為了完成請求,必須進一步執行的動作

4xx:用戶端錯誤:

2.響應頭标:像請求頭标一樣,它們指出伺服器的功能,辨別出響應資料的細節。

3.空行:最後一個響應頭标之後是一個空行,發送回車符和退行,表明伺服器以下不再有頭标。

4.響應資料:HTML文檔和圖像等,也就是HTML本身。

四、伺服器關閉連接配接,浏覽器解析響應

1.浏覽器首先解析狀态行,檢視表明請求是否成功的狀态代碼。

2.然後解析每一個響應頭标,頭标告知以下為若幹位元組的HTML。

3.讀取響應資料HTML,根據HTML的文法和語義對其進行格式化,并在浏覽器視窗中顯示它。

4.一個HTML文檔可能包含其它需要被載入的資源引用,浏覽器識别這些引用,對其它的資源再進行額外的請求,此過程循環多次。

五、無狀态連接配接

HTTP模型是無狀态的,表明在處理一個請求時,Web伺服器并不記住來自同一用戶端的請求。

六、執行個體

1.浏覽器送出請求

GET /index.html HTTP/1.1

伺服器傳回響應

HTTP /1.1 200 OK

Date: Apr 11 2006 15:32:08 GMT

Server: Apache/2.0.46(win32)

Content-Length: 119

Content-Type: text/html

<HTML>

<HEAD>

<LINK REL="stylesheet" HREF="index.css">

</HEAD>

<BODY>

<IMG SRC="image/logo.png">

</BODY>

</HTML>

2.浏覽器送出請求

GET /index.css HTTP/1.1

伺服器傳回響應

HTTP /1.1 200 OK

Date: Apr 11 2006 15:32:08 GMT

Server: Apache/2.0.46(win32)

Connection: Keep-alive, close

Content-Length: 70

Content-Type: text/plane

h3{

    font-size:20px;

    font-weight:bold;

    color:#005A9C;

}

3.浏覽器送出請求

GET image/logo.png HTTP/1.1

伺服器傳回響應

HTTP /1.1 200 OK

Date: Apr 11 2006 15:32:08 GMT

Server: Apache/2.0.46(win32)

Connection: Keep-alive, close

Content-Length: 1280

Content-Type: text/plane

{Binary image data follows}

(附錄)

1.HTTP規範:Internet工程制定組織(IETF)釋出的RFC指定Internet标準,這些RFC被Internet研究發展機構廣泛接受。因為它們是标準文檔,故一般用正規語言編寫,如立法文标一樣。

2.RFC:RFC一旦被提出,就被編号且不會再改變,當一個标準被修改時,則給出一個新的RFC。作為标準,RFC在Internet上被廣泛采用。

3.HTTP的幾個重要RFC:

    RFC1945    HTTP 1.0 描述

    RFC2068    HTTP 1.1 初步描述

    RFC2616    HTTP 1.1 标準

4.資源辨別符URI(Uniform Resource Identifter,URI)

HTTP參考

一、HTTP碼應碼

響應碼由三位十進制數字組成,它們出現在由HTTP伺服器發送的響應的第一行。

響應碼分五種類型,由它們的第一位數字表示:

1.1xx:資訊,請求收到,繼續處理

2.2xx:成功,行為被成功地接受、了解和采納

3.3xx:重定向,為了完成請求,必須進一步執行的動作

4.4xx:用戶端錯誤,請求包含文法錯誤或者請求無法實作

5.5xx:伺服器錯誤,伺服器不能實作一種明顯無效的請求

下表顯示每個響應碼及其含義:

100            繼續

101            分組交換協

200            OK

201            被建立

202            被采納

203            非授權資訊

204            無内容

205            重置内容

206            部分内容

300            多選項

301            永久地傳送

302            找到

303            參見其他

304            未改動

305            使用代理

307            暫時重定向

400            錯誤請求

401            未授權

402            要求付費

403            禁止

404            未找到

405            不允許的方法

406            不被采納

407            要求代理授權

408            請求逾時

409            沖突

410            過期的

411            要求的長度

412            前提不成立

413            請求執行個體太大

414            請求URI太大

415            不支援的媒體類型

416            無法滿足的請求範圍

417            失敗的預期

500            内部伺服器錯誤

501            未被使用

502            網關錯誤

503            不可用的服務

504            網關逾時

505            HTTP版本未被支援

二、HTTP頭标

頭标由主鍵/值對組成。它們描述用戶端或者伺服器的屬性、被傳輸的資源以及應該實作連接配接。

四種不同類型的頭标:

1.通用頭标:即可用于請求,也可用于響應,是作為一個整體而不是特定資源與事務相關聯。

2.請求頭标:允許用戶端傳遞關于自身的資訊和希望的響應形式。

3.響應頭标:伺服器和于傳遞自身資訊的響應。

4.實體頭标:定義被傳送資源的資訊。即可用于請求,也可用于響應。

頭标格式:<name>:<value><CRLF>

下表描述在HTTP/1.1中用到的頭标

Accept            定義用戶端可以處理的媒體類型,按優先級排序;

                        在一個以逗号為分隔的清單中,可以定義多種類型和使用通配符。例如:Accept: image/jpeg,image/png,*/*

Accept-Charset        定義用戶端可以處理的字元集,按優先級排序;

                 在一個以逗号為分隔的清單中,可以定義多種類型和使用通配符。例如:Accept-Charset: iso-8859-1,*,utf-8

Accept-Encoding        定義用戶端可以了解的編碼機制。例如:Accept-Encoding:gzip,compress

Accept-Language    定義用戶端樂于接受的自然語言清單。例如:Accept-Language: en,de

Accept-Ranges        一個響應頭标,它允許伺服器指明:将在給定的偏移和長度處,為資源組成部分的接受請求。

            該頭标的值被了解為請求範圍的度量機關。例如Accept-Ranges: bytes或Accept-Ranges: none

Age            允許伺服器規定自伺服器生成該響應以來所經過的時間長度,以秒為機關。

            該頭标主要用于緩存響應。例如:Age: 30

Allow            一個響應頭标,它定義一個由位于請求URI中的次源所支援的HTTP方法清單。例如:Allow: GET,PUT

aUTHORIZATION        一個響應頭标,用于定義通路一種資源所必需的授權(域和被編碼的使用者ID與密碼)。

            例如:Authorization: Basic YXV0aG9yOnBoaWw=

Cache-Control        一個用于定義緩存指令的通用頭标。例如:Cache-Control: max-age=30

Connection        一個用于表明是否儲存socket連接配接為開放的通用頭标。例如:Connection: close或Connection: keep-alive

Content-Base        一種定義基本URI的實體頭标,為了在實體範圍内解析相對URLs。

            如果沒有定義Content-Base頭标解析相對URLs,使用Content-Location URI(存在且絕對)或使用URI請求。

            例如:Content-Base: Http://www.myweb.com

Content-Encoding    一種媒體類型修飾符,标明一個實體是如何編碼的。例如:Content-Encoding: zip

Content-Language    用于指定在輸入流中資料的自然語言類型。例如:Content-Language: en

Content-Length        指定包含于請求或響應中資料的位元組長度。例如:Content-Length:382

Content-Location        指定包含于請求或響應中的資源定位(URI)。

            如果是一絕。對URL它也作為被解析實體的相對URL的出發點。

            例如:Content-Location: http://www.myweb.com/news

Content-MD5        實體的一種MD5摘要,用作校驗和。

            發送方和接受方都計算MD5摘要,接受方将其計算的值與此頭标中傳遞的值進行比較。

            例如:Content-MD5: <base64 of 128 MD5 digest>

Content-Range        随部分實體一同發送;标明被插入位元組的低位與高位位元組偏移,也标明此實體的總長度。

            例如:Content-Range: 1001-2000/5000

Contern-Type        标明發送或者接收的實體的MIME類型。例如:Content-Type: text/html

Date            發送HTTP消息的日期。例如:Date: Mon,10PR 18:42:51 GMT

ETag            一種實體頭标,它向被發送的資源分派一個唯一的辨別符。

            對于可以使用多種URL請求的資源,ETag可以用于确定實際被發送的資源是否為同一資源。

            例如:ETag: "208f-419e-30f8dc99"

Expires            指定實體的有效期。例如:Expires: Mon,05 Dec 2008 12:00:00 GMT

Form            一種請求頭标,給定控制使用者代理的人工使用者的電子郵件位址。例如:From: [email protected]

Host            被請求資源的主機名。對于使用HTTP/1.1的請求而言,此域是強制性的。例如:Host: www.myweb.com

If-Modified-Since        如果包含了GET請求,導緻該請求條件性地依賴于資源上次修改日期。

            如果出現了此頭标,并且自指定日期以來,此資源已被修改,應該反回一個304響應代碼。

            例如:If-Modified-Since: Mon,10PR 18:42:51 GMT

If-Match            如果包含于一個請求,指定一個或者多個實體标記。隻發送其ETag與清單中标記區配的資源。

            例如:If-Match: "208f-419e-308dc99"

If-None-Match        如果包含一個請求,指定一個或者多個實體标記。資源的ETag不與清單中的任何一個條件比對,操作才執行。

            例如:If-None-Match: "208f-419e-308dc99"

If-Range            指定資源的一個實體标記,用戶端已經擁有此資源的一個拷貝。必須與Range頭标一同使用。

            如果此實體自上次被用戶端檢索以來,還不曾修改過,那麼伺服器隻發送指定的範圍,否則它将發送整個資源。

            例如:Range: byte=0-499<CRLF>If-Range:"208f-419e-30f8dc99"

If-Unmodified-Since    隻有自指定的日期以來,被請求的實體還不曾被修改過,才會傳回此實體。

            例如:If-Unmodified-Since:Mon,10PR 18:42:51 GMT

Last-Modified        指定被請求資源上次被修改的日期和時間。例如:Last-Modified: Mon,10PR 18:42:51 GMT

Location            對于一個已經移動的資源,用于重定向請求者至另一個位置。

            與狀态編碼302(暫時移動)或者301(永久性移動)配合使用。

            例如:Location: http://www2.myweb.com/index.jsp

Max-Forwards        一個用于TRACE方法的請求頭标,以指定代理或網關的最大數目,該請求通過網關才得以路由。

            在通過請求傳遞之前,代理或網關應該減少此數目。例如:Max-Forwards: 3

Pragma            一個通用頭标,它發送實作相關的資訊。例如:Pragma: no-cache

Proxy-Authenticate    類似于WWW-Authenticate,便是有意請求隻來自請求鍊(代理)的下一個伺服器的認證。

            例如:Proxy-Authenticate: Basic realm-admin

Proxy-Proxy-Authorization    類似于授權,但并非有意傳遞任何比在即時伺服器鍊中更進一步的内容。

            例如:Proxy-Proxy-Authorization: Basic YXV0aG9yOnBoaWw=

Public            清單顯示伺服器所支援的方法集。例如:Public: OPTIONS,MGET,MHEAD,GET,HEAD

Range            指定一種度量機關和一個部分被請求資源的偏移範圍。例如:Range: bytes=206-5513

Refener            一種請求頭标域,标明産生請求的初始資源。對于HTML表單,它包含此表單的Web頁面的位址。

            例如:Refener: http://www.myweb.com/news/search.html

Retry-After        一種響應頭标域,由伺服器與狀态編碼503(無法提供服務)配合發送,以标明再次請求之前應該等待多長時間。

            此時間即可以是一種日期,也可以是一種秒機關。例如:Retry-After: 18

Server            一種标明Web伺服器軟體及其版本号的頭标。例如:Server: Apache/2.0.46(Win32)

Transfer-Encoding    一種通用頭标,标明對應被接受方反向的消息體實施變換的類型。例如:Transfer-Encoding: chunked

Upgrade        允許伺服器指定一種新的協定或者新的協定版本,與響應編碼101(切換協定)配合使用。

            例如:Upgrade: HTTP/2.0

User-Agent        定義用于産生請求的軟體類型(典型的如Web浏覽器)。

            例如:User-Agent: Mozilla/4.0(compatible; MSIE 5.5; Windows NT; DigExt)

Vary            一個響應頭标,用于表示使用伺服器驅動的協商從可用的響應表示中選擇響應實體。例如:Vary: *

Via            一個包含所有中間主機和協定的通用頭标,用于滿足請求。例如:Via: 1.0 fred.com, 1.1 wilma.com

Warning            用于提供關于響應狀态補充資訊的響應頭标。例如:Warning: 99 www.myweb.com Piano needs tuning

www-Authenticate    一個提示使用者代理提供使用者名和密碼的響應頭标,與狀态編碼401(未授權)配合使用。響應一個授權頭标。

            例如:www-Authenticate: Basic realm=zxm.mgmt

繼續閱讀