天天看點

讓面試官顫抖的 HTTP 2.0 協定面試題

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

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

一、HTTP定義

HTTP協定(HyperTextTransferProtocol,超文本傳輸協定)是用于從WWW伺服器傳輸超文本到本地浏覽器的傳輸協定。

二、HTTP發展史

讓面試官顫抖的 HTTP 2.0 協定面試題

三、HTTP 2.0 vs 1.0 性能能

HTTP 2.0 的出現,相比于 HTTP 1.x ,大幅度的提升了 web 性能。

讓面試官顫抖的 HTTP 2.0 協定面試題

這是 Akamai 公司建立的一個官方的示範,用以說明 HTTP/2 相比于之前的 HTTP/1.1 在性能上的大幅度提升。 同時請求 379 張圖檔,從Load time 的對比可以看出 HTTP/2 在速度上的優勢。

四、HTTP 2.0 和 1.1 差別别

後面我們将通過幾個方面來說說HTTP 2.0 和 HTTP1.1 差別,并且和你解釋下其中的原理。

差別一:多路複用

多路複用允許單一的 HTTP/2 連接配接同時發起多重的請求-響應消息。看個例子:

讓面試官顫抖的 HTTP 2.0 協定面試題

整個通路流程第一次請求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.0 協定面試題

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

二進制分幀層 在 應用層(HTTP/2)和傳輸層(TCP or UDP)之間。HTTP/2并沒有去修改TCP協定而是盡可能的利用TCP的特性。

讓面試官顫抖的 HTTP 2.0 協定面試題

在二進制分幀層中, HTTP/2 會将所有傳輸的資訊分割為幀(frame),并對它們采用二進制格式的編碼 ,其中 首部資訊會被封裝到 HEADER frame,而相應的 Request Body 則封裝到 DATA frame 裡面。掌握這 11 個方法論,搞定一場完美技術面試!

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

HTTP/2 通過讓所有資料流共用同一個連接配接,可以更有效地使用 TCP 連接配接,讓高帶寬也能真正的服務于 HTTP 的性能提升。

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

讓面試官顫抖的 HTTP 2.0 協定面試題

HTTP/1

讓面試官顫抖的 HTTP 2.0 協定面試題

HTTP/2

總結下:多路複用技術:單連接配接多資源的方式,減少服務端的連結壓力,記憶體占用更少,連接配接吞吐量更大;由于減少TCP 慢啟動時間,提高傳輸的速度

差別二:首部壓縮

===========

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

随着 Web 功能越來越複雜,每個頁面産生的請求數也越來越多,導緻消耗在頭部的流量越來越多,尤其是每次都要傳輸 UserAgent、Cookie 這類不會頻繁變動的内容,完全是一種浪費。掌握這 11 個方法論,搞定一場完美技術面試!

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

維護一份相同的靜态字典(Static Table),包含常見的頭部名稱,以及特别常見的頭部名稱與值的組合;

維護一份相同的動态字典(Dynamic Table),可以動态的添加内容;

支援基于靜态哈夫曼碼表的哈夫曼編碼(Huffman Coding);

靜态字典的作用有兩個:

1)對于完全比對的頭部鍵值對,例如 “:method :GET”,可以直接使用一個字元表示;

2)對于頭部名稱可以比對的鍵值對,例如 “cookie :xxxxxxx”,可以将名稱使用一個字元表示。

HTTP/2 中的靜态字典如下(以下隻截取了部分,完整表格在這裡):

讓面試官顫抖的 HTTP 2.0 協定面試題

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

差別三:HTTP2支援伺服器推送

服務端推送是一種在用戶端請求之前發送資料的機制。當代網頁使用了許多資源:HTML、樣式表、腳本、圖檔等等。在HTTP/1.x中這些資源每一個都必須明确地請求。這可能是一個很慢的過程。浏覽器從擷取HTML開始,然後在它解析和評估頁面的時候,增量地擷取更多的資源。因為伺服器必須等待浏覽器做每一個請求,網絡經常是空閑的和未充分使用的。

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

讓面試官顫抖的 HTTP 2.0 協定面試題

繼續閱讀