你必須知道的HTTP基本概念

Dunizb發表於2019-03-02

文章首發於:dunizb.com
原文連線:dunizb.com/2017/12/08/…

從本文你將看到:HTTP是幹嘛用的?怎樣和伺服器通訊?HTTP的基本性質?HTTP能控制什麼?基於HTTP三大元件系統?HTTP 和 TCP 之間的關係?HTTP 協議如何使用 TCP 連線?

本文沒什麼高深的東西,就是把一些概念整理了一下,大牛可以飄過,不喜勿噴

一、什麼是HTTP

HTTP是幹嘛用的?

HTTP學名叫做超文字傳輸協議,是一個網路協議。

是專門用來幫你傳輸諸如 HTML 的超媒體文件等 Web 內容滴。因為 HTML 本身就是超文字標記語言,HTML 中不僅有文字還有圖片、音視訊等內容,所以用來傳輸它的協議當然就叫超文字傳輸協議了。

比如你訪問俺的部落格的主頁,瀏覽器位址列會出現如下的網址:http://dunizb.com/,加了粗體的部分就是指 HTTP 協議。大部分網站都是通過 HTTP 協議來傳輸 Web 頁面、以及 Web 頁面上包含的各種東東(圖片、CSS 樣式、JS 指令碼)。

它基於 TCP/IP 的應用層協議。它被設計用於Web瀏覽器和Web伺服器之間的通訊,但它也可以用於其他目的。

它是 Web 上資料交換的基礎,是一種 client-server 協議,也就是說請求通常是由像瀏覽器這樣的接受方發起的。一個完整的 web文件是由不同的子文件重新組建而成的,像是文字、佈局描述、圖片、視訊、指令碼等等。

怎樣和伺服器通訊?

  1. HTTP遵循經典的客戶端-服務端模型,客戶端開啟一個連線以發出請求,然後等待它收到伺服器端響應。 HTTP是無狀態協議,意味著伺服器不會在兩個請求之間保留任何資料(狀態)。
  2. 客戶端和服務端通過交換各自的訊息(與資料流正好相反)來進行互動。通常由像瀏覽器這樣的客戶端發出的訊息叫做 requests,那麼被服務端回應的訊息就叫做 responses。

HTTP 被設計於上20世紀90年代初期,是一種可擴充套件性的協議。它是應用層的協議,雖然理論上它可以通過任何可靠的傳輸協議來傳送,但是它還是通過 TCP,或者是 TLS-加密的TCP連線來傳送。因為它很好的擴充套件性,時至今日它不僅被用來傳輸超文字文件,還用來傳輸圖片、視訊或者向伺服器傳送如 HTML 表單這樣的資訊。HTTP 還可以根據網頁需求,來獲取部分web文件的內容來更新網頁。

HTTP遵循經典的客戶端-服務端模型,客戶端開啟一個連線以發出請求,然後等待它收到伺服器端響應。 HTTP是無狀態協議,意味著伺服器不會在兩個請求之間保留任何資料(狀態)。雖然通常基於TCP / IP層,但可以在任何可靠的傳輸層上使用;也就是說,一個不會靜默丟失訊息的協議,如UDP。

二、HTTP的基本性質

總述:HTTP是簡單的、可擴充套件、無狀態的

HTTP 是簡單的

即便在HTTP/2中把HTTP訊息封裝到了frames中,HTTP大體上還是被設計成可讀的而且簡單的。HTTP的訊息能夠讓人讀懂且明白它的意思,還允許簡單的測試,放低了門檻,更有利於新來者瞭解。

HTTP 是可擴充套件的

在HTTP/1中就出現了, HTTP headers 讓協議擴充套件變得非常容易。只要服務端和客戶端在新的headers上語義達成一致,新的功能就可以輕鬆地被加進來。

HTTP 是無狀態,有會話的

HTTP是無狀態的:在同一個連線中,兩個成功執行的請求之間是沒有關係的。這就帶來了一個問題,使用者沒辦法在一個網站進行連續的互動,比如在一個電商網站裡,使用者把某個商品加入了購物車中,換了一個頁面後再次新增商品,兩次新增商品的請求沒有聯絡,瀏覽器無法知道終端使用者都選擇了哪些商品。而用HTTP的頭部擴充套件,HTTP Cookies就可以解決這個問題(將在後面介紹)。把Cookies新增到頭部中,建立一個會話來讓每次請求都能共享相同的上下文資訊,相同的狀態。而HTTP的核心是無狀態的,cookies的使用可以建立有狀態的會話。

三、HTTP能控制什麼

多年以來,HTTP良好的擴充套件性控制著越來越多Web的功能。快取和認證方式很早就可以由HTTP來控制了。另一方面,對同源同域的限制到2010年才有所改變。

下面就是可以用HTTP來控制的常見特性。

快取

文件怎麼快取能夠通過HTTP來控制。服務端能告訴代理和客戶端什麼需要被快取,快取多久,而客戶端能夠根據請求條件首部欄位(如If-Modified-Since、If-Match等)來忽略儲存的文件。

開放同源限制

為了防止網路窺聽和其它的隱私洩漏,瀏覽器強制對Web網站做了分割限制。只有來自於相同來源的網頁才能夠獲取網站的全部資訊。這樣的限制有時反而成了負擔,HTTP可以通過修改頭部來開放這樣的限制,因此web文件可以是由不同域下的資訊拼接成的(在某些情況下,這樣做還有安全因素考慮在裡面)。

認證

一些頁面能夠被保護起來,僅讓特定的使用者進行訪問。基本的認證功能可以直接通過HTTP提供,使用Authenticate相似的頭部就可以,或者用HTTP cookies來設定指定的會話。

代理和隧道

通常情況下,伺服器和/或客戶端是處於內網的,對其它(外網)隱藏其真實 IP 地址。因此 HTTP 請求就要通過代理越過這個網路屏障。但並非所有的代理都是 HTTP 代理。例如,SOCKS協議的代理就運作在更底層。一些像 ftp 其它的協議也能夠被它們處理。

Cookies
Cookies用一個服務端的狀態連線起了每一個請求。這就建立了會話,雖然基本的HTTP是無狀態協議。這很有用,不僅是因為能用到購物車這樣的電商業務上,更是因為,它使得任何網站都能夠配置頁面展現的東西了。

四、基於HTTP三大元件系統

客戶端:user-agent

嚴格意義來說,user-agent 就是任何能夠為使用者發起行為的工具。但實際上,這個角色通常都是由瀏覽器來扮演。對於發起請求來說,瀏覽器總是作為發起一個請求的實體,而永遠不是伺服器(雖然一些機制已經能夠模擬伺服器發起請求的訊息了)。

Web服務端

在上述通訊過程的另一端,就是一個Web Server來服務並提供客戶端請求的文件。Server只是虛擬意義上:它可以是許多共同分擔負載(負載平衡)的一組伺服器組成的計算機群,也可以是一種複雜的軟體,通過向其他計算機發起請求來獲取部分或全部資源的軟體。

Server不再只是一個單獨的機器,它可以是在同一個機器上裝載的許多服務之一。在HTTP/1.1和Host頭部中,它們甚至可以共享同一個IP地址。

Proxies 代理

在瀏覽器和伺服器之間,有許多計算機和其他裝置轉發了HTTP的訊息。因為Web棧層次結構的原因,它們大多數都出現在傳輸層、網路層和物理層上,對於HTTP的應用層來說就是透明的(雖然它們可能會對應用層的效能有重要影響)。而還有一部分表現在應用層上的,就叫做proxies了。Proxies既可以表現得透明,又可以不透明(看請求是否通過它們),主要表現在這幾個功能上:

  • 快取(可以是公開的或是私有的,像瀏覽器的快取)
  • 過濾(像反病毒掃描,家長監護)
  • 負載均衡,讓多個伺服器服務不同的請求
  • 對不同資源的許可權控制
  • 登陸,允許儲存歷史資訊

每一個傳送到伺服器的請求,都會被伺服器處理並且返回一個訊息,也就是response。在client與server之間,還有許許多多的被稱為proxies的實體,他們的作用與表現各不相同,比如有些是閘道器,還有些是caches等。

Client-server-chain

實際上,在一個瀏覽器和處理請求的伺服器之間,還有計算機、路由器、調變解調器等等許多實體。由於Web的層次設計,那些在網路層和傳輸層都不可見了。HTTP是在最上層應用層中的,雖然下面的層次對分析網路問題非常重要,但是對HTTP的描述來說,這些大多數都是不相關的。

五、HTTP 和 TCP 之間的關係

前面說過,HTTP是基於 TCP/IP 的,簡單地說,TCP 協議是 HTTP 協議的基石——HTTP 協議需要依靠 TCP 協議來傳輸資料。

在網路分層模型中,TCP 被稱為“傳輸層協議”,而 HTTP 被稱為“應用層協議”。有很多常見的應用層協議是以 TCP 為基礎的,比如“FTP、SMTP、POP、IMAP”等。

TCP 被稱為“面向連線”的傳輸層協議。關於它的具體細節,俺就不展開了(否則篇幅又失控了)。你只需知道:傳輸層主要有兩個協議,分別是 TCP 和 UDP。TCP 比 UDP 更可靠。你可以把 TCP 協議想象成某個水管,傳送端這頭進水,接收端那頭就出水。並且 TCP 協議能夠確保,先傳送的資料先到達(與之相反,UDP 不保證這點)。

六、HTTP 協議如何使用 TCP 連線?

HTTP 對 TCP 連線的使用,分為兩種方式:俗稱“短連線”和“長連線”(“長連線”又稱“持久連線”,洋文叫做“Keep-Alive”或“Persistent Connection”)

假設有一個網頁,裡面包含好多圖片,還包含好多 外部的 CSS 檔案和 JS 檔案。在“短連線”的模式下,瀏覽器會先發起一個 TCP 連線,拿到該網頁的 HTML 原始碼(拿到 HTML 之後,這個 TCP 連線就關閉了)。然後,瀏覽器開始分析這個網頁的原始碼,知道這個頁面包含很多外部資源(圖片、CSS、JS)。然後針對 每一個 外部資源,再分別發起一個個 TCP 連線,把這些檔案獲取到本地(同樣的,每抓取一個外部資源後,相應的 TCP 就斷開)
相反,如果是“長連線”的方式,瀏覽器也會先發起一個 TCP 連線去抓取頁面。但是抓取頁面之後,該 TCP 連線並不會立即關閉,而是暫時先保持著(所謂的“Keep-Alive”)。然後瀏覽器分析 HTML 原始碼之後,發現有很多外部資源,就用剛才那個 TCP 連線去抓取此頁面的外部資源。

在 HTTP 1.0 版本,預設使用的是“短連線”(那時候是 Web 誕生初期,網頁相對簡單,“短連線”的問題不大).

到了1995年底開始制定 HTTP 1.1 草案的時候,網頁已經開始變得複雜(網頁內的圖片、指令碼越來越多了)。這時候再用短連線的方式,效率太低下了(因為建立 TCP 連線是有“時間成本”和“CPU 成本”滴)。所以,在 HTTP 1.1 中,預設採用的是“Keep-Alive”的方式。

七、一些術語

資源(resource)

Web資源是使用URL指向的Web內容。

  • 內容可以是靜態的,如:文字檔案、HTML檔案、JPEG檔案。
  • 或者是動態的內容。如:攝像頭的實時採集軟體生成的動態影像,使用者填寫的電子網站訂單。

資源型別

Web伺服器會為所有HTTP資源賦予一個型別,以便於HTTP軟體處理訊息主體。如,用 text/html 標記 html。可以再看兩個案例:

  • text/plain :ASCII文字文件
  • image/jpeg :JPEG版本的圖片

非常多的資源型別和文字標記的對應關係,一起構成了一個超長的清單,並且由RFC 2045標準化。此標準被稱為MIME。MIME是Multipurpose Internet Mail Extension的縮寫。雖然名稱很長,但是含義簡單,就是用來指定訊息內的實體型別的。之所以有Mail字樣,是因為最初設計是為了Mail的異構系統交換文件的。

資源標示符

URL是一種資源位置標示方法。URL描述了一個資源在伺服器上的位置。這就是一個合法的URL:http://example.com/part/index.htm。

  • 第一部分:方案(scheme)。指明瞭訪問資源所使用的協議型別。這部分通常是HTTP協議(http://)。
  • 第二部分:伺服器地址(比如,example.com)。
  • 其餘部分指定了Web伺服器上的某個資源(比如,/part/index.htm)。

當在位址列輸入此資源名並回車後,使用者代理會把URL解析,把必要的資訊以HTTP協議的要求,打入請求訊息內。以http://www.example.com/index.html,變成

GET index.html HTTP/1.1
host:www.example.com
空行
複製程式碼

開啟到www.example.com的tcp連線,併傳送此請求訊息給伺服器,然後等待伺服器響應並解析顯示給使用者。

更多URL、URI、URN詳細推薦閱讀:《你知道URL、URI和URN三者之間的區別嗎?》

HTTP事務

一個HTTP事務由一條請求訊息和一個響應訊息構成。

HTTP方法

HTTP支援幾種不同的請求命令,這些命令被稱為HTTP方法(HTTP method)。每條HTTP請求報文都包含一個方法。

狀態碼

每條HTTP響應訊息返回時都會攜帶一個狀態碼。狀態碼是一個三位數字的程式碼,告知客戶端請求是否成功,或者是需要採取其他行動。

訊息

從Web客戶端發往Web伺服器的HTTP報文稱為請求訊息。從伺服器發往客戶端的訊息稱為響應訊息。HTTP報文包括三部分:

起始行
首部欄位 
主體
複製程式碼

如傳送一個hello.htm 的資源給客戶端,請求訊息是:

GET /hello.html HTTP/1.1
複製程式碼

請求訊息只有起始行,指明使用的HTTP方法、資源的URL,以及協議的版本。沒有首部欄位和主體。

響應訊息為:

HTTP/1.1 200 OK
X-Powered-By: Express
Content-Type: text/html; charset=utf-8
Content-Length: 22
ETag: W/"16-FmHX0hamHjYkHeAP/7PfzA"
Date: Thu, 03 Dec 2015 09:54:01 GMT
Connection: close

<h1>Hello, World!</h1>
複製程式碼

這個訊息第一行為起始行,指明協議版本、狀態碼(200表示成功)和狀態說明(OK)。接下來一直到空行之間都是首部欄位,用來說明伺服器、資源型別、內容長度、生成文件時間等。空行後就是主體,這裡就是一個html檔案的內容。實際上,主體可以承載任何內容,而不限於文字。

總結

HTTP是一個簡單快速、靈活、無連線、無狀態的超文字傳輸協議。

HTTP是很簡單可擴充套件的一種協議。結合了輕鬆新增頭部資訊能力的Client-server結構使得HTTP可以和Web的功能擴充一同發展。

即使HTTP/2為了提高效能把HTTP報文嵌到幀中這一舉措增加了複雜度,但是從Web應用的角度來看,報文的基本結構是沒有變化的,從HTTP/1.0釋出起就是相同的。


關於HTTP,如果你不想啃大部頭的《HTTP權威指南》,那麼強烈建議你閱讀劉傳君的圖靈電子書《HTTP小書》,準能幫你節省不少時間,只要9塊錢!戳這裡:www.ituring.com.cn/book/1791

你必須知道的HTTP基本概念

參考資料:

相關文章