關(guān)于圖解HTTP協(xié)議摘要,全部?jī)?nèi)容上傳到本人的Github,歡迎fork。
2.0 目錄
2.1 客戶端和服務(wù)端之間的通信
2.2 通過(guò)請(qǐng)求和響應(yīng)的交換達(dá)成通信
2.3 HTTP是不保存狀態(tài)的協(xié)議
2.4 請(qǐng)求URI定位資源
2.5 與服務(wù)端交互的方法
2.6 HTTP/1.1支持的方法
2.7 持久連接節(jié)省通信量
2.8 cookie
2.1 客戶端和服務(wù)端之間的通信
HTTP協(xié)議是基于客戶端和服務(wù)端之間的通信
2.2 通過(guò)請(qǐng)求和響應(yīng)的交換達(dá)成通信
請(qǐng)求必定是從客戶端發(fā)出,服務(wù)端響應(yīng)請(qǐng)求并返回。HTTP協(xié)議不支持雙向通信,WebSocket協(xié)議支持。
客戶端請(qǐng)求報(bào)文:
POST /form/entry HTTP/1.1
Host: example.com
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded
Content-Length: 16
name=ueno&age=37
服務(wù)端響應(yīng)報(bào)文:
HTTP/1.1 200 OK
Date: Tue, 10 Jul 2012 06:50:15 GMT
Content-Length: 362
Content-Type: text/html
<html>
...
2.3 HTTP是不保存狀態(tài)的協(xié)議
HTTP協(xié)議自身不保存請(qǐng)求和相應(yīng)之間的通信狀態(tài)??梢允褂胏ookie來(lái)保存狀態(tài)信息。
2.4 請(qǐng)求URI定位資源
URI可以定位互聯(lián)網(wǎng)上的所有資源。
GET /index.html HTTP/1.1
Host: example.com
2.5 與服務(wù)端交互的方法
- GET:訪問(wèn)已經(jīng)被URI識(shí)別的資源,指定的資源被解析之后,返回響應(yīng)的內(nèi)容。
GET /index.html HTTP/1.1
Host: example.com
-------------------------
返回index.html的頁(yè)面資源
GET /index.html HTTP/1.1
Host: example.com
If-Modified-Since: Thu, 12 Jul 2012 07:30:00 GMT
-------------------------------------------------------
僅返回2012年7月12日07:30:00以后更新過(guò)的index.html的頁(yè)面資源
如果沒(méi)有內(nèi)容更新,返回狀態(tài)碼 304 Not Modified
- POST:傳輸客戶端的數(shù)據(jù)
POST /submit.cgi HTTP/1.1
Host: www.example.com
Content-Length: 1560
-----------------------------
返回submit.cgi接收數(shù)據(jù)的處理結(jié)果
- PUT:指定URI上傳文件,自身沒(méi)有驗(yàn)證機(jī)制,一般不開(kāi)放。REpresentational State Transfer標(biāo)準(zhǔn)的Web網(wǎng)站可能會(huì)開(kāi)放。
PUT /example.html HTTP/1.1
Host: www.example.com
Content-Type: text/html
Content-Length: 1560
-----------------------------------------
返回狀態(tài)碼 204 No Content(表示該文件已存在)
- HEAD:除了不返回報(bào)文主體部分,其它和GET方法一樣。用于確認(rèn)URI的有效性和資源的更新時(shí)間。
HEAD /example.com HTTP/1.1
Host: www.example.com
--------------------------
返回index.html的響應(yīng)首部
- DELETE:刪除指定URI上的文件
DELETE /example.com HTTP/1.1
Host: www.example.com
---------------------------------------------
返回狀態(tài)碼 204 No Content(表示該html已經(jīng)被刪除)
- OPTIONS: 返回針對(duì)URI指定資源支持的方法
OPTIONS /example.com HTTP/1.1
Host: www.example.com
--------------------------------------------------
HTTP/1.1 200 OK
Allow: GET, POST, HEAD, OPTIONS(返回服務(wù)器指定的方法)
TRACE:追蹤路徑,因?yàn)镃ross-Site Tracing Attack,基本不用
-
CONNECT: 要求使用隧道協(xié)議連接代理,在隧道內(nèi)使用TCP協(xié)議通信
使用 Secure Socket Layer 和 Transport Layer Security 加密傳輸
CONNECT proxy.example.com:8080 HTTP/1.1 Host: proxy.example.com ----------------------------------------- HTTP/1.1 200 OK(進(jìn)入網(wǎng)絡(luò)隧道)
2.6 HTTP/1.1支持的方法
| Method | Explanation |
|---|---|
| GET | 獲取資源 |
| POST | 傳輸實(shí)體主體 |
| PUT | 傳輸文件 |
| HEAD | 獲取報(bào)文頭部 |
| DELETE | 刪除文件 |
| OPTIONS | 詢問(wèn)支持的方法 |
| TRACE | 追蹤路徑 |
| CONNECT | 使用隧道協(xié)議連接代理 |
2.7 持久連接節(jié)省通信量
在HTTP最初的設(shè)計(jì)中,每進(jìn)行一次HTTP通信都要斷開(kāi)一次TCP連接。

每個(gè)資源都要發(fā)起一次完整的HTTP請(qǐng)求,一個(gè)網(wǎng)頁(yè)能需要很多次請(qǐng)求。

持久連接:Keep-Live,只要任意一端沒(méi)有明確提出斷開(kāi)連接,則一直保持TCP連接狀態(tài)。

持久連接的好處是:減少了TCP連接重復(fù)地建立和斷開(kāi)造成的額外開(kāi)銷,減輕了服務(wù)端的負(fù)載。并且降低了請(qǐng)求和響應(yīng)時(shí)間,提高了web頁(yè)面的響應(yīng)速度。
管線化:不用等待服務(wù)端響應(yīng),就可以直接發(fā)送下一個(gè)請(qǐng)求。請(qǐng)求越多,響應(yīng)速度提升越明顯。

2.8 cookie
HTTP協(xié)議是無(wú)狀態(tài)協(xié)議,不記錄之前發(fā)生過(guò)的請(qǐng)求和響應(yīng)狀態(tài)。
Cookie技術(shù),服務(wù)端在響應(yīng)報(bào)文中添加一個(gè)Set-Cookie的首部字段信息,通知客戶端保存Cookie。當(dāng)下次客戶端在往服務(wù)端發(fā)送請(qǐng)求時(shí),客戶端會(huì)自動(dòng)在請(qǐng)求頭部添加cookie后發(fā)送。服務(wù)端根據(jù)cookie查詢連接記錄,找到對(duì)應(yīng)的連接狀態(tài)。

GET /reader/ HTTP/1.1
Host www.example.com
---------------------------------------------------------------------------------
HTTP/1.1 200 OK
Date: Thu, 12 Jul 2012 07:12:20 GMT
Server: Apache
<Set-Cookie: sid=1342077140226724; path=/; expires=Wed, 10-Otc-12 07:12:20 GMT>
Content-Type: text/plain; charset: UTF-8
---------------------------------------------------------------------------------
GET /image/ HTTP/1.1
Host: www.example.com
Cookie: sid=1342077140226724