HTTP協議格式詳解

上一篇介紹了HTTP協議的版本迭代歷史,本篇繼續深入介紹一下HTTP協議的規範,本文主要介紹它的URIRequestResponse、狀態碼等等信息,通過了解這些具體的內容,可以更直觀的理解HTTP的協議格式,以及工作原理。

一、URI結構

HTTP使用統一資源標識符(URI)來傳輸數據和建立連接。URL(統一資源定位符)是一種特殊種類的URI,包含了用於查找的資源的足夠的信息,我們一般常用的就是URL,而一個完整的URL包含下面幾部分:

http://www.fishbay.cn:80/mix/76.html?name=kelvin&password=123456#first

1.協議部分

URL的協議部分爲http:,表示網頁用的是HTTP協議,後面的//爲分隔符

2.域名部分

域名是www.fishbay.cn,發送請求時,需要向DNS服務器解析IP。如果爲了優化請求,可以直接用IP作爲域名部分使用

3.端口部分

域名後面的80表示端口,和域名之間用:分隔,端口不是一個URL的必須的部分。如果端口是80,也可以省略不寫

4.虛擬目錄部分

從域名的第一個/開始到最後一個/爲止,是虛擬目錄的部分。其中,虛擬目錄也不是URL必須的部分,本例中的虛擬目錄是/mix/

5.文件名部分

從域名最後一個/開始到?爲止,是文件名部分;如果沒有?,則是從域名最後一個/開始到#爲止,是文件名部分;如果沒有?#,那麼就從域名的最後一個/從開始到結束,都是文件名部分。本例中的文件名是76.html,文件名也不是一個URL的必須部分,如果沒有文件名,則使用默認文件名

6.錨部分

#開始到最後,都是錨部分。本部分的錨部分是first,錨也不是一個URL必須的部分

7.參數部分

?開始到#爲止之間的部分是參數部分,又稱爲搜索部分、查詢部分。本例中的參數是name=kelvin&password=123456,如果有多個參數,各個參數之間用&作爲分隔符。

二、Request

HTTP的請求包括:請求行(request line)、請求頭部(header)、空行 和 請求數據 四個部分組成。

Http請求消息結構

抓包的request結構如下:

GET /mix/76.html?name=kelvin&password=123456 HTTP/1.1
Host: www.fishbay.cn
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding: gzip, deflate, sdch
Accept-Language: zh-CN,zh;q=0.8,en;q=0.6

1.請求行

GET爲請求類型,/mix/76.html?name=kelvin&password=123456爲要訪問的資源,HTTP/1.1是協議版本

2.請求頭部

從第二行起爲請求頭部,Host指出請求的目的地(主機域名);User-Agent是客戶端的信息,它是檢測瀏覽器類型的重要信息,由瀏覽器定義,並且在每個請求中自動發送。

3.空行

請求頭後面必須有一個空行

4.請求數據

請求的數據也叫請求體,可以添加任意的其它數據。這個例子的請求體爲空。

Response

一般情況下,服務器收到客戶端的請求後,就會有一個HTTP的響應消息,HTTP響應也由4部分組成,分別是:狀態行、響應頭、空行 和 響應體。

http響應消息格式

抓包的數據如下:

HTTP/1.1 200 OK
Server: nginx
Date: Mon, 20 Feb 2017 09:13:59 GMT
Content-Type: text/plain;charset=UTF-8
Vary: Accept-Encoding
Cache-Control: no-store
Pragrma: no-cache
Expires: Thu, 01 Jan 1970 00:00:00 GMT
Cache-Control: no-cache
Content-Encoding: gzip
Transfer-Encoding: chunked
Proxy-Connection: Keep-alive

{"code":200,"notice":0,"follow":0,"forward":0,"msg":0,"comment":0,"pushMsg":null,"friend":{"snsCount":0,"count":0,"celebrityCount":0},"lastPrivateMsg":null,"event":0,"newProgramCount":0,"createDJRadioCount":0,"newTheme":true}

1.狀態行

狀態行由協議版本號、狀態碼、狀態消息組成

2.響應頭

響應頭是客戶端可以使用的一些信息,如:Date(生成響應的日期)、Content-Type(MIME類型及編碼格式)、Connection(默認是長連接)等等

3.空行

響應頭和響應體之間必須有一個空行

4.響應體

響應正文,本例中是鍵值對信息

三、狀態碼

HTTP協議的狀態碼由3位數字組成,第一個數字定義了響應的類別,共有5中類別:

1.1xx: 指示信息–表示請求已接收,繼續處理

2.2xx: 成功–表示請求已被成功接收、理解、接受

3.3xx: 重定向–要完成請求必須進行更進一步的操作

4.4xx: 客戶端錯誤–請求有語法錯誤或請求無法實現

5.5xx: 服務器端錯誤–服務器未能實現合法的請求

其中,常用的狀態碼如下:

200 OK                        //客戶端請求成功
400 Bad Request               //客戶端請求有語法錯誤,不能被服務器所理解
401 Unauthorized              //請求未經授權,這個狀態代碼必須和WWW-Authenticate報頭域一起使用 
403 Forbidden                 //服務器收到請求,但是拒絕提供服務
404 Not Found                 //請求資源不存在,eg:輸入了錯誤的URL
500 Internal Server Error     //服務器發生不可預期的錯誤
503 Server Unavailable        //服務器當前不能處理客戶端的請求,一段時間後可能恢復正常

如需瞭解更多的狀態碼,請參考這個網址:HTTP狀態碼

四、請求方法

HTTP定義了多種請求方法,來滿足各種需求。HTTP/1.0定義了三種請求方法:GETPOSTHEAD,到了HTTP/1.1,新增了五種請求方法:OPTIONSPUTDELETETRACECONNECT。各個請求方法的具體功能如下:

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

實際應用過程中,GETPOST使用的比較多,下面主要介紹一下二者的區別:

1.請求參數的區別

GET請求會把請求的參數拼接在URL後面,以?分隔,多個參數之間用&連接;如果是英文或數字,原樣發送,如果是空格或中文,則用Base64編碼

POST請求會把提交的數據放在請求體中,不會在URL中顯示出來

2.傳輸數據的大小

GET: 瀏覽器和服務器會限制URL的長度,所以傳輸的數據有限,一般是2K

POST: 由於數據不是通過URL傳遞,所以一般可以傳輸較大量的數據

3.數據解析

GET: 通過Request.QueryString獲取變量的值

POST: 通過Request.form獲取變量的值

4.安全性

GET: 請求參數在URL後面,可以直接看到,尤其是登錄時,如果登錄界面被瀏覽器緩存,其他人就可以通過查看歷史記錄,拿到賬戶和密碼

POST: 請求參數在請求體裏面傳輸,無法直接拿到,相對GET安全性較高;但是通過抓包工具,還是可以看到請求參數的

五、工作原理

HTTP協議採用請求/響應模式,客戶端向服務器發送一個請求報文,然後服務器響應請求。下面介紹一下一次HTTP請求的過程:

  1. 在瀏覽器中輸入URL,並按下回車鍵
  2. 瀏覽器向DNS服務器請求解析該URL中的域名對應的IP地址(如果是IP請求,則不需要該步驟)
  3. 解析出IP後,根據IP和端口號,和服務器建立TCP連接
  4. 瀏覽器向服務器發送請求,該請求報文作爲TCP三次握手的第三個報文發送給服務器
  5. 服務器做出響應,把數據發送給瀏覽器
  6. 通信完成,斷開TCP連接
  7. 瀏覽器解析收到的數據並顯示

六、HTTPS簡介

HTTPS是安全的HTTP通道,即在HTTP通信中加入了SSL層(當前版本是TLS1.2),通信的數據被加密了,防止被竊取,具體的通信流程如下:

圖3

HTTPS使用的加密方式結合了對稱加密和不對稱加密的特點,在保證安全的情況下,又提高了傳輸效率。HTTP和HTTPS的區別如下:

1.https協議需要到ca申請證書,一般免費證書很少,需要交費。

2.http的信息是明文傳輸,https 則是具有安全性的ssl加密傳輸協議。

3.http和https用的端口不一樣,前者是80,後者是443。

4.http的連接很簡單,是無狀態的;HTTPS協議是由SSL+HTTP協議構建的可進行加密傳輸、身份認證的網絡協議,比http協議安全


至此,HTTP的介紹就告一段落了,當然HTTP協議的內容還是很多的,本文只是涉及了常用的部分,文中不足之處,還請各位看官指出。(文中圖片來自互聯網,如有侵權,請告知,我怕賠不起)

參考資料

http://www.jianshu.com/p/a01e5b4b64ec

http://www.jianshu.com/p/a6d04501ed6d

發佈了49 篇原創文章 · 獲贊 16 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章