硬核!30 張圖解 HTTP 常見的面試題
掃描二維碼
隨時隨地手機看文章
每日一句英語學(xué)習(xí),每天進步一點點:
前言
在面試過程中,HTTP 被提問的概率還是比較高的。
小林我搜集了 5 大類 HTTP 面試常問的題目,同時這 5 大類題跟 HTTP 的發(fā)展和演變關(guān)聯(lián)性是比較大的,通過問答 + 圖解的形式由淺入深的方式幫助大家進一步的學(xué)習(xí)和理解 HTTP 協(xié)議。
HTTP 基本概念
Get 與 Post
HTTP 特性
HTTPS 與 HTTP
HTTP/1.1、HTTP/2、HTTP/3 演變
正文
01 HTTP 基本概念
HTTP 是什么?描述一下
HTTP 是超文本傳輸協(xié)議,也就是HyperText Transfer Protocol。
能否詳細解釋「超文本傳輸協(xié)議」?
HTTP的名字「超文本協(xié)議傳輸」,它可以拆成三個部分:
超文本
傳輸
協(xié)議
1. 「協(xié)議」
在生活中,我們也能隨處可見「協(xié)議」,例如:
剛畢業(yè)時會簽一個「三方協(xié)議」;
找房子時會簽一個「租房協(xié)議」;
生活中的協(xié)議,本質(zhì)上與計算機中的協(xié)議是相同的,協(xié)議的特點:
「協(xié)」字,代表的意思是必須有兩個以上的參與者。例如三方協(xié)議里的參與者有三個:你、公司、學(xué)校三個;租房協(xié)議里的參與者有兩個:你和房東。
「儀」字,代表的意思是對參與者的一種行為約定和規(guī)范。例如三方協(xié)議里規(guī)定試用期期限、毀約金等;租房協(xié)議里規(guī)定租期期限、每月租金金額、違約如何處理等。
針對 HTTP 協(xié)議,我們可以這么理解。
HTTP 是一個用在計算機世界里的協(xié)議。它使用計算機能夠理解的語言確立了一種計算機之間交流通信的規(guī)范(兩個以上的參與者),以及相關(guān)的各種控制和錯誤處理方式(行為約定和規(guī)范)。
2. 「傳輸」
所謂的「傳輸」,很好理解,就是把一堆東西從 A 點搬到 B 點,或者從 B 點 搬到 A 點。
別輕視了這個簡單的動作,它至少包含兩項重要的信息。
HTTP 協(xié)議是一個雙向協(xié)議。
我們在上網(wǎng)沖浪時,瀏覽器是請求方 A ,百度網(wǎng)站就是應(yīng)答方 B。雙方約定用 HTTP 協(xié)議來通信,于是瀏覽器把請求數(shù)據(jù)發(fā)送給網(wǎng)站,網(wǎng)站再把一些數(shù)據(jù)返回給瀏覽器,最后由瀏覽器渲染在屏幕,就可以看到圖片、視頻了。
數(shù)據(jù)雖然是在 A 和 B 之間傳輸,但允許中間有中轉(zhuǎn)或接力。
就好像第一排的同學(xué)想穿遞紙條給最后一排的同學(xué),那么傳遞的過程中就需要經(jīng)過好多個同學(xué)(中間人),這樣的傳輸方式就從「A < --- > B」,變成了「A <-> N <-> M <-> B」。
而在 HTTP 里,需要中間人遵從 HTTP 協(xié)議,只要不打擾基本的數(shù)據(jù)傳輸,就可以添加任意額外的東西。
針對傳輸,我們可以進一步理解了 HTTP。
HTTP 是一個在計算機世界里專門用來在兩點之間傳輸數(shù)據(jù)的約定和規(guī)范。
3. 「超文本」
HTTP 傳輸?shù)膬?nèi)容是「超文本」。
我們先來理解「文本」,在互聯(lián)網(wǎng)早期的時候只是簡單的字符文字,但現(xiàn)在「文本」。的涵義已經(jīng)可以擴展為圖片、視頻、壓縮包等,在 HTTP 眼里這些都算做「文本」。
再來理解「超文本」,它就是超越了普通文本的文本,它是文字、圖片、視頻等的混合體最關(guān)鍵有超鏈接,能從一個超文本跳轉(zhuǎn)到另外一個超文本。
HTML 就是最常見的超文本了,它本身只是純文字文件,但內(nèi)部用很多標(biāo)簽定義了圖片、視頻等的鏈接,在經(jīng)過瀏覽器的解釋,呈現(xiàn)給我們的就是一個文字、有畫面的網(wǎng)頁了。
OK,經(jīng)過了對 HTTP 里這三個名詞的詳細解釋,就可以給出比「超文本傳輸協(xié)議」這七個字更準(zhǔn)確更有技術(shù)含量的答案:
HTTP 是一個在計算機世界里專門在「兩點」之間「傳輸」文字、圖片、音頻、視頻等「超文本」數(shù)據(jù)的「約定和規(guī)范」。
那「HTTP 是用于從互聯(lián)網(wǎng)服務(wù)器傳輸超文本到本地瀏覽器的協(xié)議HTTP」 ,這種說法正確嗎?
這種說法是不正確的。因為也可以是「服務(wù)器< -- >服務(wù)器」,所以采用兩點之間的描述會更準(zhǔn)確。
HTTP 常見的狀態(tài)碼,有哪些?
1xx
1xx
類狀態(tài)碼屬于提示信息,是協(xié)議處理中的一種中間狀態(tài),實際用到的比較少。
2xx
2xx
類狀態(tài)碼表示服務(wù)器成功處理了客戶端的請求,也是我們最愿意看到的狀態(tài)。
「200 OK」是最常見的成功狀態(tài)碼,表示一切正常。如果是非 HEAD
請求,服務(wù)器返回的響應(yīng)頭都會有 body 數(shù)據(jù)。
「204 No Content」也是常見的成功狀態(tài)碼,與 200 OK 基本相同,但響應(yīng)頭沒有 body 數(shù)據(jù)。
「206 Partial Content」是應(yīng)用于 HTTP 分塊下載或斷電續(xù)傳,表示響應(yīng)返回的 body 數(shù)據(jù)并不是資源的全部,而是其中的一部分,也是服務(wù)器處理成功的狀態(tài)。
3xx
3xx
類狀態(tài)碼表示客戶端請求的資源發(fā)送了變動,需要客戶端用新的 URL 重新發(fā)送請求獲取資源,也就是重定向。
「301 Moved Permanently」表示永久重定向,說明請求的資源已經(jīng)不存在了,需改用新的 URL 再次訪問。
「302 Moved Permanently」表示臨時重定向,說明請求的資源還在,但暫時需要用另一個 URL 來訪問。
301 和 302 都會在響應(yīng)頭里使用字段 Location
,指明后續(xù)要跳轉(zhuǎn)的 URL,瀏覽器會自動重定向新的 URL。
「304 Not Modified」不具有跳轉(zhuǎn)的含義,表示資源未修改,重定向已存在的緩沖文件,也稱緩存重定向,用于緩存控制。
4xx
4xx
類狀態(tài)碼表示客戶端發(fā)送的報文有誤,服務(wù)器無法處理,也就是錯誤碼的含義。
「400 Bad Request」表示客戶端請求的報文有錯誤,但只是個籠統(tǒng)的錯誤。
「403 Forbidden」表示服務(wù)器禁止訪問資源,并不是客戶端的請求出錯。
「404 Not Found」表示請求的資源在服務(wù)器上不存在或未找到,所以無法提供給客戶端。
5xx
5xx
類狀態(tài)碼表示客戶端請求報文正確,但是服務(wù)器處理時內(nèi)部發(fā)生了錯誤,屬于服務(wù)器端的錯誤碼。
「500 Internal Server Error」與 400 類型,是個籠統(tǒng)通用的錯誤碼,服務(wù)器發(fā)生了什么錯誤,我們并不知道。
「501 Not Implemented」表示客戶端請求的功能還不支持,類似“即將開業(yè),敬請期待”的意思。
「502 Bad Gateway」通常是服務(wù)器作為網(wǎng)關(guān)或代理時返回的錯誤碼,表示服務(wù)器自身工作正常,訪問后端服務(wù)器發(fā)生了錯誤。
「503 Service Unavailable」表示服務(wù)器當(dāng)前很忙,暫時無法響應(yīng)服務(wù)器,類似“網(wǎng)絡(luò)服務(wù)正忙,請稍后重試”的意思。
http 常見字段有哪些?
Host
客戶端發(fā)送請求時,用來指定服務(wù)器的域名。
Host: www.A.com
有了 Host
字段,就可以將請求發(fā)往「同一臺」服務(wù)器上的不同網(wǎng)站。
Content-Length 字段
服務(wù)器在返回數(shù)據(jù)時,會有 Content-Length
字段,表明本次回應(yīng)的數(shù)據(jù)長度。
Content-Length: 1000
如上面則是告訴瀏覽器,本次服務(wù)器回應(yīng)的數(shù)據(jù)長度是 1000 個字節(jié),后面的字節(jié)就屬于下一個回應(yīng)了。
Connection 字段
Connection
字段最常用于客戶端要求服務(wù)器使用 TCP 持久連接,以便其他請求復(fù)用。
HTTP/1.1 版本的默認連接都是持久連接,但為了兼容老版本的 HTTP,需要指定 Connection
首部字段的值為 Keep-Alive
。
Connection: keep-alive
一個可以復(fù)用的 TCP 連接就建立了,直到客戶端或服務(wù)器主動關(guān)閉連接。但是,這不是標(biāo)準(zhǔn)字段。
Content-Type 字段
Content-Type
字段用于服務(wù)器回應(yīng)時,告訴客戶端,本次數(shù)據(jù)是什么格式。
Content-Type: text/html; charset=utf-8
上面的類型表明,發(fā)送的是網(wǎng)頁,而且編碼是UTF-8。
客戶端請求的時候,可以使用 Accept
字段聲明自己可以接受哪些數(shù)據(jù)格式。
Accept: */*
上面代碼中,客戶端聲明自己可以接受任何格式的數(shù)據(jù)。
Content-Encoding 字段
Content-Encoding
字段說明數(shù)據(jù)的壓縮方法。表示服務(wù)器返回的數(shù)據(jù)使用了什么壓縮格式
Content-Encoding: gzip
上面表示服務(wù)器返回的數(shù)據(jù)采用了 gzip 方式壓縮,告知客戶端需要用此方式解壓。
客戶端在請求時,用 Accept-Encoding
字段說明自己可以接受哪些壓縮方法。
Accept-Encoding: gzip, deflate
GET 與 POST
說一下 GET 和 POST 的區(qū)別?
Get
方法的含義是請求從服務(wù)器獲取資源,這個資源可以是靜態(tài)的文本、頁面、圖片視頻等。
比如,你打開我的文章,瀏覽器就會發(fā)送 GET 請求給服務(wù)器,服務(wù)器就會返回文章的所有文字及資源。
而POST
方法則是相反操作,它向 URI
指定的資源提交數(shù)據(jù),數(shù)據(jù)就放在報文的 body 里。
比如,你在我文章底部,敲入了留言后點擊「提交」(暗示你們留言),瀏覽器就會執(zhí)行一次 POST 請求,把你的留言文字放進了報文 body 里,然后拼接好 POST 請求頭,通過 TCP 協(xié)議發(fā)送給服務(wù)器。
GET 和 POST 方法都是安全和冪等的嗎?
先說明下安全和冪等的概念:
在 HTTP 協(xié)議里,所謂的「安全」是指請求方法不會「破壞」服務(wù)器上的資源。
所謂的「冪等」,意思是多次執(zhí)行相同的操作,結(jié)果都是「相同」的。
那么很明顯 GET 方法就是安全且冪等的,因為它是「只讀」操作,無論操作多少次,服務(wù)器上的數(shù)據(jù)都是安全的,且每次的結(jié)果都是相同的。
POST 因為是「新增或提交數(shù)據(jù)」的操作,會修改服務(wù)器上的資源,所以是不安全的,且多次提交數(shù)據(jù)就會創(chuàng)建多個資源,所以不是冪等的。
03 HTTP 特性
你知道的 HTTP(1.1) 的優(yōu)點有哪些,怎么體現(xiàn)的?
HTTP 最凸出的優(yōu)點是「簡單、靈活和易于擴展、應(yīng)用廣泛和跨平臺」。
1. 簡單
HTTP 基本的報文格式就是 header + body
,頭部信息也是 key-value
簡單文本的形式,易于理解,降低了學(xué)習(xí)和使用的門檻。
2. 靈活和易于擴展
HTTP協(xié)議里的各類請求方法、URI/URL、狀態(tài)碼、頭字段等每個組成要求都沒有被固定死,都允許開發(fā)人員自定義和擴充。
同時 HTTP 由于是工作在應(yīng)用層( OSI
第七層),則它下層可以隨意變化。
HTTPS 也就是在 HTTP 與 TCP 層之間增加了 SSL/TLS 安全傳輸層,HTTP/3 甚至把 TCPP 層換成了基于 UDP 的 QUIC。
3. 應(yīng)用廣泛和跨平臺
互聯(lián)網(wǎng)發(fā)展至今,HTTP 的應(yīng)用范圍非常的廣泛,從臺式機的瀏覽器到手機上的各種 APP,從看新聞、刷貼吧到購物、理財、吃雞,HTTP 的應(yīng)用片地開花,同時天然具有跨平臺的優(yōu)越性。
那它的缺點呢?
HTTP 協(xié)議里有優(yōu)缺點一體的雙刃劍,分別是「無狀態(tài)、明文傳輸」,同時還有一大缺點「不安全」。
1. 無狀態(tài)雙刃劍
無狀態(tài)的好處,因為服務(wù)器不會去記憶 HTTP 的狀態(tài),所以不需要額外的資源來記錄狀態(tài)信息,這能減輕服務(wù)器的負擔(dān),能夠把更多的 CPU 和內(nèi)存用來對外提供服務(wù)。
無狀態(tài)的壞處,既然服務(wù)器沒有記憶能力,它在完成有關(guān)聯(lián)性的操作時會非常麻煩。
例如登錄->添加購物車->下單->結(jié)算->支付,這系列操作都要知道用戶的身份才行。但服務(wù)器不知道這些請求是有關(guān)聯(lián)的,每次都要問一遍身份信息。
這樣每操作一次,都要驗證信息,這樣的購物體驗還能愉快嗎?別問,問就是酸爽!
對于無狀態(tài)的問題,解法方案有很多種,其中比較簡單的方式用 Cookie 技術(shù)。
Cookie
通過在請求和響應(yīng)報文中寫入 Cookie 信息來控制客戶端的狀態(tài)。
相當(dāng)于,在客戶端第一次請求后,服務(wù)器會下發(fā)一個裝有客戶信息的「小貼紙」,后續(xù)客戶端請求服務(wù)器的時候,帶上「小貼紙」,服務(wù)器就能認得了了,
2. 明文傳輸雙刃劍
明文意味著在傳輸過程中的信息,是可方便閱讀的,通過瀏覽器的 F12 控制臺或 Wireshark 抓包都可以直接肉眼查看,為我們調(diào)試工作帶了極大的便利性。
但是這正是這樣,HTTP 的所有信息都暴露在了光天化日下,相當(dāng)于信息裸奔。在傳輸?shù)穆L的過程中,信息的內(nèi)容都毫無隱私可言,很容易就能被竊取,如果里面有你的賬號密碼信息,那你號沒了。
3. 不安全
HTTP 比較嚴(yán)重的缺點就是不安全:
通信使用明文(不加密),內(nèi)容可能會被竊聽。比如,賬號信息容易泄漏,那你號沒了。
不驗證通信方的身份,因此有可能遭遇偽裝。比如,訪問假的淘寶、拼多多,那你錢沒了。
無法證明報文的完整性,所以有可能已遭篡改。比如,網(wǎng)頁上植入垃圾廣告,視覺污染,眼沒了。
HTTP 的安全問題,可以用 HTTPS 的方式解決,也就是通過引入 SSL/TLS 層,使得在安全上達到了極致。
那你說下 HTTP/1.1 的性能如何?
HTTP 協(xié)議是基于 TCP/IP,并且使用了「請求 - 應(yīng)答」的通信模式,所以性能的關(guān)鍵就在這兩點里。
1. 長連接
早期 HTTP/1.0 性能上的一個很大的問題,那就是每發(fā)起一個請求,都要新建一次 TCP 連接(三次握手),而且是串行請求,做了無畏的 TCP 連接建立和斷開,增加了通信開銷。
為了解決上述 TCP 連接問題,HTTP/1.1 提出了長連接的通信方式,也叫持久連接。這種方式的好處在于減少了 TCP 連接的重復(fù)建立和斷開所造成的額外開銷,減輕了服務(wù)器端的負載。
持久連接的特點是,只要任意一端沒有明確提出斷開連接,則保持 TCP 連接狀態(tài)。
2. 管道網(wǎng)絡(luò)傳輸
HTTP/1.1 采用了長連接的方式,這使得管道(pipeline)網(wǎng)絡(luò)傳輸成為了可能。
即可在同一個 TCP 連接里面,客戶端可以發(fā)起多個請求,只要第一個請求發(fā)出去了,不必等其回來,就可以發(fā)第二個請求出去,可以減少整體的響應(yīng)時間。
舉例來說,客戶端需要請求兩個資源。以前的做法是,在同一個TCP連接里面,先發(fā)送 A 請求,然后等待服務(wù)器做出回應(yīng),收到后再發(fā)出 B 請求。管道機制則是允許瀏覽器同時發(fā)出 A 請求和 B 請求。
但是服務(wù)器還是按照順序,先回應(yīng) A 請求,完成后再回應(yīng) B 請求。要是 前面的回應(yīng)特別慢,后面就會有許多請求排隊等著。這稱為「隊頭堵塞」。
3. 隊頭阻塞
「請求 - 應(yīng)答」的模式加劇了 HTTP 的性能問題。
因為當(dāng)順序發(fā)送的請求序列中的一個請求因為某種原因被阻塞時,在后面排隊的所有請求也一同被阻塞了,會招致客戶端一直請求不到數(shù)據(jù),這也就是「隊頭阻塞」。好比上班的路上塞車。
總之 HTTP/1.1 的性能一般般,后續(xù)的 HTTP/2 和 HTTP/3 就是在優(yōu)化 HTTP 的性能。
04 HTTP 與 HTTPS
HTTP 與 HTTPS 有哪些區(qū)別?
HTTP 是超文本傳輸協(xié)議,信息是明文傳輸,存在安全風(fēng)險的問題。HTTPS 則解決 HTTP 不安全的缺陷,在 TCP 和 HTTP 網(wǎng)絡(luò)層之間加入了 SSL/TLS 安全協(xié)議,使得報文能夠加密傳輸。
HTTP 連接建立相對簡單, TCP 三次握手之后便可進行 HTTP 的報文傳輸。而 HTTPS 在 TCP 三次握手之后,還需進行 SSL/TLS 的握手過程,才可進入加密報文傳輸。
HTTP 的端口號是 80,HTTPS 的端口號是 443。
HTTPS 協(xié)議需要向 CA(證書權(quán)威機構(gòu))申請數(shù)字證書,來保證服務(wù)器的身份是可信的。
HTTPS 解決了 HTTP 的哪些問題?
HTTP 由于是明文傳輸,所以安全上存在以下三個風(fēng)險:
竊聽風(fēng)險,比如通信鏈路上可以獲取通信內(nèi)容,用戶號容易沒。
篡改風(fēng)險,比如強制入垃圾廣告,視覺污染,用戶眼容易瞎。
冒充風(fēng)險,比如冒充淘寶網(wǎng)站,用戶錢容易沒。
SSL/TLS
協(xié)議
。
可以很好的解決了上述的風(fēng)險:
信息加密:交互信息無法被竊取,但你的號會因為「自身忘記」賬號而沒。
校驗機制:無法篡改通信內(nèi)容,篡改了就不能正常顯示,但百度「競價排名」依然可以搜索垃圾廣告。
身份證書:證明淘寶是真的淘寶網(wǎng),但你的錢還是會因為「剁手」而沒。
可見,只要自身不做「惡」,SSL/TLS 協(xié)議是能保證通信是安全的。
HTTPS 是如何解決上面的三個風(fēng)險的?
混合加密的方式實現(xiàn)信息的機密性,解決了竊聽的風(fēng)險。
摘要算法的方式來實現(xiàn)完整性,它能夠為數(shù)據(jù)生成獨一無二的「指紋」,指紋用于校驗數(shù)據(jù)的完整性,解決了篡改的風(fēng)險。
將服務(wù)器公鑰放入到數(shù)字證書中,解決了冒充的風(fēng)險。
1. 混合加密
通過混合加密的方式可以保證信息的機密性,解決了竊聽的風(fēng)險。
HTTPS 采用的是對稱加密和非對稱加密結(jié)合的「混合加密」方式:
在通信建立前采用非對稱加密的方式交換「會話秘鑰」,后續(xù)就不再使用非對稱加密。
在通信過程中全部使用對稱加密的「會話秘鑰」的方式加密明文數(shù)據(jù)。
采用「混合加密」的方式的原因:
對稱加密只使用一個密鑰,運算速度快,密鑰必須保密,無法做到安全的密鑰交換。
非對稱加密使用兩個密鑰:公鑰和私鑰,公鑰可以任意分發(fā)而私鑰保密,解決了密鑰交換問題但速度慢。
2. 摘要算法
摘要算法用來實現(xiàn)完整性,能夠為數(shù)據(jù)生成獨一無二的「指紋」,用于校驗數(shù)據(jù)的完整性,解決了篡改的風(fēng)險。
客戶端在發(fā)送明文之前會通過摘要算法算出明文的「指紋」,發(fā)送的時候把「指紋 + 明文」一同
加密成密文后,發(fā)送給服務(wù)器,服務(wù)器解密后,用相同的摘要算法算出發(fā)送過來的明文,通過比較客戶端攜帶的「指紋」和當(dāng)前算出的「指紋」做比較,若「指紋」相同,說明數(shù)據(jù)是完整的。
3. 數(shù)字證書
客戶端先向服務(wù)器端索要公鑰,然后用公鑰加密信息,服務(wù)器收到密文后,用自己的私鑰解密。
這就存在些問題,如何保證公鑰不被篡改和信任度?
所以這里就需要借助第三方權(quán)威機構(gòu) CA
(數(shù)字證書認證機構(gòu)),將服務(wù)器公鑰放在數(shù)字證書(由數(shù)字證書認證機構(gòu)頒發(fā))中,只要證書是可信的,公鑰就是可信的。
通過數(shù)字證書的方式保證服務(wù)器公鑰的身份,解決冒充的風(fēng)險。
HTTPS 是如何建立連接的?其間交互了什么?
SSL/TLS 協(xié)議基本流程:
客戶端向服務(wù)器索要并驗證服務(wù)器的公鑰。
雙方協(xié)商生產(chǎn)「會話秘鑰」。
雙方采用「會話秘鑰」進行加密通信。
前兩步也就是 SSL/TLS 的建立過程,也就是握手階段。
SSL/TLS 的「握手階段」涉及四次通信,可見下圖:
SSL/TLS 協(xié)議建立的詳細流程:
1. ClientHello
首先,由客戶端向服務(wù)器發(fā)起加密通信請求,也就是 ClientHello
請求。
在這一步,客戶端主要向服務(wù)器發(fā)送以下信息:
(1)客戶端支持的 SSL/TLS 協(xié)議版本,如 TLS 1.2 版本。
(2)客戶端生產(chǎn)的隨機數(shù)(Client Random
),后面用于生產(chǎn)「會話秘鑰」。
(3)客戶端支持的密碼套件列表,如 RSA 加密算法。
2. SeverHello
服務(wù)器收到客戶端請求后,向客戶端發(fā)出響應(yīng),也就是 SeverHello
。服務(wù)器回應(yīng)的內(nèi)容有如下內(nèi)容:
(1)確認 SSL/ TLS 協(xié)議版本,如果瀏覽器不支持,則關(guān)閉加密通信。
(2)服務(wù)器生產(chǎn)的隨機數(shù)(Server Random
),后面用于生產(chǎn)「會話秘鑰」。
(3)確認的密碼套件列表,如 RSA 加密算法。
(4)服務(wù)器的數(shù)字證書。
3.客戶端回應(yīng)
客戶端收到服務(wù)器的回應(yīng)之后,首先通過瀏覽器或者操作系統(tǒng)中的 CA 公鑰,確認服務(wù)器的數(shù)字證書的真實性。
如果證書沒有問題,客戶端會從數(shù)字證書中取出服務(wù)器的公鑰,然后使用它加密報文,向服務(wù)器發(fā)送如下信息:
(1)一個隨機數(shù)(pre-master key
)。該隨機數(shù)會被服務(wù)器公鑰加密。
(2)加密通信算法改變通知,表示隨后的信息都將用「會話秘鑰」加密通信。
(3)客戶端握手結(jié)束通知,表示客戶端的握手階段已經(jīng)結(jié)束。這一項同時把之前所有內(nèi)容的發(fā)生的數(shù)據(jù)做個摘要,用來供服務(wù)端校驗。
上面第一項的隨機數(shù)是整個握手階段的第三個隨機數(shù),這樣服務(wù)器和客戶端就同時有三個隨機數(shù),接著就用雙方協(xié)商的加密算法,各自生成本次通信的「會話秘鑰」。
4. 服務(wù)器的最后回應(yīng)
服務(wù)器收到客戶端的第三個隨機數(shù)(pre-master key
)之后,通過協(xié)商的加密算法,計算出本次通信的「會話秘鑰」。然后,向客戶端發(fā)生最后的信息:
(1)加密通信算法改變通知,表示隨后的信息都將用「會話秘鑰」加密通信。
(2)服務(wù)器握手結(jié)束通知,表示服務(wù)器的握手階段已經(jīng)結(jié)束。這一項同時把之前所有內(nèi)容的發(fā)生的數(shù)據(jù)做個摘要,用來供客戶端校驗。
至此,整個 SSL/TLS 的握手階段全部結(jié)束。接下來,客戶端與服務(wù)器進入加密通信,就完全是使用普通的 HTTP 協(xié)議,只不過用「會話秘鑰」加密內(nèi)容。
05 HTTP/1.1、HTTP/2、HTTP/3 演變
說說 HTTP/1.1 相比 HTTP/1.0 提高了什么性能?
HTTP/1.1 相比 HTTP/1.0 性能上的改進:
使用 TCP 長連接的方式改善了 HTTP/1.0 短連接造成的性能開銷。
支持 管道(pipeline)網(wǎng)絡(luò)傳輸,只要第一個請求發(fā)出去了,不必等其回來,就可以發(fā)第二個請求出去,可以減少整體的響應(yīng)時間。
但 HTTP/1.1 還是有性能瓶頸:
請求 / 響應(yīng)頭部(Header)未經(jīng)壓縮就發(fā)送,首部信息越多延遲越大。只能壓縮
Body
的部分;發(fā)送冗長的首部。每次互相發(fā)送相同的首部造成的浪費較多;
服務(wù)器是按請求的順序響應(yīng)的,如果服務(wù)器響應(yīng)慢,會招致客戶端一直請求不到數(shù)據(jù),也就是隊頭阻塞;
沒有請求優(yōu)先級控制;
請求只能從客戶端開始,服務(wù)器只能被動響應(yīng)。
那上面的 HTTP/1.1 的性能瓶頸,HTTP/2 做了什么優(yōu)化?
HTTP/2 協(xié)議是基于 HTTPS 的,所以 HTTP/2 的安全性也是有保障的。
那 HTTP/2 相比 HTTP/1.1 性能上的改進:
1. 頭部壓縮
HTTP/2 會壓縮頭(Header)如果你同時發(fā)出多個請求,他們的頭是一樣的或是相似的,那么,協(xié)議會幫你消除重復(fù)的分。
這就是所謂的 HPACK
算法:在客戶端和服務(wù)器同時維護一張頭信息表,所有字段都會存入這個表,生成一個索引號,以后就不發(fā)送同樣字段了,只發(fā)送索引號,這樣就提高速度了。
2. 二進制格式
HTTP/2 不再像 HTTP/1.1 里的純文本形式的報文,而是全面采用了二進制格式。
頭信息和數(shù)據(jù)體都是二進制,并且統(tǒng)稱為幀(frame):頭信息幀和數(shù)據(jù)幀。
這樣雖然對人不友好,但是對計算機非常友好,因為計算機只懂二進制,那么收到報文后,無需再將明文的報文轉(zhuǎn)成二進制,而是直接解析二進制報文,這增加了數(shù)據(jù)傳輸?shù)男?/strong>。
3. 數(shù)據(jù)流
HTTP/2 的數(shù)據(jù)包不是按順序發(fā)送的,同一個連接里面連續(xù)的數(shù)據(jù)包,可能屬于不同的回應(yīng)。因此,必須要對數(shù)據(jù)包做標(biāo)記,指出它屬于哪個回應(yīng)。
每個請求或回應(yīng)的所有數(shù)據(jù)包,稱為一個數(shù)據(jù)流(Stream
)。
每個數(shù)據(jù)流都標(biāo)記著一個獨一無二的編號,其中規(guī)定客戶端發(fā)出的數(shù)據(jù)流編號為奇數(shù), 服務(wù)器發(fā)出的數(shù)據(jù)流編號為偶數(shù)
客戶端還可以指定數(shù)據(jù)流的優(yōu)先級。優(yōu)先級高的請求,服務(wù)器就先響應(yīng)該請求。
4. 多路復(fù)用
HTTP/2 是可以在一個連接中并發(fā)多個請求或回應(yīng),而不用按照順序一一對應(yīng)。
移除了 HTTP/1.1 中的串行請求,不需要排隊等待,也就不會再出現(xiàn)「隊頭阻塞」問題,降低了延遲,大幅度提高了連接的利用率。
舉例來說,在一個 TCP 連接里,服務(wù)器收到了客戶端 A 和 B 的兩個請求,如果發(fā)現(xiàn) A 處理過程非常耗時,于是就回應(yīng) A 請求已經(jīng)處理好的部分,接著回應(yīng) B 請求,完成后,再回應(yīng) A 請求剩下的部分。
5. 服務(wù)器推送
HTTP/2 還在一定程度上改善了傳統(tǒng)的「請求 - 應(yīng)答」工作模式,服務(wù)不再是被動地響應(yīng),也可以主動向客戶端發(fā)送消息。
舉例來說,在瀏覽器剛請求 HTML 的時候,就提前把可能會用到的 JS、CSS 文件等靜態(tài)資源主動發(fā)給客戶端,減少延時的等待,也就是服務(wù)器推送(Server Push,也叫 Cache Push)。
HTTP/2 有哪些缺陷?HTTP/3 做了哪些優(yōu)化?
HTTP/2 主要的問題在于:多個 HTTP 請求在復(fù)用一個 TCP 連接,下層的 TCP 協(xié)議是不知道有多少個 HTTP 請求的。
所以一旦發(fā)生了丟包現(xiàn)象,就會觸發(fā) TCP 的重傳機制,這樣在一個 TCP 連接中的所有的 HTTP 請求都必須等待這個丟了的包被重傳回來。
HTTP/1.1 中的管道( pipeline)傳輸中如果有一個請求阻塞了,那么隊列后請求也統(tǒng)統(tǒng)被阻塞住了
HTTP/2 多請求復(fù)用一個TCP連接,一旦發(fā)生丟包,就會阻塞住所有的 HTTP 請求。
這都是基于 TCP 傳輸層的問題,所以 HTTP/3 把 HTTP 下層的 TCP 協(xié)議改成了 UDP!
UDP 發(fā)生是不管順序,也不管丟包的,所以不會出現(xiàn) HTTP/1.1 的隊頭阻塞 和 HTTP/2 的一個丟包全部重傳問題。
大家都知道 UDP 是不可靠傳輸?shù)?,但基?UDP 的 QUIC 協(xié)議 可以實現(xiàn)類似 TCP 的可靠性傳輸。
QUIC 有自己的一套機制可以保證傳輸?shù)目煽啃缘?。?dāng)某個流發(fā)生丟包時,只會阻塞這個流,其他流不會受到影響。
TL3 升級成了最新的
1.3
版本,頭部壓縮算法也升級成了QPack
。HTTPS 要建立一個連接,要花費 6 次交互,先是建立三次握手,然后是
TLS/1.3
的三次握手。QUIC 直接把以往的 TCP 和TLS/1.3
的 6 次交互合并成了 3 次,減少了交互次數(shù)。
所以, QUIC 是一個在 UDP 之上的偽 TCP + TLS + HTTP/2 的多路復(fù)用的協(xié)議。
QUIC 是新協(xié)議,對于很多網(wǎng)絡(luò)設(shè)備,根本不知道什么是 QUIC,只會當(dāng)做 UDP,這樣會出現(xiàn)新的問題。所以 HTTP/3 現(xiàn)在普及的進度非常的緩慢,不知道未來 UDP 是否能夠逆襲 TCP。
參考文獻:
[1] 上野 宣.圖解HTTP.人民郵電出版社.
[2] 羅劍鋒.透視HTTP協(xié)議.極客時間.
[3] 陳皓.HTTP的前世今.酷殼CoolShell.
https://coolshell.cn/articles/19840.html
[4] 阮一峰.HTTP 協(xié)議入門.阮一峰的網(wǎng)絡(luò)日志.
http://www.ruanyifeng.com/blog/2016/08/http.html
嘮叨
接近 30
張圖片,都是從一條線兩條線畫出來,灰常的費勁,深切感受到畫圖也是個體力活啊!
愛偷懶的我其實不愛畫圖,但為了讓大家能更好的理解,在跟自己無數(shù)次斗爭后,踏上了耗時耗體力的畫圖的不歸路,希望對你們有幫助!
創(chuàng)造不易啊,畫圖也不易,不想被白嫖哦,各位「三連」走起就是對小林創(chuàng)造的最大支持和動力了,我們下次見!
免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺僅提供信息存儲服務(wù)。文章僅代表作者個人觀點,不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!