簡單的HTTP協議

語言: CN / TW / HK

theme: condensed-night-purple

本文正在參與 “網路協議必知必會”徵文活動


關於HTTP協議

  • 應用HTTP協議時,必定是一端擔任客戶端角色,一端擔任伺服器端角色
  • HTTP協議通過請求和響應的交換達成通訊。請求從客服端發出,最後伺服器端響應該請求並返回
  • HTTP協議是不儲存狀態的,即無狀態協議,協議對傳送或響應的請求都不作持久化處理

告知伺服器意圖的HTTP方法

  • GET:獲取資源

GET方法用來請求已經被URI標識的資源

Snip20210719_18.png

  • POST:傳輸實體主體

POST方法用來傳輸實體的主體。POST方法和GET方法功能相似,但是POST的主要目的並不是獲取響應的主體內容

Snip20210719_19.png

  • PUT:傳輸檔案

PUT方法用來傳輸檔案。在請求報文的主體中包含檔案內容,然後儲存到請求URI指定的位置。

Snip20210719_20.png

  • DELETE:刪除檔案

DELETE方法用來刪除檔案。與PUT相反的方法,DELETE方法按請求URI刪除指定的資源。

Snip20210719_28.png

  • HEAD:獲得報文首部

HEAD方法和GET方法一樣,但是不返回報文主體部分,用於確認URI的有效性及資源更新的日期時間等。

Snip20210719_29.png

  • OPTIONS:詢問支援的方法

OPTIONS方法用來查詢針對請求URI指定的資源支援的方法

Snip20210719_30.png

  • TRACE:追蹤路徑

傳送請求時,在Max-Forward首部欄位中填入數值,每經過一個伺服器端就將該數字減1,當數值剛好減到0時,就停止繼續傳輸,最後接收到請求的伺服器端則返回狀態碼200 OK的響應

客戶端通過TRACE方法可以查詢發出去的請求是怎麼被加工修改的,這是因為,請求想要連線到源目標伺服器可能會通過代理中轉,TRACE方法就是用來確認連線過程中發生的一些列操作

Snip20210719_31.png

  • CONNECT:要求用隧道協議連線代理

    CONNECT方法要求在代理伺服器通訊時建立隧道,實現用隧道協議進行TCP通訊,主要使用SSL(Secure Sockets Layer,安全套接層)和TLS(Transport Layer Security,傳輸層安全)協議把通訊內容加密後經網路隧道傳輸

Snip20210719_32.png


持久連線節省通訊量

  • HTTP協議的初始版本中,每進行一次HTTP通訊就要斷開一次TCP連線

比如,使用瀏覽器瀏覽一個包含多張圖片的HTML頁面時,在傳送請求訪問HTML頁面資源的同時,也會請求該HTML頁面裡包含的其他資源。因此,每次的請求都會造成無謂的TCP連線建立和斷開,增加通訊量的開銷

Snip20210720_37.png

  • 持久連線

只要任意一端沒有明確提出斷開連線,則保持TCP連線狀態。

持久連線的好處在於減少了TCP連線的重複建立和斷開所造成的額外開銷,減輕了伺服器端的負載。另外,減少開銷的那部分時間,使HTTP請求和響應能夠更早地結束,這樣Web頁面的顯示速度也就相應提高了

Snip20210720_36.png

  • 管線化

持久連線使得多數請求以管線化(pipelining)方式傳送成為可能。

從前傳送請求後需等待並收到響應,才能傳送下一個請求。管線化技術出現後,不用等待響應亦可直接傳送下一個請求。這樣就能夠做到同時並行傳送多個請求,而不需要一個接一個地等待響應了。

 ![Snip20210720_35.png](https://p6-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/b1cfa375b3454b45b4c73e03eadaabbe~tplv-k3u1fbpfcp-watermark.image)

使用Cookie的狀態管理

  • 引入Cookie技術的原因

由於HTTP是無狀態協議,假設要求登入認證的Web頁面本身無法進行狀態的管理(不記錄登入狀態),那麼每次跳轉新頁面都需要再次登入

  • 使用Cookie技術管理狀態

Cookie技術通過在請求和響應報文中寫入Cookie資訊來控制客戶端的狀態。

Cookie 會根據從伺服器端傳送的響應報文內的一個叫做Set-Cookie的首部欄位資訊,通知客戶端儲存Cookie。當下次客戶端再往該伺服器傳送請求時,客戶端會自動在請求報文中加入Cookie值後傳送出去。伺服器端發現客戶端傳送過來的Cookie後,會去檢查究竟是從哪一個客戶端發來的連線請求,然後對比伺服器上的記錄,最後得到之前的狀態資訊。

  • 第一次,沒有Cookie資訊狀態下的請求

    Snip20210720_33.png - 第二次及以後,存在Cookie資訊狀態下的請求 Snip20210720_34.png