HTTP 起源 HTTP 是由蒂姆·伯納斯-李(TimBerners—Lee)於1989年在歐洲核子研究組織(CERN)所發起 其中最著名的是 1999 年 6 月公佈的 RFC 2616,定義了 HTTP 協議中現今廣泛使用的一個版本——HTTP 1.1 HTTP 是什麼 全稱:超文本傳輸協議(H ...
HTTP 起源
HTTP
是由蒂姆·伯納斯-李(TimBerners—Lee
)於1989年在歐洲核子研究組織(CERN
)所發起
其中最著名的是 1999 年 6 月公佈的 RFC 2616,定義了 HTTP
協議中現今廣泛使用的一個版本——HTTP 1.1
HTTP 是什麼
全稱:超文本傳輸協議(HyperText Transfer Protocol
)
概念:HTTP
是一種能夠獲取像 HTML
、圖片等網路資源的通訊協議(protocol
)。它是在 web
上進行數據交換的基礎,是一種 client-server
協議
HTTP
——網際網路的多媒體信使 ——《HTTP權威指南》。
HTTP
在網際網路的角色:充當一個信使的角色,乾的就是一個跑腿的活,在客戶端和服務端之間傳遞信息,但我們又不能缺少它。HTTP
協議是應用層的協議,是與前端開發最息息相關的協議。平時我們遇到的 HTTP
請求、 HTTP
緩存、Cookies
、跨域等其實都跟 HTTP
息息相關
HTTP 的基礎特性
-
可拓展協議。
HTTP 1.0
出現的HTTP headers
讓協議拓展變得更加的容易。只要服務端和客戶端就headers
達成語義一致,新功能就可以被輕鬆的加入進來 -
HTTP
是無狀態的、有會話的。在同一個連接中,兩個執行成功的HTTP
請求之間是沒有關係的。這就帶來了一個問題,用戶沒有辦法在同一個網站中進行連續的交互,比如在一個電商網站里,用戶把某個商品加入到購物車,切換一個頁面後再次添加了商品,這兩次添加商品的請求之間沒有關聯,瀏覽器無法知道用戶最終選擇了哪些商品。而使用HTTP
的頭部擴展,HTTP Cookies
就可以解決這個問題。把Cookies
添加到頭部中,創建一個會話讓每次請求都能共用相同的上下文信息,達成相同的狀態。 -
HTTP
與連接。通過TCP
,或者TLS
——加密的TCP
連接來發送,理論上任何可靠的傳輸協議都可以使用。連接是傳輸層控制的,這從根本上來講不是HTTP
的範疇。
也就是說,HTTP
依賴於面向連接的 TCP
進行消息傳遞,但連接並不是必須的。只需要它是可靠的,或不丟失消息的(至少返回錯誤)。
HTTP/1.0
預設為每一對 HTTP
請求/響應都打開一個單獨的 TCP
連接。當需要連續發起多個請求時,這種模式比多個請求共用同一個 TCP
鏈接更低效。為此,HTTP 1.1
持久連接的概念,底層 TCP
連接可以通過 connection
頭部實現。但 HTTP 1.1
在連接上也是不完美的,後面我們會提到。
基於 HTTP 的組件系統
HTTP
的組件系統包括客戶端、web
伺服器和代理
客戶端:user-agent
瀏覽器,特殊比如是工程師使用的程式,以及 Web
開發人員調試應用程式
Web服務端
由 Web Server
來服務並提供客戶端所請求的文檔。每一個發送到伺服器的請求,都會被伺服器處理並返回一個消息,也就是 response
代理(Proxies)
在瀏覽器和伺服器之間,有很多電腦和其他設備轉發了 HTTP
消息。它們可能出現在傳輸層、網路層和物理層上,對於 HTTP
應用層而言就是透明的
有如下的一些作用
- 緩存
- 過濾(像防病毒掃描、家長控制)
- 負載均衡
- 認證(對不同的資源進行許可權控制)
- 日誌管理
HTTP 報文組成
HTTP 有兩種類型的消息:
- 請求——由客戶端發送用來觸發一個伺服器上的動作
- 響應——來自伺服器端的應答
HTTP
消息由採用 ASCII
編碼的多行文本構成的。在 HTTP/1.1
以及更早的版本中,這些消息通過連接公開的發送。在 HTTP2.0
中,消息被分到了多個 HTTP
幀中。通過配置文件(用於代理伺服器或者伺服器),API
(用於瀏覽器)或者其他介面提供 HTTP
消息
典型的 HTTP 會話
-
建立連接
在客戶端-伺服器協議中,連接是由客戶端發起建立的。在HTTP
中打開連接意味著在底層傳輸層啟動連接,通常是TCP
。使用TCP
時,HTTP
伺服器的預設埠號是80
,另外還有8000
和8080
也很常用 -
發送客戶端請求
-
伺服器響應請求
HTTP 請求和響應
HTTP 請求和響應都包括起始行(start line
)、請求頭(HTTP Headers
)、空行(empty line
)以及 body
部分,如下圖所示:
- 起始行。
請求的起始行:請求方法、請求Path
和HTTP
版本號
響應的起始行:HTTP
版本號、響應狀態碼以及狀態文本描述
下麵詳細說下請求 Path
,請求路徑(Path
)有以下幾種:
1)一個絕對路徑,末尾跟上一個 ' ? ' 和查詢字元串。這是最常見的形式,稱為 原始形式 (origin form
),被 GET
,POST
,HEAD
和 OPTIONS
方法所使用
POST / HTTP/1.1
GET /background.png HTTP/1.0
HEAD /test.html?query=alibaba HTTP/1.1
OPTIONS /anypage.html HTTP/1.0
2)一個完整的 URL
。主要在使用 GET
方法連接到代理的時候使用
GET http://developer.mozilla.org/en-US/docs/Web/HTTP/Messages HTTP/1.1
3)由功能變數名稱和可選埠(以':'為首碼)組成的 URL
的 authority component
,稱為 authority form
。僅在使用 CONNECT
建立 HTTP
隧道時才使用
CONNECT developer.mozilla.org:80 HTTP/1.1
4)星號形式 (asterisk form
),一個簡單的星號('*'),配合 OPTIONS
方法使用,代表整個伺服器。
OPTIONS * HTTP/1.1
-
Headers
請求頭或者響應頭。詳見下麵的首部。
不區分大小寫的字元串,緊跟著的冒號 ('