讓面試官顫抖的 HTTP 2 0 協議面試題

2021-08-25 08:06:27 字數 3201 閱讀 5555

http協議,對於擁有豐富開發經驗的程式設計師來說簡直是信手拈來,家常便飯。雖然天天見,但是對於http協議的問題,可能很多人在沒有積極準備的情況下,不一定能很好的回答出來。

今天,我們就來講講http 2.0和之前版本的區別。

http協議(hypertexttransferprotocol,超文字傳輸協議)是用於從www伺服器傳輸超文字到本地瀏覽器的傳輸協議。

http 2.0 的出現,相比於 http 1.x ,大幅度的提公升了 web 效能。

這是 akamai 公司建立的乙個官方的演示,用以說明 http/2 相比於之前的 http/1.1 在效能上的大幅度提公升。 同時請求 379 張,從load time 的對比可以看出 http/2 在速度上的優勢。

後面我們將通過幾個方面來說說http 2.0 和 http1.1 區別,並且和你解釋下其中的原理。

區別一:多路復用

多路復用允許單一的 http/2 連線同時發起多重的請求-響應訊息。看個例子:

整個訪問流程第一次請求index.html頁面,之後瀏覽器會去請求style.css和scripts.js的檔案。左邊的圖是順序載入兩個個檔案的,右邊則是並行載入兩個檔案。

我們知道http底層其實依賴的是tcp協議,那問題是在同乙個連線裡面同時發生兩個請求響應著是怎麼做到的?

首先你要知道,tcp連線相當於兩根管道(乙個用於伺服器到客戶端,乙個用於客戶端到伺服器),管道裡面資料傳輸是通過位元組碼傳輸,傳輸是有序的,每個位元組都是乙個乙個來傳輸。

例如客戶端要向伺服器傳送hello、world兩個單詞,只能是先傳送hello再傳送world,沒辦法同時傳送這兩個單詞。不然伺服器收到的可能就是hweolrllod(注意是穿插著發過去了,但是順序還是不會亂)。這樣伺服器就懵b了。

接上面的問題,能否同時傳送hello和world兩個單詞?能,當然也是可以的,可以將資料拆成包,給每個包打上標籤。發的時候是這樣的①h ②w ①e ②o ①l ②r ①l ②l ①o ②d。這樣到了伺服器,伺服器根據標籤把兩個單詞區分開來。實際的傳送效果如下圖:

要實現上面的效果我們引入乙個新的概念就是:二進位制分幀。

二進位制分幀層 在 應用層(http/2)和傳輸層(tcp or udp)之間。http/2並沒有去修改tcp協議而是盡可能的利用tcp的特性。

在二進位制分幀層中, http/2 會將所有傳輸的資訊分割為幀(frame),並對它們採用二進位制格式的編碼 ,其中 首部資訊會被封裝到 header frame,而相應的 request body 則封裝到 data frame 裡面。

http 效能優化的關鍵並不在於高頻寬,而是低延遲。tcp 連線會隨著時間進行自我「調諧」,起初會限制連線的最大速度,如果資料成功傳輸,會隨著時間的推移提高傳輸的速度。這種調諧則被稱為 tcp 慢啟動。由於這種原因,讓原本就具有突發性和短時性的 http 連線變的十分低效。

http/2 通過讓所有資料流共用同乙個連線,可以更有效地使用 tcp 連線,讓高頻寬也能真正的服務於 http 的效能提公升。

通過下面兩張圖,我們可以更加深入的認識多路復用:

區別二:首部壓縮

為什麼要壓縮?在 http/1 中,http 請求和響應都是由「狀態行、請求 / 響應頭部、訊息主體」三部分組成。一般而言,訊息主體都會經過 gzip 壓縮,或者本身傳輸的就是壓縮過後的二進位制檔案(例如、音訊),但狀態行和頭部卻沒有經過任何壓縮,直接以純文字傳輸。

隨著 web 功能越來越複雜,每個頁面產生的請求數也越來越多,導致消耗在頭部的流量越來越多,尤其是每次都要傳輸 useragent、cookie 這類不會頻繁變動的內容,完全是一種浪費。

我們再用通俗的語言解釋下,壓縮的原理。頭部壓縮需要在支援 http/2 的瀏覽器和服務端之間:

靜態字典的作用有兩個:

1)對於完全匹配的頭部鍵值對,例如 「:method :get」,可以直接使用乙個字元表示;

2)對於頭部名稱可以匹配的鍵值對,例如 「cookie :******x」,可以將名稱使用乙個字元表示。

http/2 中的靜態字典如下(以下只擷取了部分,完整**在這裡):

同時,瀏覽器和服務端都可以向動態字典中新增鍵值對,之後這個鍵值對就可以使用乙個字元表示了。需要注意的是,動態字典上下文有關,需要為每個 http/2 連線維護不同的字典。在傳輸過程中使用,使用字元代替鍵值對大大減少傳輸的資料量。

區別三:http2支援伺服器推送

服務端推送是一種在客戶端請求之前傳送資料的機制。當代網頁使用了許多資源:html、樣式表、指令碼、等等。在http/1.x中這些資源每乙個都必須明確地請求。這可能是乙個很慢的過程。瀏覽器從獲取html開始,然後在它解析和評估頁面的時候,增量地獲取更多的資源。因為伺服器必須等待瀏覽器做每乙個請求,網路經常是空閒的和未充分使用的。

為了改善延遲,http/2引入了server push,它允許服務端推送資源給瀏覽器,在瀏覽器明確地請求之前。乙個伺服器經常知道乙個頁面需要很多附加資源,在它響應瀏覽器第乙個請求的時候,可以開始推送這些資源。這允許服務端去完全充分地利用乙個可能空閒的網路,改善頁面載入時間。

讓面試官顫抖的Tomcat系統架構系列!

看懂了是一說法,理解又是一說法,能侃侃而談又是一說,好長時間不忘又是一說。今行健,以自強不息對於web開發的我們來說,與tomcat打交道,是非常的頻繁的,tomcat就是乙個小型的伺服器,我們可以訪問。目前同類中有jetty,做的比較好,它是採用nio,效能比較好。但是啊,tomcat已經進入市場...

面試官最容易提出的20個問題

一 請談談你自己。答題要點 自我介紹要簡明扼要,有概括性。突出講自己與工作的契合點,其餘一帶而過,不要誇耀自己。語言要清晰流暢,條理分明,盡量使用 首先 其次 等表面邏輯的詞語,對方會認為你是個有條理的人。也可以說說自己的座右銘,加深面試對你的印象。再一次,個人介紹要與簡歷一致,不可出現矛盾之處,否...

什麼樣的專案經歷會讓面試官眼前一亮

很多同學都問過我類似的問題 咱們如鵬網教的 c語言也能幹大事 中講的自己動手寫windows優化大師 自己動手寫計算器等東西只是寫著玩的小玩具而已,這些能用來以後找工作時寫到簡歷中的作品嗎?看別人的簡歷寫的 圖書管理系統 教務選課系統 多有面子呀!這種想法是同學們看多了師兄師姐的簡歷造成的誤解,看著...