HTTP協(xié)議是用于客戶端和服務(wù)端之間的通信
- 請(qǐng)求訪問(wèn)文本或圖像等資源的一端稱作為客戶端,而提供資源的一端稱作為服務(wù)端。
- 在一條HTTP通信線路上,客戶端和服務(wù)端是確定,必須有一端是客戶端和有一端是服務(wù)端。實(shí)際情況中,客戶端、服務(wù)端的角色可能會(huì)互換,但是從僅從一條通信線路上說(shuō),這兩端是確定的。
- HTTP是不保存狀態(tài)的協(xié)議HTTP協(xié)議自身不對(duì)請(qǐng)求和響應(yīng)之間的通信狀態(tài)進(jìn)行保存。
簡(jiǎn)單的http協(xié)議
通信是從客戶端開始建立的,客戶端向服務(wù)端發(fā)送請(qǐng)求,服務(wù)端響應(yīng)請(qǐng)求并且返回?cái)?shù)據(jù)。那么就是通過(guò)請(qǐng)求和響應(yīng)的交換達(dá)成通信。
-
客戶端發(fā)送請(qǐng)求的例子:
GET /index.html HTTP/1.1 HOST: hackr.jpGET表示請(qǐng)求的方式、方法(method),/index.html表示請(qǐng)求指定資源,稱為URI(request-URI),最后HTTP/1.1表示客戶端使用的協(xié)議版本。
請(qǐng)求報(bào)文是由請(qǐng)求方法、請(qǐng)求 URI、協(xié)議版本、可選的請(qǐng)求首部字段和內(nèi)容實(shí)體構(gòu)成的。
-
服務(wù)器響應(yīng)的例子:
HTTP/1.1 200 ok Date: Tue, 10 Jul 2012 06:50:15 GMT Content-Length: 363 Content-Type: text/html <html> ...HTTP/1.1: 服務(wù)器的協(xié)議版本
200 ok: 響應(yīng)的狀態(tài)碼和原因短語(yǔ)(簡(jiǎn)短的解釋)
Date: Tue, 10 Jul 2012 06:50:15 GMT: 創(chuàng)建響應(yīng)的時(shí)間
下面就是首部字段,然后空一行就是內(nèi)容實(shí)體。
告知服務(wù)器意圖的HTTP方法
-
GET 獲取資源
GET方法用來(lái)請(qǐng)求已被已被URI識(shí)別(存在的)的資源。指定的資源經(jīng)服務(wù)器解析后返回響應(yīng)內(nèi)容。
-
POST 傳輸實(shí)體主體
向服務(wù)器傳輸主體,POST的主要目的并不是獲取響應(yīng)的主體內(nèi)容。
PUT 傳輸文件
-
HEAD 獲取報(bào)文的首部
與GET類似,只是響應(yīng)不會(huì)返回報(bào)文主體部分,只有頭部。
DELETE 刪除文件
-
OPTIONS 詢問(wèn)支持的方法
用來(lái)查詢針對(duì)請(qǐng)求URI指定的資源支持的方法。
比如:// 請(qǐng)求 OPTIONS * HTTP/1.1 Host: www.hackr.jp // 響應(yīng) HTTP/1.1 200 OK Allow: GET,POST,HEAD,OPTIONS -
TRACE 追蹤路徑
客戶端通過(guò)TRACE方法可以查詢發(fā)出去的請(qǐng)求是怎么被加工修改、篡改的。一個(gè)請(qǐng)求想要連接到原目標(biāo)服務(wù)器可能通過(guò)代理中轉(zhuǎn),TRACE方法就是用來(lái)確認(rèn)連接過(guò)程中發(fā)生的一系列的操作。但是TRACE方法本來(lái)不怎么常用,在加上它容易引發(fā)XST(Cross-Site Tracing,跨站追蹤)攻擊,通常就更不會(huì)使用了
-
CONNECT 要求用隧道協(xié)議連接代理
要求在與代理服務(wù)器通信時(shí)建立隧道,實(shí)現(xiàn)用隧道協(xié)議進(jìn)行TCP通信。主要使用SSL(Secure Sockets Layer,安全套裝層)和TSL(Transport Layer Security,傳輸層安全)協(xié)議把通信內(nèi)容加密后經(jīng)網(wǎng)絡(luò)隧道傳輸。
持久連接節(jié)省通信量
HTTP初期的版本中,每進(jìn)行一次通信就要斷開一次TCP連接,以當(dāng)年通信情況來(lái)說(shuō),因?yàn)槎际侨萘啃〉奈谋緜鬏?,所以即使這樣也沒(méi)有什么問(wèn)題,但是現(xiàn)在來(lái)看,文檔中包含大量的圖片是很平常的需求,所以這種通信一次就斷掉的方法就不可取了。

-
為解決以上TCP通信問(wèn)題,HTTP/1.1和一部分HTTP/1.0想出了持久連接(HTTP Persistent Connections,也稱為HTTP keep-alive或HTTP connection reuse)的方法。持久連接的特點(diǎn)是,只要任意一方?jīng)]有提出明確的斷開連接,則保持TCP連接狀態(tài)。
持續(xù)連接.png
在HTTP/1.1中,所有的默認(rèn)連接都是持久連接,在HHTP/1.0中并沒(méi)有標(biāo)準(zhǔn)化??蛻舳撕头?wù)端需要同時(shí)支持持久化才行。
使用Cookie的狀態(tài)管理
HTTP是無(wú)狀態(tài)協(xié)議,它不對(duì)之前發(fā)生過(guò)的請(qǐng)求和響應(yīng)的狀態(tài)進(jìn)行管理。也正是因?yàn)檫@一特性,自然可以減少服務(wù)器的CPU及內(nèi)存資源的消耗。從另一側(cè)面來(lái)說(shuō),也正是HTTP協(xié)議本事是非常簡(jiǎn)單的,所以才會(huì)被應(yīng)用在各種場(chǎng)景中。
-
需要記錄狀態(tài)的場(chǎng)景:假設(shè)要求登錄認(rèn)證的Web頁(yè)面本身無(wú)法進(jìn)行狀態(tài)管理(不記錄的狀態(tài)),那么每次跳轉(zhuǎn)新頁(yè)面就要再次登錄,或者要在每次請(qǐng)求報(bào)文中附加參數(shù)來(lái)管理登錄狀態(tài)。
如果讓服務(wù)器管理全部客戶端狀態(tài)則會(huì)成為負(fù)擔(dān)
在保留無(wú)狀態(tài)這個(gè)特性的同是又要解決類似的矛盾問(wèn)題,于是引入了Cookie技術(shù)。Cookie是通過(guò)在請(qǐng)求和響應(yīng)報(bào)文中寫入Cookie信息來(lái)控制客戶端的狀態(tài)。
Cookie 會(huì)根據(jù)從服務(wù)端發(fā)送的響應(yīng)報(bào)文內(nèi)的一個(gè)叫做Set-Cookie的首部字段信息,通知客戶端保存Cookie。當(dāng)下次客戶端再往該服務(wù)器發(fā)送請(qǐng)求時(shí),客戶端會(huì)自動(dòng)在請(qǐng)求報(bào)文中加入Cookie值后發(fā)送出去。服務(wù)器端發(fā)現(xiàn)客戶端發(fā)過(guò)來(lái)的請(qǐng)求中包含Cookie信息,拿著Cookie信息去服務(wù)器上的記錄對(duì)比,來(lái)確定是哪一個(gè)客戶端,做相應(yīng)的操作。
- 沒(méi)有Cookie.png
- 第二次請(qǐng)求帶Cookie.png
相應(yīng)的頭部:
1.請(qǐng)求報(bào)文(沒(méi)有Cookie信息狀態(tài))
GET /reader/ HTTP/1.1
Host: hackr.jp
* 首部字段沒(méi)有cookie的相關(guān)信息
2.響應(yīng)報(bào)文(服務(wù)器生成Cookie信息)
HTTP/1.1 200 OK
Date: Thu, 12 Jul 2012 07:12:20 GMT
Server: Apache
<Set-Cookie: sid=1123423543234325; path=/; expires=Wed,10-Oct-12 07:12:20 GMT>
Content-Type: text/plain; charset=UTF-8
3.請(qǐng)求報(bào)文(自動(dòng)發(fā)送保存著Cookie信息)
GET /image/ HTTP/1.1
Host: hackr.jp
Cookie: sid=1123423543234325
github 歡迎Star,歡迎討論



