嵌入式Web服務器學習之HTTP協議

1 概述

HTTP協議是一種讓Web服務器與瀏覽器(客戶端)通過Internet發送與接收數據的協議。它允許將超文本標記語言(HTML)文檔從Web服務器傳送到客戶端的瀏覽器。它是一個請求、響應協議。當客戶端發送出一個請求,服務器響應這個請求。HTTP運用可靠的TCP連接,通常用的80端口。

2  HTTP協議特點

1.支持客戶/服務器模式。
2.簡單快速:客戶向服務器請求服務時,只需傳送請求方法和路徑。請求方法常用的有GET、HEAD、POST。每種方法規定了客戶與服務器聯繫的類型不同。由於HTTP協議簡單,使得HTTP服務器的程序規模小,因而通信速度很快。
3.靈活:HTTP允許傳輸任意類型的數據對象。正在傳輸的類型由Content-Type加以標記。
4.無連接:無連接的含義是限制每次連接只處理一個請求。服務器處理完客戶的請求,並收到客戶的應答後,即斷開連接。採用這種方式可以節省傳輸時間。
5.無狀態:HTTP協議是無狀態協議。無狀態是指協議對於事務處理沒有記憶能力。缺少狀態意味着如果後續處理需要前面的信息,則它必須重傳,這樣可能導致每次連接傳送的數據量增大。另一方面,在服務器不需要先前信息時它的應答就較快。

HTTP協議中包含瀏覽器對Web服務器的請求部分和服務器對瀏覽器的應答部分。

3 客戶端HTTP協議的組成部分

3.1客戶端請求行

請求行以一個方法符號開頭,以空格分開,後面跟着請求的URI和協議的版本,格式如下:Method Request-URI HTTP-Version CRLF 其中 Method表示請求方法;Request-URI是一個統一資源標識符;HTTP-Version表示請求的HTTP協議版本;CRLF表示回車和換行(除了作爲結尾的CRLF外,不允許出現單獨的CR或LF字符)。

(1)  Method-URI-Protocol/Version 方法-URI-協議

(2)  Request header 請求頭

(3)  Entity body 請求實體

3.1.1 方法

Method:每個客戶端的HTTP請求可以是HTTP規範中制定的許多請求類型中的一種。HTTP1.1支持七種類型的請求,它們是GET、POST、HEAD、OPTIONS、PUT、DELETE、TRACE。其中GET與POST是Internet應用中經常用到的兩種請求類型。

GET     請求獲取Request-URI所標識的資源,以?分割URL和傳輸數據,參數之間以&相連。當使用GET方法的時候,body是爲空的。。例如:在瀏覽器的地址欄中輸入網址的方式訪問網頁時,瀏覽器採用GET方法向服務器獲取資源,eg:GET /form.html HTTP/1.1 (CRLF)。GET方式需要使用Request.QueryString來取得變量的值。
POST    在Request-URI所標識的資源後附加新的數據,POST方法要求被請求服務器接受附在請求後面的數據,常用於提交表單。POST方法是把提交的數據放在HTTP包的Body中。POST方式通過Request.Form來獲取變量的值。
HEAD    請求獲取由Request-URI所標識的資源的響應消息報頭
PUT     請求服務器存儲一個資源,並用Request-URI作爲其標識
DELETE  請求服務器刪除Request-URI所標識的資源
TRACE   請求服務器回送收到的請求信息,主要用於測試或診斷
CONNECT 保留將來使用
OPTIONS 請求查詢服務器的性能,或者查詢與資源相關的選項和需求

HEAD方法與GET方法幾乎是一樣的,對於HEAD請求的迴應部分來說,它的HTTP頭部中包含的信息與通過GET請求所得到的信息是相同的。利用這個方法,不必傳輸整個資源內容,就可以得到Request-URI所標識的資源的信息。該方法常用於測試超鏈接的有效性,是否可以訪問,以及最近是否更新。

3.1.2 URI

URI:完整地指定了Internet資源。一個URI通常被解析爲相對服務器的根目錄。URI的基本格式爲:schema://host[:port#]/path/.../[?query-string][#anchor]。

1)  Scheme:指定低層使用的協議(例如:http, https, ftp)。

2)  Host:HTTP服務器的IP地址或者域名。

3)  Port:HTTP服務器的默認端口是80,這種情況下端口號可以省略。

4)  path:訪問資源的路徑。

5)  query-string:發送給http服務器的數據。

6)  anchor:錨。

3.1.3 Version

Version:指的是HTTP請求所用到的HTTP協議版本。

3.2 請求頭

Request header:包含了客戶端環境與請求實體的一些有用信息。例如瀏覽器設定的語言、實體的長度等等。每條請求頭用回車換行符(CRLF)分開。

請求頭域的種類主要有:

(1)  Cache頭域

1)  If-Modified-Since:瀏覽器端緩存頁面的最後修改時間發送到服務器去。

2)  If-None-Match:和Etag一起使用。

3)  Pragma:防止頁面被緩存,和Cache-Control:no-cache作用一模一樣。

4)  Cache-Control:指定Response-Request遵循的緩存機制。

(2)  Client頭域

1)  Accept:瀏覽器可以接受的媒體類型。

2)  Accept-Encoding:瀏覽器申明自己接收的編碼方法,通常指定壓縮方法。

3)  Accept-Language:瀏覽器申明自己接收的語言。

4)  User-Agent:客戶端使用的操作系統和瀏覽器的名稱和版本。

5)  Accept-Charset:瀏覽器申明自己接收的字符集

(3)  Cookie/Login頭域

1)  Cookie:將cookie的值發送給HTTP服務器。

(4)  Entity頭域

1)  Content-Length:發送給HTTP服務器數據的長度。

2)  Content-Type:網頁文件的類型。

(5)  Miscellaneous頭域

1)  Referer:提供Request的上下文信息的服務器

(6)  Transport頭域

1)  Connection:連接是否關閉。

2)Host:指定請求資源的Internet主機和端口號。

一個非常重要的空行分開請求頭與實體,它標誌着實體內容的開始。

4 Web服務器的響應

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

(1)  Protocol-Status code-Description 協議-狀態-描述

(2)  Response headers 響應頭

(3)  Entity body 響應實體

4.1.1 狀態碼

狀態碼用來告訴HTTP客戶端,HTTP服務器是否產生了預期的Response。HTTP/1.1中定義了5類狀態碼, 狀態碼由三位數字組成,第一個數字定義了響應的類別

(1)1XX 提示信息 - 表示請求已被成功接收,繼續處理

(2)2XX 成功 - 表示請求已被成功接收,理解,接受

(3)3XX 重定向 - 要完成請求必須進行更進一步的處理

(4)4XX 客戶端錯誤 - 請求有語法錯誤或請求無法實現

(5)5XX 服務器端錯誤 - 服務器未能實現合法的請求

常見的狀態碼:

(1)200 OK:表明請求被成功的完成,所請求的資源發送回客戶端。

(2)302 Found:重定向,新的URL會在Response中的Location中返回,瀏覽器會自動使用新的URL發出新的Request。

(3)304 Not Modified:代表上次的文檔應經被緩存了,還可以繼續使用。

(4)400 Bad Request:客戶端請求與語法錯誤,不能被服務器所理解。

(5)403 Forbidden:服務器收到請求,但是拒絕提供服務。

(6)404 Not Found:請求的資源不存在。

(7)500 Internal Server Error:服務器發生了不可預期的錯誤。

(8)503 Server Unavailable:服務器當前不能處理客戶端的請求,一段時間

4.2 響應消息頭

(1)  Cache頭域

1)  Date:生成消息的具體時間和日期

2)  Expires:瀏覽器會在指定時間內使用本地緩存

(2)Cookie/Login頭域

1)  P3P:用於跨域設置Cookie,這樣可以解決frame跨域訪問cookie的問題。

2)  Set-Cookie:用於把cookie發送到瀏覽器.

(3)Entity頭域

1)  ETag:和If-None-Match配合使用

2)  Last-Modified:用於指示資源的最後修改日期和時間。

3)  Content-Type:WEB服務器告訴瀏覽器自己響應的對象的類型和字符集。

4)  Content-Length:指明實體正文的長度,以字節方式存儲的十進制數字來標識。

5)  Content-Encoding:WEB服務器表明自己使用了什麼壓縮方法壓縮響應中的對象。

6)  Content-Language:WEB服務器告訴瀏覽器自己響應的對象的語言。

(4)Miscellaneous頭域

1)  Server:指明HTTP服務器的軟件信息。

2)  X-AspNet-Version:如果網站是ASP.NET開發的,這個header用來表示ASP.NET的版本。

3)  X-Powered-By:表示網站是用什麼技術開發的。

(5)Transport頭域

1)  Connection:用來保持和斷開TCP連接。

(6)Location頭域

1)  Location:用於重定向一個新的位置,包含新的URL地址。


5 HTTP協議請求的特點

1、當你在瀏覽器輸入URLhttp://www.cnblogs.com 的時候,瀏覽器發送一個Request去獲取 http://www.cnblogs.com 的html. 服務器把Response發送回給瀏覽器。

2、瀏覽器分析Response中的 HTML,發現其中引用了很多其他文件,比如圖片,CSS文件,JS文件。

3、瀏覽器會自動再次發送Request去獲取圖片,CSS文件,或者JS文件。

4、等所有的文件都下載成功後。 網頁就被顯示出來了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章