《圖解HTTP》學(xué)習(xí)筆記(二):簡(jiǎn)單的HTTP協(xié)議

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.jp
    

    GET表示請(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)看,文檔中包含大量的圖片是很平常的需求,所以這種通信一次就斷掉的方法就不可取了。

連接一次斷開一次.png
  • 為解決以上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,歡迎討論

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容