HTTP協議 - 協議格式

HTTP 是一個屬於應用層的面向對象的協議,因爲其簡捷、快速的方式,適用於分佈式超媒體信息系統。它於1990年提出,通過幾年的使用與發展,獲得不斷地完善和 擴展。目前在WWW中使用的是HTTP/1.0的第六版,HTTP/1.1的規範化工做正在進行之中,並且HTTP-NG(Next Generation of HTTP)的建議已經提出。
HTTP協議的主要特色可歸納以下:
1.支持客戶/服務器模式。
2.簡單快速:客戶向服務器請求服務時,只需傳送請求方法和路徑。請求方法經常使用的有GET、HEAD、POST。每種方法規定了客戶與服務器聯繫的類型不一樣。因爲HTTP協議簡單,使得HTTP服務器的程序規模小,於是通訊速度很快。
3.靈活:HTTP容許傳輸任意類型的數據對象。正在傳輸的類型由Content-Type加以標記。
4.無鏈接:無鏈接的含義是限制每次鏈接只處理一個請求。服務器處理完客戶的請求,並收到客戶的應答後,即斷開鏈接。採用這種方式能夠節省傳輸時間。
5.無狀態:HTTP協議是無狀態協議。無狀態是指協議對於事務處理沒有記憶能力。缺乏狀態意味着若是後續處理須要前面的信息,則它必須重傳,這樣可能致使每次鏈接傳送的數據量增大。另外一方面,在服務器不須要先前信息時它的應答就較快。

1. 命令行窗口中用telnet測試HTTP協議 

HTTP消息是由普通ASCII文本組成。消息包括消息頭和數據體部分。消息頭以行爲單位,每行以CRLF(回車和換行)結束,消息頭結束後,額外增長一個CRLF,以後內容就是數據體部分了。
咱們能夠在命令行窗口,經過TELNET,來測試HTTP協議。

1. 使用telnet鏈接到HTTP服務器,如要從google上請求index.html頁面,首先要鏈接到服務器的80端口 php

telnet www.google.cn 80
2. 如今已經鏈接上了服務器,發送http請求消息:
GET /index.html HTTP/1.1
connection: close
Host: www.google.cn
輸入上面內容後,連續敲入兩個回車,哈哈,是否是看到返回結果了。
這個請求的意思是:經過1.1版本協議請求index.html頁面;connection: close是實用短鏈接,即服務器返回後就斷開鏈接;Host字段知名頁面所在的主機名。
返回結果應該是這樣的:
HTTP/1.1 200 OK
Cache-Control: private, max-age=0
Date: Fri, 02 Jan 2009 12:26:17 GMT
Expires: -1
Content-Type: text/html; charset=GB2312
Set-Cookie: PREF=ID=7bbe374f53b6c6a8:NW=1:TM=1230899177:LM=1230899177:S=2EGHuZJnrtdQUB_A; expires=Sun, 02-Jan-2011 12:26:17 GMT; path=/; domain=.google.com
Server: gws
Transfer-Encoding: chunked
Connection: Close
這裏有一個額外的CRLF
<html>
html數據
</html>

2. 請求消息格式 

HTTP請求報文由請求行(request line)、請求頭部(header)、空行和請求數據4個部分組成,下圖給出了請求報文的通常格式。

css

  • 請求行
第一行是請求行:請求方法 URL路徑 HTTP版本號,上面的例子中的請求行是:
GET /index.html HTTP/1.1
使用GET方法請求服務器根目錄下的index.html文件,約定使用HTTP/1.1版本。
請求方法包括GET、POST、HEAD、OPTIONS、TRACE、PUT等幾種,最經常使用的前2種。
1. GET方法。經過將參數附加在URL後面提交參數。如http://www.google.cn/search?hl=zh-CN& amp;newwindow=1&rls=com.microsoft%3Azh-cn%3AIE-SearchBox&q=%E6%89%8B%E6%9C%BA&meta=&aq=f&oq=
GET
2. POST方法。經過將參數附加在請求的頭部行後面(GET方式是沒有數據體的)提交參數。GET方式提交參數數據量通常限制在1k一下,而POST是沒有限制的。POST通常用在表單數據提交的時候。
3. HEAD方法不讓服務器在迴應中返回任何實體。對HEAD請求的迴應部分來講,它的HTTP標題中包含的元信息與經過GET請求所獲得的 是相同的。經過使用這種方法,沒必要傳輸整個實體主體,就能夠獲得請求URI所指定資源的元信息。該方法一般用來測試超連接的合法性、可訪問性及最近更 新。 
  • 頭部行
頭部行中的內容通常用來描述客戶端能兼容的類型。如Accept-Language告訴服務器客戶端支持哪些語言;Cache-Control告訴服務器客戶端是否支持cache。
  • 附屬體(數據實體)
請求的附屬體,GET不適用,POST方法提交數據時,用來存放請求的參數。
  • 客戶端傳遞參數方式
1. GET方式傳遞,直接在URL後面。
2. POST方式傳遞,請求行告訴服務器參數長度,經過附屬體獨立傳給服務器。
3. Cookie方式傳遞,不要忘記這種方式了,會話Session功能就是經過這種方式實現的哦。
  • 一些經常使用的頭部行請求參數
User-Agent:客戶端的瀏覽器信息。
Connection:close表示使用短鏈接,Keep-Alive表示客戶端支持持久鏈接。
Date:消息產生的當前時間。
Accept-Language:客戶端支持的語言。
Cache-Control:客戶端是否支持cache。no-cache表示客戶端不支持cache,如max-age=3600,告訴User Agent 該請求的響應結果在多長時間內有效,在有效期內,當用戶再次須要訪問時,直接從客戶端本地提取,不須要訪問服務器。
Referer:Referer用以告訴服務器該請求來自於哪一個URL,能夠用追蹤用戶的WEB訪問路徑。
If-Modified-Since: 若是請求消息包含If-Modified-Since標題 域,GET方法的語法就變成「條件GET」,即「(conditional GET)」。 條件GET方法能夠對指定資源進行判斷,若是它在If-Modified-Since標題域中的指定日期後發生了更新,才啓動傳輸,不然不傳輸。這種條件 GET容許被緩存的實體在沒必要通過屢次請求或沒必要要的數據傳輸就能進行刷新,從而有助於下降網絡負載。
Last-Modified: Sun, 03 Dec 2008 23:52:56 GMT
ETag: 「1cbf3-dfd-3a2adcd8″
    通常應用在文件下載上,用於標識響應內容的最後修改時間或內容較驗碼,當下一次User agent須要時,服務首先判斷這二個值是否跟服務器上一致,同樣則不須要返回內容。
Expires:該請求的響應結果在什麼時間失效,在沒有失效以前,代理可直接從緩存中返回之前的響應結果。
Host:指定請求資源的主機和端口號。HTTP/1.1請求必須指定Host,不然服務器會返回400狀態碼。
  • 請求消息例子
GET請求例子:
GET /css/news070130.css HTTP/1.1
Accept: */*
Referer: http://news.qq.com/a/20081224/000088.htm
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
If-Modified-Since: Thu, 29 Mar 2007 02:05:43 GMT; length=11339
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)
Host: news.qq.com
Connection: Keep-Alive
Cookie: ssid=idlsesels; flv=9.0; icache=ADLFMBGC; adid=adsdifids; isflucky_50829637=0; 
POST請求例子:
POST /Login.php  HTTP/1.1
Accept: image/gif,*/*
Accept-language: zh-cn
Accept-encodeing: gzip
User-Agent: MSIE6.0
Host: www.some.com
Connection: Keep-Alive
Content-Length: 7
Cache-Control:no-cache
Cookie: name1=value1; name2=value2;
這裏有一個額外的CRLF
username=b&passwd=d

3. 響應消息格式 

HTTP響應也由三個部分組成,分別是:狀態行、消息報頭、響應正文。html

響應消息包括狀態行、若干頭部行和附屬體(html數據實體)。
  • 狀態行
狀態行包括:HTTP協議版本號、狀態碼、狀態碼的文本描述信息。如:HTTP/1.1 200 OK
狀態碼由一個三位數組成,狀態碼大致有5種含義:
1. 1xx。信息,請求收到,繼續處理。
2. 2xx。成功。200請求成功;206斷點續傳。
3. 3xx。重定向。通常跳轉到新的地址。
4. 4xx。客戶端錯誤。404文件不存在
5. 5xx。服務器錯誤。500內部錯誤。
  • 頭部行
Set-Cookie:服務器設置客戶端Cookie。設置格式是name=value,設置多個參數時中 間用分號隔開。Set-Cookie時還會用到幾個參數:PATH設置有效的路徑,DOMAIN設置cookie生效的域名,Expire設置 cookie的有效時間,0表示關閉瀏覽器就失效。
Location:當服務器返回3xx重定向時,該參數實現重定向。廣告連接的跳轉就使用這種協議。
Content-Length:附屬體(數據實體)的長度





HTTP請求格式:
<request-line>
<headers>
<blank line>
[<request-body>]
說明:第一行必須是一個請求行(request-line),用來講明請求類型,要訪問的資源以及所使用的HTTP版本.
      緊接着是一個首部(header)小節,用來講明服務器要使用的附加信息.
      以後是一個空行.
      再後面能夠添加任意的其餘數據[稱之爲主體(body)].
例1 GET請求:數組

GET / HTTP/1.1
Accept: */*
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)
Host: www.google.cn
Connection: Keep-Alive
說明:請求的第一部分說明了該請求是一個GET請求.該行的第二部分是一個斜槓(/),用來講明請求的是該域名的根目錄.該行的最後一部分說明使用的是HTTP1.1版本(另外一個可選薦是1.0).
      第2行是請求的第一個首部,HOST將指出請求的目的地.User-Agent,服務器端和客戶端腳本都能訪問它,它是瀏覽器類型檢測邏輯的 重要基礎.該信息由你的瀏覽器來定義,而且在每一個請求中自動發送.Connection,一般將瀏覽器操做設置爲Keep-Alive
      第三部分,空行,即便不存在請求主體,這個空行也是必需的.瀏覽器

例2 POST請求:緩存

POST / HTTP1.1
Host:www.wrox.com
User-Agent:Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)
Content-Type:application/x-www-form-urlencoded
Content-Length:40
Connection: Keep-Alive

name=Professional%20Ajax&publisher=Wiley
說明:請求行開始處的GET改成POST,以表示不一樣的請求類型.
      Content-Type說明了請求主體的內容是如何編碼的.瀏覽器始終以application/x-www-form- urlencoded的格式編碼來傳送數據,這是針對簡單URL編碼的MIME類型.Content-Length說明了請求主體的字節數.
      最後請求主體.名稱-值對的形式.服務器

HTTP響應格式:
<status-line>
<headers>
<blank line>
[<response-body>]cookie

例:網絡

HTTP/1.1 200 OK
Date: Fri, 22 May 2009 06:07:21 GMT
Content-Type: text/html; charset=UTF-8app

<html>       <head></head>       <body>             <!--body goes here-->       </body> </html> 說明:HTTP狀態碼200,找到資源,而且一切正常.       Date:生成響應的日期和時間.       Content-Type:指定了MIME類型的HTML(text/html),編碼類型是UTF-8       HTML源文體.

相關文章
相關標籤/搜索