1. 程式人生 > >淺談https和http2

淺談https和http2

利用 重新 stream 問題 完整 公開 鑰匙 一個 之前

最近被問到http2和https的相關知識,這是一篇補基礎的博客:

首先想說下https

什麽是https

就是說https在http下加入ssl層,加密的詳細內容需要ssl/tls(運行在應用層上)

https的連接時無狀態的,https協議由ssl+http協議構建的可進行加密傳送,身份認證的網絡安全協議

加密和解密算法是公開的,密鑰是保密的(通信雙方才能獲取到),對稱加密是加密和解密用的同一個密鑰

非對稱加密:

有一個叫做RSA的非對稱加密算法:

它不像之前的算法,雙方必須協商一個保密的密鑰,而是有一對鑰匙,一個是保密的,稱為私鑰,一個是公開的,稱為公鑰

??:

用私鑰加密的數據,只有對應的公鑰才能解密,用公鑰加密的數據,只有對應的私鑰才能解密

對稱加密和非對稱加密的比較:

- 前者較快,後者較安全

解決速度和安全問題:

1)生成一個對稱加密算法的密鑰,用rsa的方式安全發給你

2)隨後不用rsa,只用這個密鑰,利用對稱加密算法來通信

為了防止中間人竊取到了密鑰,需要引入一個權威的證書頒發機構(ca)來解決

http2的簡介:

有4個主要的新特性:

- 二進制分幀

- 頭部壓縮

- 服務端推送

- 多路復用

- 優化手段

首先說下:

二進制分幀

http2是一個徹底的二進制協議(二進制協議就是一串字節流,通常包括消息頭(header)和消息體(body),消息頭的長度固定,並且消息頭包括了消息體的長度。這樣就能夠從數據流中解析出一個完整的二進制數據。),http2的二進制協議被稱為二進制分幀,http2協議的格式稱為幀,類似tcp中的數據報文:

技術分享圖片

幀由Frame Header和Frame Payload組成

- Type字段用來表示該幀中的Frame Payloaded保存的是header數據還是body數據,除了用於標識header/body,還有一些額外的Frame Type

- Length字段用來表示Frame Payload數據大小

- Frame Payloaded用來保存header和body數據

多路復用:

在http的每個請求中都會建立一個tcp連接,意味著每個請求都要進行三次握手,這樣會浪費很多資源。瀏覽器會限制同一個域名下並發請求的個數,在http1中,一個常見的優化手段是把靜態資源分布到不同域名下,以此突破瀏覽器並發數的限制

在http2中,所有的請求可以公用一個Tcp連接

Stream Identifier 就是用來標識該幀屬於哪個請求的

當客戶端同時向服務器端發起多個請求,那麽這些請求會被分解成一個個幀,每個幀都會在tcp鏈路中無序的傳輸,同一個請求的幀的Stream Identifier都是一樣的,當幀到達服務器之後,可以根據Stream Identifier來重新組合得到完整的請求

頭部壓縮:

在http1中,每次請求都會懈怠header數據,這些信息在每次請求就形成了浪費,所有http2

提出了HPACK的壓縮方式,用於減少http header在每次請求中消耗的流量

HPACK的壓縮原理:

客戶端和服務器端共同維護一個靜態字典:

服務器端推送:

服務器主動向客戶端推送數據,一次獲取全部資源

淺談https和http2