1. 程式人生 > 實用技巧 >【HTTP圖解】2-簡單的HTTP協議

【HTTP圖解】2-簡單的HTTP協議

目錄

HTTP協議用於客戶端和伺服器端之間的通訊

請求訪問文字或影象等資源的一端稱為客戶端,而提供資源響應的一端稱為伺服器端。

通過請求和響應的交換達成通訊

HTTP協議規定,請求從客戶端發出,最後伺服器端響應該請求並返回。

GET /index.html HTTP/1.1
Host: hackr.jp
  • “GET”表示請求伺服器的型別,稱為“方法”
  • "/index.html"指明瞭請求訪問的資源物件,也叫做請求URI(request-URI)
  • 最後的“HTTP/1.1”,即HTTP的版本號,用來提示客戶端使用的HTTP協議功能。

接收請求的伺服器,會將請求內容的處理結果以響應的形式返回。

HTTP/1.1 200 OK
Date: Tue, 10 Jul 2012 06:50:15 GMT
Content-Length: 362
Content-Type: text/html
 
<html>
...
  • HTTP/1.1 表示伺服器對應的HTTP版本
  • 200 請求的處理結果的狀態碼(status code)
  • OK 原因短語(reason-phrase)
  • 下一行是建立響應的日期時間,是首部欄位(header field)內的一個屬性
  • 可選的響應首部欄位
  • 隔一空行,之後的內容稱為資源實體的主體(entity body)

請求報文是由請求方法、請求URI、協議版本、可選的請求首部欄位和內容實體構成的。

HTTP是不儲存狀態的協議

協議對於傳送過的請求或響應都不做持久化處理,這是為了更快地處理大量事務,確保協議的可伸縮性,而特意把HTTP協議設計成如此簡單的。

可是隨診Web的不斷髮展,因無狀態而大致業務處理變得棘手的情況增多了。比如,登入到一家購物網站,即使它跳轉到該站的其他頁面,也需要能繼續保持登入狀態。

HTTP/1.1雖然是無狀態協議,但為了實現期望的保持狀態功能,引入了Cookie技術。有了Cookie再用HTTP協議通訊,就可以管理狀態了。

請求URI定位資源

HTTP協議使用URI定位網際網路上的資源。

當客戶端請求訪問資源而傳送請求時,URI需要將作為請求報文中的請求URI包含在內。指定請求URI的方式有很多:

告知伺服器意圖的http方法

GET:獲取資源

用來請求訪問已被URI識別的資源。指定的資源經伺服器端解析後返回響應內容:

  • 如果請求的資源是文字,那就保持原樣返回
  • 如果請求的資源時CGI(Common Gateway Interface,通用閘道器介面)那樣的程式,則返回經過執行後的輸出結果。

POST:傳輸實體主體

POST方法用來傳輸實體的主體,POST的主要目的並不是獲取響應的主體內容。

PUT:傳輸檔案

要求請求報文的主體中包含檔案內容,然後儲存到請求URI指定的位置。

PUT方法自身不帶驗證機制,存在安全性問題,一般的Web網站不適用該方法。架構設計採用REST的Web網站可能會開發該方法。

HEAD:獲得報文首部

與GET方法類似,只是不返回報文主體部分。用於確認URI的有效性及資源更新的日期時間等。

DELETE:刪除檔案

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

OPTIONS:詢問支援的方法

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

TRACE:追蹤路徑

讓Web伺服器將之前的請求通訊環回給客戶端的方法。

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

不常用。

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

CONNECT方法要求在於代理伺服器通訊時建立隧道,實現用隧道協議進行TCP通訊。

主要使用SSL(Secure Sockets Layer,安全套接字)和TLS(Transport Layer Security, 傳輸層安全)協議把通訊內容加密後經網路隧道傳輸。

CONNECT方法的格式如下:

CONNECT 代理伺服器名:埠號 HTTP版本

使用方法下達命令

向請求URI指定的資源傳送請求報文時,採用稱為方法的命令。

方法的作用在於,可以指定請求的資源按期望產生某種行為。

持久連線節省流量

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

隨著HTTP的普及,文件中包含的圖片越來越多,每次的請求都會造成無謂的TCP連線建立和斷開,增加通訊量的開銷。

持久連線

HTTP/1.1和一部分的HTTP/1.0想出了持久連線的方法(HTTP Persistent Connections,也稱為HTTP keep-alive)

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

持久連線的好處在於減少了TCP連線的重複建立和斷開所造成的額外開銷,減輕了伺服器端的負載,Web頁面的相應速度也就相應地提高了。

在HTTP/1.1中,所有的連線預設都是持久連線。

HTTP/2.0 多路複用,更快

詳見:https://www.zhihu.com/question/306768582

管線化

只是理論階段,在HTTP/2.0得到了實現,見上圖。

使用cookie的狀態管理

Cookie會根據從伺服器端傳送的響應報文內的一個叫做Set-Cookie的首部欄位資訊,通知客戶端儲存Cookie,當下次客戶端再往伺服器傳送請求時,客戶端會自動在請求報文中加入Cookie值後傳送出去。

伺服器端發現客戶端傳送過來的Cookie後,會去檢查究竟是從哪一個客戶端發來的連線請求,然後對比伺服器上的記錄,最後得到之前的狀態資訊。

  • 請求報文(沒有Cookie)

  • 響應報文(伺服器端生成Cookie資訊)

  • 請求報文(自動傳送儲存著的Cookie資訊)