【網路協議-2】Http協議
原文連線:https://www.jianshu.com/p/8fe93a14754c
HTTP連線最顯著的特點是客戶端傳送的每次請求都需要伺服器回送響應,在請求結束後,會主動釋放連線。從建立連線到關閉連線的過程稱為“一次連線
HTTP
使用統一資源識別符號(URI
)來傳輸資料和建立連線。URL
(統一資源定位符)是一種特殊種類的URI
,包含了用於查詢的資源的足夠的資訊,我們一般常用的就是URL
,而一個完整的URL
包含下面幾部分:
一、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
定義了三種請求方法:GET
、POST
和 HEAD
,到了HTTP/1.1
,新增了五種請求方法:OPTIONS
、PUT
、DELETE
、TRACE
和 CONNECT
。各個請求方法的具體功能如下:
GET 請求指定的頁面資訊,並返回實體主體。
HEAD 類似於get請求,只不過返回的響應中沒有具體的內容,用於獲取報頭
POST 向指定資源提交資料進行處理請求(例如提交表單或者上傳檔案)。資料被包含在請求體中。POST請求可能會導致新的資源的建立和/或已有資源的修改。
PUT 從客戶端向伺服器傳送的資料取代指定的文件的內容。
DELETE 請求伺服器刪除指定的頁面。
CONNECT HTTP/1.1協議中預留給能夠將連線改為管道方式的代理伺服器。
OPTIONS 允許客戶端檢視伺服器的效能。
TRACE 回顯伺服器收到的請求,主要用於測試或診斷。
POST/GET 區別:
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
請求的過程:
- 在瀏覽器中輸入
URL
,並按下回車鍵 - 瀏覽器向
DNS
伺服器請求解析該URL
中的域名對應的IP
地址(如果是IP
請求,則不需要該步驟) - 解析出
IP
後,根據IP
和埠號,和伺服器建立TCP連線 - 瀏覽器向伺服器傳送請求,該請求報文作為
TCP
三次握手的第三個報文傳送給伺服器 - 伺服器做出響應,把資料傳送給瀏覽器
- 通訊完成,斷開
TCP
連線 - 瀏覽器解析收到的資料並顯示