天天看點

04 | HTTP世界全覽(下):與HTTP相關的各種協定

今天要講的則是比較偏向于理論的各種 HTTP 相關協定,重點是 TCP/IP、DNS、URI、HTTPS 等,希望能夠幫你理清楚它們與 HTTP 的關系。

同樣的,我還是畫了一張詳細的思維導圖,你可以點選後仔細檢視。

04 | HTTP世界全覽(下):與HTTP相關的各種協定

TCP/IP

TCP/IP 協定是目前網絡世界“事實上”的标準通信協定,即使你沒有用過也一定聽說過,因為它太著名了。

TCP/IP 協定實際上是一系列網絡通信協定的統稱,其中最核心的兩個協定是TCP和IP,其他的還有 UDP、ICMP、ARP 等等,共同構成了一個複雜但有層次的協定棧。

這個協定棧有四層,最上層是“應用層”,最下層是“連結層”,TCP 和 IP 則在中間:TCP 屬于“傳輸層”,IP 屬于“網際層”。協定的層級關系模型非常重要,我會在下一講中再專門講解,這裡先暫時放一放。

IP 協定是“Internet Protocol”的縮寫,主要目的是解決尋址和路由問題,以及如何在兩點間傳送資料包。IP 協定使用“IP 位址”的概念來定位網際網路上的每一台計算機。可以對比一下現實中的電話系統,你拿着的手機相當于網際網路上的計算機,而要打電話就必須接入電話網,由通信公司給你配置設定一個号碼,這個号碼就相當于 IP 位址。

現在我們使用的 IP 協定大多數是 v4 版,位址是四個用“.”分隔的數字,例如“192.168.0.1”,總共有 2^32,大約 42 億個可以配置設定的位址。看上去好像很多,但網際網路的快速發展讓位址的配置設定管理很快就“捉襟見肘”。是以,就又出現了 v6 版,使用 8 組“:”分隔的數字作為位址,容量擴大了很多,有 2^128 個,在未來的幾十年裡應該是足夠用了。

TCP 協定是“Transmission Control Protocol”的縮寫,意思是“傳輸控制協定”,它位于 IP 協定之上,基于 IP 協定提供可靠的、位元組流形式的通信,是 HTTP 協定得以實作的基礎。

“可靠”是指保證資料不丢失,“位元組流”是指保證資料完整,是以在 TCP 協定的兩端可以如同操作檔案一樣通路傳輸的資料,就像是讀寫在一個密閉的管道裡“流動”的位元組。

在第二篇時我曾經說過,HTTP 是一個"傳輸協定",但它不關心尋址、路由、資料完整性等傳輸細節,而要求這些工作都由下層來處理。因為網際網路上最流行的是 TCP/IP 協定,而它剛好滿足 HTTP 的要求,是以網際網路上的 HTTP 協定就運作在了 TCP/IP 上,HTTP 也就可以更準确地稱為“HTTP over TCP/IP”。

DNS

在 TCP/IP 協定中使用 IP 位址來辨別計算機,數字形式的位址對于計算機來說是友善了,但對于人類來說卻既難以記憶又難以輸入。

于是“域名系統”(Domain Name System)出現了,用有意義的名字來作為 IP 位址的等價替代。設想一下,你是願意記“95.211.80.227”這樣枯燥的數字,還是“nginx.org”這樣的詞組呢?

在 DNS 中,“域名”(Domain Name)又稱為“主機名”(Host),為了更好地标記不同國家或組織的主機,讓名字更好記,是以被設計成了一個有層次的結構。

域名用“.”分隔成多個單詞,級别從左到右逐級升高,最右邊的被稱為“頂級域名”。對于頂級域名,可能你随口就能說出幾個,例如表示商業公司的“com”、表示教育機構的“edu”,表示國家的“cn”“uk”等,買火車票時的域名還記得嗎?是“www.12306.cn”。

04 | HTTP世界全覽(下):與HTTP相關的各種協定

但想要使用 TCP/IP 協定來通信仍然要使用 IP 位址,是以需要把域名做一個轉換,“映射”到它的真實 IP,這就是所謂的“域名解析”。

繼續用剛才的打電話做個比喻,你想要打電話給小明,但不知道電話号碼,就得在手機裡的号碼簿裡一項一項地找,直到找到小明那一條記錄,然後才能查到号碼。這裡的“小明”就相當于域名,而“電話号碼”就相當于 IP 位址,這個查找的過程就是域名解析。

域名解析的實際操作要比剛才的例子複雜很多,因為網際網路上的電腦實在是太多了。目前全世界有 13 組根 DNS 伺服器,下面再有許多的頂級 DNS、權威 DNS 和更小的本地 DNS,逐層遞歸地實作域名查詢。

HTTP 協定中并沒有明确要求必須使用 DNS,但實際上為了友善通路網際網路上的 Web 伺服器,通常都會使用 DNS 來定位或标記主機名,間接地把 DNS 與 HTTP 綁在了一起。

URI/URL

有了 TCP/IP 和 DNS,是不是我們就可以任意通路網絡上的資源了呢?

還不行,DNS 和 IP 位址隻是标記了網際網路上的主機,但主機上有那麼多文本、圖檔、頁面,到底要找哪一個呢?就像小明管理了一大堆文檔,你怎麼告訴他是哪個呢?

是以就出現了 URI(Uniform Resource Identifier),中文名稱是 統一資源辨別符,使用它就能夠唯一地标記網際網路上資源。

URI 另一個更常用的表現形式是 URL(Uniform Resource Locator), 統一資源定位符,也就是我們俗稱的“網址”,它實際上是 URI 的一個子集,不過因為這兩者幾乎是相同的,差異不大,是以通常不會做嚴格的區分。

我就拿 Nginx 網站來舉例,看一下 URI 是什麼樣子的。

​http://nginx.org/en/download.html​

複制代碼

你可以看到,URI 主要有三個基本的部分構成:

  1. 協定名:即通路該資源應當使用的協定,在這裡是“http”;
  2. 主機名:即網際網路上主機的标記,可以是域名或 IP 位址,在這裡是“nginx.org”;
  3. 路徑:即資源在主機上的位置,使用“/”分隔多級目錄,在這裡是“/en/download.html”。

還是用打電話來做比喻,你通過電話簿找到了小明,讓他把昨天做好的宣傳文案快遞過來。那麼這個過程中你就完成了一次 URI 資源通路,“小明”就是“主機名”,“昨天做好的宣傳文案”就是“路徑”,而“快遞”,就是你要通路這個資源的“協定名”。

HTTPS

在 TCP/IP、DNS 和 URI 的“加持”之下,HTTP 協定終于可以自由地穿梭在網際網路世界裡,順利地通路任意的網頁了,真的是“好生快活”。

但且慢,網際網路上不僅有“美女”,還有很多的“野獸”。

假設你打電話找小明要一份廣告創意,很不幸,電話被商業間諜給竊聽了,他立刻動用種種手段偷竊了你的快遞,就在你還在等包裹的時候,他搶先釋出了這份廣告,給你的公司造成了無形或有形的損失。

有沒有什麼辦法能夠防止這種情況的發生呢?确實有。你可以使用“加密”的方法,比如這樣打電話:

你:“喂,小明啊,接下來我們改用火星文通話吧。”

小明:“好啊好啊,就用火星文吧。”

你:“巴拉巴拉巴拉巴拉……”

小明:“巴拉巴拉巴拉巴拉……”

如果你和小明說的火星文隻有你們兩個才懂,那麼即使竊聽到了這段談話,他也不會知道你們到底在說什麼,也就無從破壞你們的通話過程。

HTTPS 就相當于這個比喻中的“火星文”,它的全稱是“HTTP over SSL/TLS”,也就是運作在 SSL/TLS 協定上的 HTTP。

注意它的名字,這裡是 SSL/TLS,而不是 TCP/IP,它是一個負責加密通信的安全協定,建立在 TCP/IP 之上,是以也是個可靠的傳輸協定,可以被用作 HTTP 的下層。

因為 HTTPS 相當于“HTTP+SSL/TLS+TCP/IP”,其中的“HTTP”和“TCP/IP”我們都已經明白了,隻要再了解一下 SSL/TLS,HTTPS 也就能夠輕松掌握。

SSL 的全稱是“Secure Socket Layer”,由網景公司發明,當發展到 3.0 時被标準化,改名為 TLS,即“Transport Layer Security”,但由于曆史的原因還是有很多人稱之為 SSL/TLS,或者直接簡稱為 SSL。

SSL 使用了許多密碼學最先進的研究成果,綜合了對稱加密、非對稱加密、摘要算法、數字簽名、數字證書等技術,能夠在不安全的環境中為通信的雙方建立出一個秘密的、安全的傳輸通道,為 HTTP 套上一副堅固的盔甲。

你可以在今後上網時留心看一下浏覽器位址欄,如果有一個小鎖頭标志,那就表明網站啟用了安全的 HTTPS 協定,而 URI 裡的協定名,也從“http”變成了“https”。

代理

代理(Proxy)是 HTTP 協定中請求方和應答方中間的一個環節,作為“中轉站”,既可以轉發用戶端的請求,也可以轉發伺服器的應答。

代理有很多的種類,常見的有:

  1. 匿名代理:完全“隐匿”了被代理的機器,外界看到的隻是代理伺服器;
  2. 透明代理:顧名思義,它在傳輸過程中是“透明開放”的,外界既知道代理,也知道用戶端;
  3. 正向代理:靠近用戶端,代表用戶端向伺服器發送請求;
  4. 反向代理:靠近伺服器端,代表伺服器響應用戶端的請求;

上一講提到的 CDN,實際上就是一種代理,它代替源站伺服器響應用戶端的請求,通常扮演着透明代理和反向代理的角色。

  1. 負載均衡:把通路請求均勻分散到多台機器,實作通路叢集化;
  2. 内容緩存:暫存上下行的資料,減輕後端的壓力;
  3. 安全防護:隐匿 IP, 使用 WAF 等工具抵禦網絡攻擊,保護被代理的機器;
  4. 資料處理:提供壓縮、加密等額外的功能。

小結

  1. TCP/IP 是網絡世界最常用的協定,HTTP 通常運作在 TCP/IP 提供的可靠傳輸基礎上;
  2. DNS 域名是 IP 位址的等價替代,需要用域名解析實作到 IP 位址的映射;
  3. URI 是用來标記網際網路上資源的一個名字,由“協定名 + 主機名 + 路徑”構成,俗稱 URL;
  4. HTTPS 相當于“HTTP+SSL/TLS+TCP/IP”,為 HTTP 套了一個安全的外殼;
  5. 代理是 HTTP 傳輸過程中的“中轉站”,可以實作緩存加速、負載均衡等功能。