淺談https和http2
最近被問到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