什麼是 HTTP ?

HTTP (HyperText Transfer Protocol),超文本傳輸協議,基於 TCP/IP,實現瞭請求-響應模式的雙向通信。

在互聯網早期,“文本”這個概念,指的是簡單的字符文字,但如今,圖片、視頻、甚至是壓縮包,在 HTTP 眼中都可以被看作是“一個個的文本”。而超文本,就是超越瞭普通的文本,它是文字、圖片、視頻等的混合體,更為關鍵的是它含有“超鏈接”,能夠從一個“超文本”跳轉到另一個“超文本”

HTTP 使用計算機能夠理解的語言確立瞭一種計算機之間交流通信的協議規范,以及相關的各種控制和錯誤處理方式。HTTP 雖然是一個“雙向協議”,但是並不限制於雙方,允許中間有“接力”或“中轉”。

總結來說:

HTTP 並不是一個孤立的協議,它通常跑在 TCP/IP 協議棧之上,依靠 IP 協議實現尋址和路由、TCP 協議實現可靠數據傳輸、DNS 協議實現域名查找,SSL/TLS 協議實現安全通信。此外,還有一些協議依賴 HTTP,例如 WebSocker、HTTPDNS 等,這些協議相互交織,構成瞭一個協議網,HTTP 處於中心。

HTTP 協議的有一個固定的格式:

  • 請求:請求行、請求頭部、回車換行、請求體
  • 響應:狀態行、響應頭部、回車換行、響應體

請求報文的結構:

  1. 請求行(Request-Line)(包括:請求方法、URI、HTTP 協議版本)
  2. 請求頭部(Request Header Fields)
  3. 回車換行(CRLF)
  4. 請求體(Message Body)

響應報文的結構:

  1. 狀態行(Status-Line)(包括:HTTP 協議版本、狀態碼、狀態碼的文本描述)
  2. 響應頭部(Response Header Fields)
  3. 回車換行(CRLF)
  4. 響應體(Message Body)

無論是請求頭還是響應頭,有以下特性:

  • 字段名不區分大小寫
  • 字段名不允許出現空格,不可以出現下劃線_
  • 字段名後面必須緊接著

問: 如果說在頭部中間故意加一個空行會怎麼樣?

那麼空行後的內容全部被視為實體。

常見的 Headers

通用頭

字段 作用
Cache-Control 控制緩存 public:表示響應可以被任何對象緩存(包括客戶端、代理服務器)private(默認值):響應隻能被單個客戶緩存,不能被代理服務器緩存no-cache:緩存要經過服務器緩存,在瀏覽器使用緩存前,會進行協商緩存驗證,若可以使用則返回 304,使用緩存no-store:禁止任何緩存
Connection 是否需要持久連接(HTTP 1.1 默認持久連接) keep-alive/close
Transfer-Encoding 報文主體的傳輸編碼格式 chunked(分塊)、identity(為壓縮和修改)、gzip(壓縮)、compress(壓縮)、deflate(壓縮)

請求頭

字段 作用 語法
Accept 瀏覽器可以接受的數據格式 如 text/html、*/*
Accept-Encoding 瀏覽器可以接收的壓縮算法 如 gzip
Accept-Language 瀏覽器可以接收的語言 如 zh-CN
Content-Type 瀏覽器發送數據的格式 如 application/json
cookie 瀏覽器存儲的 cookie
KeepAlive TCP 連接復用中兩次請求的最大時間間隔和最多請求次數 如 timeout=5, max=100
If-Modified-Since 將 Last-Modified 的值發送給服務器,詢問資源是否已經過期(被修改),過期則返回新資源;未過期則返回 304 示例:If-Modified-Since: Wed, 21 Oct 2015 07:28:00 GMT
If-None-Match 告訴服務器客戶端的操作系統和瀏覽器的名稱、版本 User-Agent: Mozilla/ () ()
Range 告知服務器返回文件的哪一部分,用於斷點續傳 示例:Range: bytes=200-1000, 2000-6576, 19000-
Host 指明瞭服務器的域名(對於虛擬主機來說),以及服務器監聽的 TCP 端口號 示例:Host:http://www.baidu.com
User-Agent 告訴服務器客戶端的操作系統和瀏覽器的名稱、版本 User-Agent: Mozilla/ () ()
referer 表明發送請求的站點;防止盜鏈和惡意請求

響應頭

字段 作用 語法
Location 需要將頁面重新定向至的地址。一般在相應碼為 3xx 的響應中才會有意義 Location: <url>
Etag 資源的特定版本的標識符 Etag: <Etag_value>
Last-Modified 資源的特定版本的標識符
Content-Type 服務端返回數據的格式 如 application/json
Content-length 服務端返回數據的大小 字節數
Content-Encoding 服務端返回數據的壓縮算法 如 gzip
Set-Cookie 服務端改 cookie

HTTP 特點

  • 靈活可擴展:體現在兩方面:
    • 語義上的自由,隻規定瞭基本格式,比如空格分隔單詞,換行分隔字段,其他的各個部分都沒有嚴格的語法限制。
    • 傳輸形式的多樣性,不僅僅可以傳輸文本,還能傳輸圖片、視頻等任意數據。
  • 可靠傳輸:HTTP 基於 TCP/IP,繼承瞭可靠傳輸的特性。
  • 請求-應答模式:即「一發一收、有來有回」,服務器也可以作為請求方。
  • 無狀態:這裡的狀態是指「通信過程的上下文信息」,而每次 http 請求都是獨立、無關的,默認不需要保留狀態信息。

HTTP 缺點

  • 無狀態
    • 缺點:需要長連接的場景中,需要保存大量的上下文信息,難免傳輸大量重復的信息,此時無狀態是缺點。
    • 優點:一些應用僅僅隻是為瞭獲取一些數據,不需要保存連接上下文信息,無狀態減少瞭網絡開銷,是優點。
  • 明文傳輸:協議裡的報文 (主要指的是頭部) 不使用二進制數據,而是文本形式。這對於調試提供瞭便利,但同時也讓 HTTP 的報文信息暴露給瞭外界,給攻擊者也提供瞭便利。
  • 隊頭阻塞問題:當 http 開啟長連接時,共用一個 TCP 連接,同一時刻隻能處理一個請求,那麼當前請求耗時過長的情況下,其它的請求隻能處於阻塞狀態,也就是著名的隊頭阻塞問題。

HTTP1.1 如何解決 HTTP 的隊頭阻塞問題?

  • 並發連接:對於一個域名允許分配多個長連接。Chrome 中對一個域名的請求最多允許分配 6 個長連接。
  • 域名分片:一級域名下可以分出非常多的二級域名,而它們都指向同樣的一臺服務器,一個域名可以並發 6 個長連接,多分幾個域名,事實上也更好地解決瞭隊頭阻塞的問題。
赞(0)