HTTP協議簡要分析

HTTP協議

一、HTTP協議簡介

HTTP協議是Hyper Text Transfer Protocol(超文本傳輸協議)
HTTP是一個基於TCP/IP通信協議來傳遞數據的應用層傳輸協議

二、主要特點

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

三、工作原理

HTTP是基於TCP/IP通訊協議的,所以他也是使用socket套接字來完成數據傳輸,底層的通訊和TCP/IP一致。

HTTP協議定義Web客戶端如何從Web服務器請求Web頁面,以及服務器如何把Web頁面傳送給客戶端。HTTP協議採用了請求/響應模型。客戶端向服務器發送一個請求報文,請求報文包含請求的方法、URL、協議版本、請求頭部和請求數據。服務器以一個狀態行作爲響應,響應的內容包括協議的版本、成功或者錯誤代碼、服務器信息、響應頭部和響應數據。

以下是 HTTP 請求/響應的步驟:
1、客戶端連接到Web服務器
一個HTTP客戶端,通常是瀏覽器,與Web服務器的HTTP端口(默認爲80)建立一個TCP套接字連接。例如,http://www.baidu.com
2、發送HTTP請求
通過TCP套接字,客戶端向Web服務器發送一個文本的請求報文,一個請求報文由請求行、請求頭部、空行和請求數據4部分組成。
3、服務器接受請求並返回HTTP響應
Web服務器解析請求,定位請求資源。服務器將資源複本寫到TCP套接字,由客戶端讀取。一個響應由狀態行、響應頭部、空行和響應數據4部分組成。
4、釋放連接TCP連接
若connection 模式爲close,則服務器主動關閉TCP連接,客戶端被動關閉連接,釋放TCP連接;若connection 模式爲keepalive,則該連接會保持一段時間,在該時間內可以繼續接收請求;
5、客戶端瀏覽器解析HTML內容
客戶端瀏覽器首先解析狀態行,查看錶明請求是否成功的狀態代碼。然後解析每一個響應頭,響應頭告知以下爲若干字節的HTML文檔和文檔的字符集。客戶端瀏覽器讀取響應數據HTML,根據HTML的語法對其進行格式化,並在瀏覽器窗口中顯示。
例如:在瀏覽器地址欄鍵入URL,按下回車之後會經歷以下流程:
1、瀏覽器向 DNS 服務器請求解析該 URL 中的域名所對應的 IP 地址;
2、解析出 IP 地址後,根據該 IP 地址和默認端口 80,和服務器建立TCP連接;
3、瀏覽器發出讀取文件(URL 中域名後面部分對應的文件)的HTTP 請求,該請求報文作爲 TCP 三次握手的第三個報文的數據發送給服務器;
4、服務器對瀏覽器請求作出響應,並把對應的 html 文本發送給瀏覽器;
5、釋放 TCP連接;
6、瀏覽器將該 html 文本並顯示內容;

四、客戶端請求消息

客戶端發送一個HTTP請求到服務器的請求消息包括以下格式:
請求行(request line)、請求頭部(header)、空行和請求數據四個部分組成,下圖給出了請求報文的一般格式

在HTTP請求request中其請求頭部一般由以下一些信息組成
1、HTTP請求方式

GET      向Web服務器請求一個文件
POST     向Web服務器發送數據讓Web服務器進行處理
PUT      向Web服務器發送數據並存儲在Web服務器內部
HEAD     檢查一個對象是否存在
DELETE   從Web服務器上刪除一個文件
CONNECT  對通道提供支持
TRACE    跟蹤到服務器的路徑
OPTIONS  查詢Web服務器的性能

主要使用到“GET”和“POST”方式
2、Host
請求的web服務器域名地址
3、User-Agent
HTTP客戶端運行的瀏覽器類型的詳細信息。通過該頭部信息,web服務器可以判斷到當前HTTP請求的客戶端瀏覽器類別。
4、Accept
指定客戶端能夠接收的內容類型,內容類型中的先後次序表示客戶端接收的先後次序
注:在Prototyp(1.5)的Ajax代碼封裝中,將Accept默認設置爲“text/javascript, text/html, application/xml, text/xml, /”。這是因爲Ajax默認獲取服務器返回的Json數據模式。
在Ajax代碼中,可以使用XMLHttpRequest 對象中setRequestHeader函數方法來動態設置這些Header信息。
5、Accept-Language
指定HTTP客戶端瀏覽器用來展示返回信息所優先選擇的語言。
6、Accept-Encoding
指定客戶端瀏覽器可以支持的web服務器返回內容壓縮編碼類型
7、Accept-Charset
瀏覽器可以接受的字符編碼集
8、Content-Type
顯示此HTTP請求提交的內容類型。一般只有post提交時才需要設置該屬性。
有關Content-Type屬性值可以如下兩種編碼類型:
(1)“application/x-www-form-urlencoded”: 表單數據向服務器提交時所採用的編碼類型,默認的缺省值就是“application/x-www-form-urlencoded”。 然而,在向服務器發送大量的文本、包含非ASCII字符的文本或二進制數據時這種編碼方式效率很低。
(2)“multipart/form-data”: 在文件上載時,所使用的編碼類型應當是“multipart/form-data”,它既可以發送文本數據,也支持二進制數據上載。
當提交爲單單數據時,可以使用“application/x-www-form-urlencoded”;當提交的是文件時,就需要使用“multipart/form-data”編碼類型。
在Content-Type屬性當中還是指定提交內容的charset字符編碼。一般不進行設置,它只是告訴web服務器post提交的數據採用的何種字符編碼。
一般在開發過程,是由前端工程與後端UI工程師商量好使用什麼字符編碼格式來post提交的,然後後端ui工程師按照固定的字符編碼來解析提交的數據。所以這裏設置的charset沒有多大作用。
9、Connection
表示是否需要持久連接
如果web服務器端看到這裏的值爲“Keep-Alive”,或者看到請求使用的是HTTP 1.1(HTTP 1.1默認進行持久連接),它就可以利用持久連接的優點,當頁面包含多個元素時(例如Applet,圖片),顯著地減少下載所需要的時間。
10、cookie
HTTP請求發送時,會把保存在該請求域名下的所有cookie值一起發送給web服務器。
11、Referer
包含一個URL,用戶從該URL代表的頁面出發訪問當前請求的頁面。

下邊是一個POST請求(每行都有回車換號符)

POST / HTTP/1.1\r\n
Host: 119.255.80.100\r\n
User-Agent: Mozilla/4.0(compatible;MSIE6.0;Windows NT 5.0)\r\n
Accept-Language:zh-cn\r\n
Accept-Encoding:deflate\r\n
Accept:*/*\r\n
Connection:Keep-Alive\r\n
Content-Type: application/x-www-form-urlencoded\r\n
Content-Length:36\r\n
\r\n
mT=0&username=abc&password=abc%08091\r\n
\r\n

第一部分:請求行,第一行明瞭是POST請求,以及http1.1版本
第二部分:請求頭部,第二行至第六行
第三部分:空行,第七行的空行
第四部分:請求數據,第八行

五、HTTP請求方法

根據HTTP標準,HTTP請求可以使用多種請求方法
HTTP1.0定義了三種請求方法:GET, POST 和 HEAD方法
HTTP1.1新增了五種請求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法

GET     請求指定的頁面信息,並返回實體主體。
HEAD    類似於get請求,只不過返回的響應中沒有具體的內容,用於獲取報頭
POST    向指定資源提交數據進行處理請求(例如提交表單或者上傳文件)。數據被包含在請求體中。POST請求可能會導致新的資源的建立和/或已有資源的修改。
PUT     從客戶端向服務器傳送的數據取代指定的文檔的內容。
DELETE  請求服務器刪除指定的頁面。
CONNECT HTTP/1.1協議中預留給能夠將連接改爲管道方式的代理服務器。
OPTIONS 允許客戶端查看服務器的性能。
TRACE   回顯服務器收到的請求,主要用於測試或診斷。

六、服務器響應消息

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

在HTTP響應response中其信息頭部一般包含如下信息
1、Server
web服務器軟件名稱
2、Date
原始服務器消息發出的時間
3、Accept-Ranges
表明服務器是否支持指定範圍請求及哪種類型的分段請求
4、Age
從原始服務器到代理緩存形成的估算時間(以秒計,非負)
5、Allow
對某網絡資源的有效的請求行爲,不允許則返回405
6、Cache-Control
告訴所有的緩存機制是否可以緩存及哪種類型
7、Content-Encoding
web服務器支持的返回內容壓縮編碼類型
8、Content-Language
響應體的語言
9、Content-Length
響應體的長度
10、Content-Location
請求資源可替代的備用的另一地址
11、Content-MD5
返回資源的MD5校驗值
12、Content-Range
在整個返回體中本部分的字節位置
13、Content-Type
返回內容的MIME類型
14、ETag
請求變量的實體標籤的當前值
15、Expires
響應過期的日期和時間
16、Last-Modified
請求資源的最後修改時間
17、Location
用來重定向接收方到非請求URL的位置來完成請求或標識新的資源
18、Pragma
包括實現特定的指令,它可應用到響應鏈上的任何接收方
19、Proxy-Authenticate
它指出認證方案和可應用到代理的該URL上的參數
20、refresh
應用於重定向或一個新的資源被創造,在5秒之後重定向
21、Retry-After
如果實體暫時不可取,通知客戶端在指定時間之後再次嘗試
22、Set-Cookie
設置Http Cookie
23、Trailer
指出頭域在分塊傳輸編碼的尾部存在
24、Transfer-Encoding
文件傳輸編碼
25、Vary
告訴下游代理是使用緩存響應還是從原始服務器請求
26、Via
告知代理客戶端響應是通過哪裏發送的
27、Warning
警告實體可能存在的問題
28、WWW-Authenticate
表明客戶端請求實體應該使用的授權方案

下邊是一個服務器響應消息結構

HTTP/1.1 200 OK
Server: ABC_SERVER
Content-Type: application/json; charset=utf-8
Content-Md5: d01920026e6fcc99b4363dd69412d30e
Connection: keep-alive
Date: Thu, 10 Aug 2017 06:39:22 GMT
Content-Length: 108

{"result":true,"token":"3625c58ad4a6f3d78421977abac7ae24","expiretime":1502347461,"responseTime":1502347162}

第一部分:狀態行,由HTTP協議版本號, 狀態碼, 狀態消息 三部分組成。
第一行爲狀態行,(HTTP/1.1)表明HTTP版本爲1.1版本,狀態碼爲200,狀態消息爲(ok)
第二部分:消息報頭,用來說明客戶端要使用的一些附加信息
第二行和第三行爲消息報頭,Content-Type:指定了MIME類型的HTML(text/html),編碼類型是UTF-8 Date:生成響應的日期和時間
第三部分:空行,消息報頭後與正文部分的空行是必須的
第四部分:響應正文,服務器返回給客戶端的文本信息空行後面的部分爲響應正文

七、HTTP狀態碼

當瀏覽者訪問一個網頁時,瀏覽者的瀏覽器會向網頁所在服務器發出請求。當瀏覽器接收並顯示網頁前,此網頁所在的服務器會返回一個包含HTTP狀態碼的信息頭(server header)用以響應瀏覽器的請求。
HTTP狀態碼的英文爲HTTP Status Code
狀態代碼有三位數字組成,第一個數字定義了響應的類別,共分五種類別:
1xx:指示信息–表示請求已接收,繼續處理
2xx:成功–表示請求已被成功接收、理解、接受
3xx:重定向–要完成請求必須進行更進一步的操作
4xx:客戶端錯誤–請求有語法錯誤或請求無法實現
5xx:服務器端錯誤–服務器未能實現合法的請求
下面是常見的HTTP狀態碼:

200 OK                        //客戶端請求成功
400 Bad Request               //客戶端請求有語法錯誤,不能被服務器所理解
401 Unauthorized              //請求未經授權,這個狀態代碼必須和WWW-Authenticate報頭域一起使用 
403 Forbidden                 //服務器收到請求,但是拒絕提供服務
404 Not Found                 //請求資源不存在,eg:輸入了錯誤的URL
500 Internal Server Error     //服務器發生不可預期的錯誤
503 Server Unavailable        //服務器當前不能處理客戶端的請求,一段時間後可能恢復正常
505 HTTP Version not supported //服務器不支持請求的HTTP協議的版本,無法完成處理
HTTP狀態碼分類
分類 分類描述
1** 信息,服務器收到請求,需要請求者繼續執行操作
2** 成功,操作被成功接收並處理
3** 重定向,需要進一步的操作以完成請求
4** 客戶端錯誤,請求包含語法錯誤或無法完成請求
5** 服務器錯誤,服務器在處理請求的過程中發生了錯誤

八、HTTP統一資源標識符URL

HTTP使用統一資源標識符(Uniform Resource Identifiers, URI)來傳輸數據和建立連接。URL是一種特殊類型的URI,包含了用於查找某個資源的足夠的信息
URL,全稱是UniformResourceLocator, 中文叫統一資源定位符,是互聯網上用來標識某一處資源的地址。以下面這個URL爲例,介紹下普通URL的各部分組成:
http://www.powersdazf.com:8080/news/index.asp?boardID=1&ID=2367&page=1#name
從上面的URL可以看出,一個完整的URL包括以下幾部分:
1.協議部分:該URL的協議部分爲“http:”,這代表網頁使用的是HTTP協議。在Internet中可以使用多種協議,如HTTP,FTP等等本例中使用的是HTTP協議。在”HTTP”後面的“//”爲分隔符
2.域名部分:該URL的域名部分爲“www.powersdazf.com”。一個URL中,也可以使用IP地址作爲域名使用
3.端口部分:跟在域名後面的是端口,域名和端口之間使用“:”作爲分隔符。端口不是一個URL必須的部分,如果省略端口部分,將採用默認端口
4.虛擬目錄部分:從域名後的第一個“/”開始到最後一個“/”爲止,是虛擬目錄部分。虛擬目錄也不是一個URL必須的部分。本例中的虛擬目錄是“/news/”
5.文件名部分:從域名後的最後一個“/”開始到“?”爲止,是文件名部分,如果沒有“?”,則是從域名後的最後一個“/”開始到“#”爲止,是文件部分,如果沒有“?”和“#”,那麼從域名後的最後一個“/”開始到結束,都是文件名部分。本例中的文件名是“index.asp”。文件名部分也不是一個URL必須的部分,如果省略該部分,則使用默認的文件名
6.錨部分:從“#”開始到最後,都是錨部分。本例中的錨部分是“name”。錨部分也不是一個URL必須的部分
7.參數部分:從“?”開始到“#”爲止之間的部分爲參數部分,又稱搜索部分、查詢部分。本例中的參數部分爲“boardID=5&ID=24618&page=1”。參數可以允許有多個參數,參數與參數之間用“&”作爲分隔符。

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