天天看點

02 | HTTP是什麼?HTTP又不是什麼?

首先我來問出這個問題:“你覺得 HTTP 是什麼呢?”

你可能會不假思索、脫口而出:“HTTP 就是超文本傳輸協定,也就是HyperText Transfer Protocol。”

回答非常正确!我必須由衷地恭喜你:能給出這個答案,就表明你具有至少 50%HTTP 相關的知識儲備,應該算得上是“半個專家”了。

不過讓我們換個對話場景,假設不是我,而是由一位面試官問出剛才的問題呢?

02 | HTTP是什麼?HTTP又不是什麼?

顯然,這個答案有點過于簡單了,不能讓他滿意,他肯定會再追問你一些問題:

  • 你是怎麼了解 HTTP 字面上的“超文本”和“傳輸協定”的?
  • 能否談一下你對 HTTP 的認識?越多越好。
  • HTTP 有什麼特點?有什麼優點和缺點?
  • HTTP 下層都有哪些協定?是如何工作的?
  • ……

幾乎所有面試時問到的 HTTP 相關問題,都可以從這個最簡單的“HTTP 是什麼?”引出來。

是以,今天的話題就從這裡開始,深度地解答一下“HTTP 是什麼?”,以及延伸出來的第二個問題“HTTP 不是什麼?”

HTTP 是什麼

咱們中國有個成語“人如其名”,意思是一個人的性格和特點是與他的名字相符的。

先看一下 HTTP 的名字:“超文本傳輸協定”,它可以拆成三個部分,分别是:“超文本”“傳輸”和“協定”。我們從後往前來逐個解析,了解了這三個詞,我們也就明白了什麼是 HTTP。

02 | HTTP是什麼?HTTP又不是什麼?

首先,HTTP 是一個協定。不過,協定又是什麼呢?

其實“協定”并不僅限于計算機世界,現實生活中也随處可見。例如,你在剛畢業時會簽一個“三方協定”,找房子時會簽一個“租房協定”,公司入職時還可能會簽一個“保密協定”,工作中使用的各種軟體也都帶着各自的“許可協定”。

剛才說的這幾個都是“協定”,本質上與 HTTP 是相同的,那麼“協定”有什麼特點呢?

第一點,協定必須要有兩個或多個參與者,也就是“協”。

如果隻有你一個人,那你自然可以想幹什麼就幹什麼,想怎麼玩就怎麼玩,不會幹涉其他人,其他人也不會幹涉你,也就不需要所謂的“協定”。但是,一旦有了兩個以上的參與者出現,為了保證最基本的順暢交流,協定就自然而然地出現了。

例如,為了保證你順利就業,“三方協定”裡的參與者有三個:你、公司和學校;為了保證你順利入住,“租房協定”裡的參與者有兩個:你和房東。

第二點,協定是對參與者的一種行為約定和規範,也就是“議”。

協定意味着有多個參與者為了達成某個共同的目的而站在了一起,除了要無疑義地溝通交流之外,還必須明确地規定各方的“責、權、利”,約定該做什麼不該做什麼,先做什麼後做什麼,做錯了怎麼辦,有沒有補救措施等等。例如,“租房協定”裡就約定了,租期多少個月,每月租金多少,押金是多少,水電費誰來付,違約應如何處理等等。

好,到這裡,你應該能夠明白 HTTP 的第一層含義了。

HTTP 是一個用在計算機世界裡的協定。它使用計算機能夠了解的語言确立了一種計算機之間交流通信的規範,以及相關的各種控制和錯誤處理方式。

接下來我們看 HTTP 字面裡的第二部分:“傳輸”。

計算機和網絡世界裡有數不清的各種角色:CPU、記憶體、總線、磁盤、作業系統、浏覽器、網關、伺服器……這些角色之間互相通信也必然會有各式各樣、五花八門的協定,用處也各不相同,例如廣播協定、尋址協定、路由協定、隧道協定、選舉協定等等。

HTTP 是一個“傳輸協定”,所謂的“傳輸”(Transfer)其實很好了解,就是把一堆東西從 A 點搬到 B 點,或者從 B 點搬到 A 點,即“A<===>B”。

别小看了這個簡單的動作,它也至少包含了兩項重要的資訊。

第一點,HTTP 協定是一個“雙向協定”。

也就是說,有兩個最基本的參與者 A 和 B,從 A 開始到 B 結束,資料在 A 和 B 之間雙向而不是單向流動。通常我們把先發起傳輸動作的 A 叫做請求方,把後接到傳輸的 B 叫做應答方或者響應方。拿我們最常見的上網沖浪來舉例子,浏覽器就是請求方 A,網易、新浪這些網站就是應答方 B。雙方約定用 HTTP 協定來通信,于是浏覽器把一些資料發送給網站,網站再把一些資料發回給浏覽器,最後展現在螢幕上,你就可以看到各種有意思的新聞、視訊了。

第二點,資料雖然是在 A 和 B 之間傳輸,但并沒有限制隻有 A 和 B 這兩個角色,允許中間有“中轉”或者“接力”。

這樣,傳輸方式就從“A<===>B”,變成了“A<=>X<=>Y<=>Z<=>B”,A 到 B 的傳輸過程中可以存在任意多個“中間人”,而這些中間人也都遵從 HTTP 協定,隻要不打擾基本的資料傳輸,就可以添加任意的額外功能,例如安全認證、資料壓縮、編碼轉換等等,優化整個傳輸過程。

說到這裡,你差不多應該能夠明白 HTTP 的第二層含義了。

HTTP 是一個在計算機世界裡專門用來在兩點之間傳輸資料的約定和規範。

講完了“協定”和“傳輸”,現在,我們終于到 HTTP 字面裡的第三部分:“超文本”。

既然 HTTP 是一個“傳輸協定”,那麼它傳輸的“超文本”到底是什麼呢?我還是用兩點來進一步解釋。

所謂“文本”(Text),就表示 HTTP 傳輸的不是 TCP/UDP 這些底層協定裡被切分的雜亂無章的二進制包(datagram),而是完整的、有意義的資料,可以被浏覽器、伺服器這樣的上層應用程式處理。

在網際網路早期,“文本”隻是簡單的字元文字,但發展到現在,“文本”的涵義已經被大大地擴充了,圖檔、音頻、視訊、甚至是壓縮包,在 HTTP 眼裡都可以算做是“文本”。

所謂“超文本”,就是“超越了普通文本的文本”,它是文字、圖檔、音頻和視訊等的混合體,最關鍵的是含有“超連結”,能夠從一個“超文本”跳躍到另一個“超文本”,形成複雜的非線性、網狀的結構關系。

對于“超文本”,我們最熟悉的就應該是 HTML 了,它本身隻是純文字檔案,但内部用很多标簽定義了對圖檔、音頻、視訊等的連結,再經過浏覽器的解釋,呈現在我們面前的就是一個含有多種視聽資訊的頁面。

OK,經過了對 HTTP 裡這三個名詞的詳細解釋,下次當你再面對面試官時,就可以給出比“超文本傳輸協定”這七個字更準确更有技術含量的答案:“HTTP 是一個在計算機世界裡專門在兩點之間傳輸文字、圖檔、音頻、視訊等超文本資料的約定和規範”。

HTTP 不是什麼

現在你對“HTTP 是什麼?”應該有了比較清晰的認識,緊接着的問題就是“HTTP 不是什麼?”,等價的問題是“HTTP 不能幹什麼?”。想想看,你能回答出來嗎?

因為 HTTP 是一個協定,是一種計算機間通信的規範,是以它不存在“單獨的實體”。它不是浏覽器、手機 APP 那樣的應用程式,也不是 Windows、Linux 那樣的作業系統,更不是 Apache、Nginx、Tomcat 那樣的 Web 伺服器。

但 HTTP 又與應用程式、作業系統、Web 伺服器密切相關,在它們之間的通信過程中存在,而且是一種“動态的存在”,是發生在網絡連接配接、傳輸超文本資料時的一個“動态過程”。

HTTP 不是網際網路。

網際網路(Internet)是遍布于全球的許多網絡互相連接配接而形成的一個巨大的國際網絡,在它上面存放着各式各樣的資源,也對應着各式各樣的協定,例如超文本資源使用 HTTP,普通檔案使用 FTP,電子郵件使用 SMTP 和 POP3 等。

但毫無疑問,HTTP 是建構網際網路的一塊重要拼圖,而且是占比最大的那一塊。

HTTP 不是程式設計語言。

程式設計語言是人與計算機溝通交流所使用的語言,而 HTTP 是計算機與計算機溝通交流的語言,我們無法使用 HTTP 來程式設計,但可以反過來,用程式設計語言去實作 HTTP,告訴計算機如何用 HTTP 來與外界通信。

很多流行的程式設計語言都支援編寫 HTTP 相關的服務或應用,例如使用 Java 在 Tomcat 裡編寫 Web 服務,使用 PHP 在後端實作頁面模闆渲染,使用 JavaScript 在前端實作動态頁面更新,你是否也會其中的一兩種呢?

HTTP 不是 HTML,這個可能要特别強調一下,千萬不要把 HTTP 與 HTML 混為一談,雖然這兩者經常是同時出現。

HTML 是超文本的載體,是一種标記語言,使用各種标簽描述文字、圖檔、超連結等資源,并且可以嵌入 CSS、JavaScript 等技術實作複雜的動态效果。單論次數,在網際網路上 HTTP 傳輸最多的可能就是 HTML,但要是論資料量,HTML 可能要往後排了,圖檔、音頻、視訊這些類型的資源顯然更大。

HTTP 不是一個孤立的協定。

小結

  1. HTTP 是一個用在計算機世界裡的協定,它确立了一種計算機之間交流通信的規範,以及相關的各種控制和錯誤處理方式。
  2. HTTP 專門用來在兩點之間傳輸資料,不能用于廣播、尋址或路由。
  3. HTTP 傳輸的是文字、圖檔、音頻、視訊等超文本資料。
  4. HTTP 是建構網際網路的重要基礎技術,它沒有實體,依賴許多其他的技術來實作,但同時許多技術也都依賴于它。

繼續閱讀