硬核!30 張圖解 HTTP 常見的面試題

java識堂 發佈 2020-04-19T03:23:11+00:00

小林我搜集了5 大類 HTTP 面試常問的題目,同時這 5 大類題跟 HTTP 的發展和演變關聯性是比較大的,通過問答 + 圖解的形式由淺入深的方式幫助大家進一步的學習和理解 HTTP 協議。QUIC 直接把以往的 TCP 和 TLS/1.3 的 6 次交互合併成了 3 次,減少

前言

在面試過程中,HTTP 被提問的機率還是比較高的。

小林我搜集了 5 大類 HTTP 面試常問的題目,同時這 5 大類題跟 HTTP 的發展和演變關聯性是比較大的,通過問答 + 圖解的形式由淺入深的方式幫助大家進一步的學習和理解 HTTP 協議。

  1. HTTP 基本概念
  2. Get 與 Post
  3. HTTP 特性
  4. HTTPS 與 HTTP
  5. HTTP/1.1、HTTP/2、HTTP/3 演變

提綱


正文

01 HTTP 基本概念

HTTP 是什麼?描述一下

HTTP 是超文本傳輸協議,也就是HyperText Transfer Protocol。

能否詳細解釋「超文本傳輸協議」?

HTTP的名字「超文本協議傳輸」,它可以拆成三個部分:

  • 超文本
  • 傳輸
  • 協議

三個部分

1. 「協議」

在生活中,我們也能隨處可見「協議」,例如:

  • 剛畢業時會簽一個「三方協議」;
  • 找房子時會簽一個「租房協議」;

三方協議和租房協議

生活中的協議,本質上與計算機中的協議是相同的,協議的特點:

  • 」字,代表的意思是必須有兩個以上的參與者。例如三方協議里的參與者有三個:你、公司、學校三個;租房協議里的參與者有兩個:你和房東。
  • 」字,代表的意思是對參與者的一種行為約定和規範。例如三方協議里規定試用期期限、毀約金等;租房協議里規定租期期限、每月租金金額、違約如何處理等。

針對 HTTP 協議,我們可以這麼理解。

HTTP 是一個用在計算機世界裡的協議。它使用計算機能夠理解的語言確立了一種計算機之間交流通信的規範(兩個以上的參與者),以及相關的各種控制和錯誤處理方式(行為約定和規範)。

2. 「傳輸」

所謂的「傳輸」,很好理解,就是把一堆東西從 A 點搬到 B 點,或者從 B 點 搬到 A 點。

別輕視了這個簡單的動作,它至少包含兩項重要的信息。

HTTP 協議是一個雙向協議

我們在上網衝浪時,瀏覽器是請求方 A ,百度網站就是應答方 B。雙方約定用 HTTP 協議來通信,於是瀏覽器把請求數據發送給網站,網站再把一些數據返回給瀏覽器,最後由瀏覽器渲染在螢幕,就可以看到圖片、視頻了。

請求 - 應答

數據雖然是在 A 和 B 之間傳輸,但允許中間有中轉或接力

就好像第一排的同學想穿遞紙條給最後一排的同學,那麼傳遞的過程中就需要經過好多個同學(中間人),這樣的傳輸方式就從「A < --- > B」,變成了「A <-> N <-> M <-> B」。

而在 HTTP 里,需要中間人遵從 HTTP 協議,只要不打擾基本的數據傳輸,就可以添加任意額外的東西。

針對傳輸,我們可以進一步理解了 HTTP。

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

3. 「超文本」

HTTP 傳輸的內容是「超文本」。

我們先來理解「文本」,在網際網路早期的時候只是簡單的字符文字,但現在「文本」。的涵義已經可以擴展為圖片、視頻、壓縮包等,在 HTTP 眼裡這些都算做「文本」。

再來理解「超文本」,它就是超越了普通文本的文本,它是文字、圖片、視頻等的混合體最關鍵有超連結,能從一個超文本跳轉到另外一個超文本。

HTML 就是最常見的超文本了,它本身只是純文字文件,但內部用很多標籤定義了圖片、視頻等的連結,在經過瀏覽器的解釋,呈現給我們的就是一個文字、有畫面的網頁了。

OK,經過了對 HTTP 里這三個名詞的詳細解釋,就可以給出比「超文本傳輸協議」這七個字更準確更有技術含量的答案:

HTTP 是一個在計算機世界裡專門在「兩點」之間「傳輸」文字、圖片、音頻、視頻等「超文本」數據的「約定和規範」。

那「HTTP 是用於從網際網路伺服器傳輸超文本到本地瀏覽器的協議HTTP」 ,這種說法正確嗎?

這種說法是不正確的。因為也可以是「伺服器< -- >伺服器」,所以採用兩點之間的描述會更準確。

HTTP 常見的狀態碼,有哪些?

五大類 HTTP 狀態碼

1xx

1xx 類狀態碼屬於提示信息,是協議處理中的一種中間狀態,實際用到的比較少。

2xx

2xx 類狀態碼錶示伺服器成功處理了客戶端的請求,也是我們最願意看到的狀態。

200 OK」是最常見的成功狀態碼,表示一切正常。如果是非 HEAD 請求,伺服器返回的響應頭都會有 body 數據。

204 No Content」也是常見的成功狀態碼,與 200 OK 基本相同,但響應頭沒有 body 數據。

206 Partial Content」是應用於 HTTP 分塊下載或斷電續傳,表示響應返回的 body 數據並不是資源的全部,而是其中的一部分,也是伺服器處理成功的狀態。

3xx

3xx 類狀態碼錶示客戶端請求的資源發送了變動,需要客戶端用新的 URL 重新發送請求獲取資源,也就是重定向

301 Moved Permanently」表示永久重定向,說明請求的資源已經不存在了,需改用新的 URL 再次訪問。

302 Moved Permanently」表示臨時重定向,說明請求的資源還在,但暫時需要用另一個 URL 來訪問。

301 和 302 都會在響應頭裡使用欄位 Location,指明後續要跳轉的 URL,瀏覽器會自動重定向新的 URL。

304 Not Modified」不具有跳轉的含義,表示資源未修改,重定向已存在的緩衝文件,也稱緩存重定向,用於緩存控制。

4xx

4xx 類狀態碼錶示客戶端發送的報文有誤,伺服器無法處理,也就是錯誤碼的含義。

400 Bad Request」表示客戶端請求的報文有錯誤,但只是個籠統的錯誤。

403 Forbidden」表示伺服器禁止訪問資源,並不是客戶端的請求出錯。

404 Not Found」表示請求的資源在伺服器上不存在或未找到,所以無法提供給客戶端。

5xx

5xx 類狀態碼錶示客戶端請求報文正確,但是伺服器處理時內部發生了錯誤,屬於伺服器端的錯誤碼。

500 Internal Server Error」與 400 類型,是個籠統通用的錯誤碼,伺服器發生了什麼錯誤,我們並不知道。

501 Not Implemented」表示客戶端請求的功能還不支持,類似「即將開業,敬請期待」的意思。

502 Bad Gateway」通常是伺服器作為網關或代理時返回的錯誤碼,表示伺服器自身工作正常,訪問後端伺服器發生了錯誤。

503 Service Unavailable」表示伺服器當前很忙,暫時無法響應伺服器,類似「網絡服務正忙,請稍後重試」的意思。

http 常見欄位有哪些?

Host

客戶端發送請求時,用來指定伺服器的域名。


Host: www.A.com

有了 Host 欄位,就可以將請求發往「同一台」伺服器上的不同網站。

Content-Length 欄位

伺服器在返回數據時,會有 Content-Length 欄位,表明本次回應的數據長度。


Content-Length: 1000

如上面則是告訴瀏覽器,本次伺服器回應的數據長度是 1000 個字節,後面的字節就屬於下一個回應了。

Connection 欄位

Connection 欄位最常用於客戶端要求伺服器使用 TCP 持久連接,以便其他請求復用。

HTTP/1.1 版本的默認連接都是持久連接,但為了兼容老版本的 HTTP,需要指定Connection 首部欄位的值為 Keep-Alive。

Connection: keep-alive

一個可以復用的 TCP 連接就建立了,直到客戶端或伺服器主動關閉連接。但是,這不是標準欄位。

Content-Type 欄位

Content-Type 欄位用於伺服器回應時,告訴客戶端,本次數據是什麼格式。


Content-Type: text/html; charset=utf-8

上面的類型表明,發送的是網頁,而且編碼是UTF-8。

客戶端請求的時候,可以使用 Accept 欄位聲明自己可以接受哪些數據格式。

Accept: */*

上面代碼中,客戶端聲明自己可以接受任何格式的數據。

Content-Encoding 欄位

Content-Encoding 欄位說明數據的壓縮方法。表示伺服器返回的數據使用了什麼壓縮格式


Content-Encoding: gzip

上面表示伺服器返回的數據採用了 gzip 方式壓縮,告知客戶端需要用此方式解壓。

客戶端在請求時,用 Accept-Encoding 欄位說明自己可以接受哪些壓縮方法。

Accept-Encoding: gzip, deflate

GET 與 POST

說一下 GET 和 POST 的區別?

Get 方法的含義是請求從伺服器獲取資源,這個資源可以是靜態的文本、頁面、圖片視頻等。

比如,你打開我的文章,瀏覽器就會發送 GET 請求給伺服器,伺服器就會返回文章的所有文字及資源。

GET 請求

而POST 方法則是相反操作,它向 URI 指定的資源提交數據,數據就放在報文的 body 里。

比如,你在我文章底部,敲入了留言後點擊「提交」(暗示你們留言),瀏覽器就會執行一次 POST 請求,把你的留言文字放進了報文 body 里,然後拼接好 POST 請求頭,通過 TCP 協議發送給伺服器。

POST 請求

GET 和 POST 方法都是安全和冪等的嗎?

先說明下安全和冪等的概念:

  • 在 HTTP 協議里,所謂的「安全」是指請求方法不會「破壞」伺服器上的資源。
  • 所謂的「冪等」,意思是多次執行相同的操作,結果都是「相同」的。

那麼很明顯 GET 方法就是安全且冪等的,因為它是「只讀」操作,無論操作多少次,伺服器上的數據都是安全的,且每次的結果都是相同的。

POST 因為是「新增或提交數據」的操作,會修改伺服器上的資源,所以是不安全的,且多次提交數據就會創建多個資源,所以不是冪等的。


03 HTTP 特性

你知道的 HTTP(1.1) 的優點有哪些,怎麼體現的?

HTTP 最凸出的優點是「簡單、靈活和易於擴展、應用廣泛和跨平台」。

1. 簡單

HTTP 基本的報文格式就是 header + body,頭部信息也是 key-value 簡單文本的形式,易於理解,降低了學習和使用的門檻。

2. 靈活和易於擴展

HTTP協議里的各類請求方法、URI/URL、狀態碼、頭欄位等每個組成要求都沒有被固定死,都允許開發人員自定義和擴充

同時 HTTP 由於是工作在應用層( OSI 第七層),則它下層可以隨意變化

HTTPS 也就是在 HTTP 與 TCP 層之間增加了 SSL/TLS 安全傳輸層,HTTP/3 甚至把 TCPP 層換成了基於 UDP 的 QUIC。

3. 應用廣泛和跨平台

網際網路發展至今,HTTP 的應用範圍非常的廣泛,從台式機的瀏覽器到手機上的各種 APP,從看新聞、刷貼吧到購物、理財、吃雞,HTTP 的應用片地開花,同時天然具有跨平台的優越性。

那它的缺點呢?

HTTP 協議里有優缺點一體的雙刃劍,分別是「無狀態、明文傳輸」,同時還有一大缺點「不安全」。

1. 無狀態雙刃劍

無狀態的好處,因為伺服器不會去記憶 HTTP 的狀態,所以不需要額外的資源來記錄狀態信息,這能減輕伺服器的負擔,能夠把更多

關鍵字: