首先我來問出這個問題:「你以爲 HTTP 是什麼呢?」前端
你可能會不假思索、脫口而出:「HTTP 就是超文本傳輸協議,也就是 HyperText Transfer Protocol。」面試
回答很是正確!我必須由衷地恭喜你:能給出這個答案,就代表你具備至少 50%HTTP 相關的知識儲備,應該算得上是「半個專家」了。編程
不過讓咱們換個對話場景,假設不是我,而是由一位面試官問出剛纔的問題呢? 後端
顯然,這個答案有點過於簡單了,不能讓他滿意,他確定會再追問你一些問題:幾乎全部面試時問到的 HTTP 相關問題,均可以從這個最簡單的「HTTP 是什麼?」引出來。瀏覽器
因此,今天的話題就從這裏開始,深度地解答一下「HTTP 是什麼?」,以及延伸出來的第二個問題「HTTP 不是什麼?」安全
我們中國有個成語「人如其名」,意思是一我的的性格和特色是與他的名字相符的。服務器
先看一下 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 是一個協議,是一種計算機間通訊的規範,因此它不存在「單獨的實體」。它不是瀏覽器、手機 APP 那樣的應用程序,也不是 Windows、Linux 那樣的操做系統,更不是 Apache、Nginx、Tomcat 那樣的 Web 服務器。
但 HTTP 又與應用程序、操做系統、Web 服務器密切相關,在它們之間的通訊過程當中存在,並且是一種「動態的存在」,是發生在網絡鏈接、傳輸超文本數據時的一個「動態過程」。
互聯網(Internet)是遍及於全球的許多網絡互相鏈接而造成的一個巨大的國際網絡,在它上面存放着各式各樣的資源,也對應着各式各樣的協議,例如超文本資源使用 HTTP,普通文件使用 FTP,電子郵件使用 SMTP 和 POP3 等。
但毫無疑問,HTTP 是構建互聯網的一塊重要拼圖,並且是佔比最大的那一塊。
編程語言是人與計算機溝通交流所使用的語言,而 HTTP 是計算機與計算機溝通交流的語言,咱們沒法使用 HTTP 來編程,但能夠反過來,用編程語言去實現 HTTP,告訴計算機如何用 HTTP 來與外界通訊。
不少流行的編程語言都支持編寫 HTTP 相關的服務或應用,例如使用 Java 在 Tomcat 裏編寫 Web 服務,使用 PHP 在後端實現頁面模板渲染,使用 JavaScript 在前端實現動態頁面更新,你是否也會其中的一兩種呢?
HTTP 不是 HTML,這個可能要特別強調一下,千萬不要把 HTTP 與 HTML 混爲一談,雖然這二者常常是同時出現。
HTML 是超文本的載體,是一種標記語言,使用各類標籤描述文字、圖片、超連接等資源,而且能夠嵌入 CSS、JavaScript 等技術實現複雜的動態效果。單論次數,在互聯網上 HTTP 傳輸最多的可能就是 HTML,但要是論數據量,HTML 可能要日後排了,圖片、音頻、視頻這些類型的資源顯然更大。
俗話說「一個好漢三個幫」,HTTP 也是如此。
在互聯網世界裏,HTTP 一般跑在 TCP/IP 協議棧之上,依靠 IP 協議實現尋址和路由、TCP 協議實現可靠數據傳輸、DNS 協議實現域名查找、SSL/TLS 協議實現安全通訊。此外,還有一些協議依賴於 HTTP,例如 WebSocket、HTTPDNS 等。這些協議相互交織,構成了一個協議網,而 HTTP 則處於中心地位。
把這些綜合起來,使用遞歸縮寫方式(模仿 PHP),咱們能夠把 HTTP 定義爲「與 HTTP 協議相關的全部應用層技術的總和」。
這裏我畫了一個思惟導圖,也能夠算是這個專欄系列文章的「知識地圖」。
你能夠對照這張圖,看一下哪些部分是本身熟悉的,哪些部分是陌生的,又有哪些部分是想要進一步瞭解的,下一講我會詳細講解這張圖。