1、首先呢,客戶端先向服務端傳送加密通訊(https)請求,這次請求中包括:
SSL/TSL版本號
加密套件,也就是客戶端支援的加密演算法列表
產生一個隨機數,我們叫他為第1隨機數
有一個Client Hello字串
2、伺服器收到請求後,向客戶端發出響應:
確認SSL/TSL版本號,如果客戶端不支援,那麼就關閉通訊
確認的加密演算法列表
生成一個隨機數,我們叫第2隨機數
3、伺服器再向客戶端傳送數字證書,這裡敲重點了。伺服器會把自己的公鑰註冊到CA(第三方證書機構),然後CA拿自己的私鑰對伺服器的公鑰進行處理並頒發數字證書。
4、伺服器將公鑰傳送給客戶端
5、伺服器傳送Hello Done,表示傳送完畢
6、客戶端收到服務端一系列響應後,確認數字證書和公鑰,沒有問題後向服務端傳送:
生成一個隨機數,我們叫第3隨機數或者預主金鑰,此預主金鑰會透過公鑰進行加密
客戶端握手結束通知,表示客戶端的握手結束
7、服務端收到客戶端資料後,使用私鑰對加密後的預主金鑰進行解密,沒有其他人知道預主金鑰,因為它加密了,除非伺服器私鑰洩漏。然後服務端透過第一、二、預主金鑰計算出會話金鑰。客戶端也計算出了會話金鑰。
8、服務端向客戶端傳送:
加密通訊演算法改變通知,以後透過會話金鑰通訊
服務端握手結束
到此為止,SSL/TSL握手結束,在此之後都會透過會話金鑰來進行加密和解密,也就是對稱加密。
三、補充
1、在http/1.1中加入了TCP長連線通訊,每當建立起連結後,只要任意埠沒有明確提出斷開連結,TCP就會保持連結狀態,大大減少了頻繁建立連結的開銷。
2、在http/2中,相對於http/1.1改進了一些內容:
頭部壓縮。http/2中會壓縮頭,如果客戶端傳送多個請求,頭是相似或者相同,那麼協議會消除重複的部分,減免了不必要的浪費。
http/1.1中報文是文字格式,在http/2中報文是二進位制格式,大大加快了傳輸效率。
http2中使用了多路複用,解決了隊頭堵塞問題。什麼是隊頭堵塞?在http/1.1中,隊頭堵塞指的是在TCP請求時,請求因為某種原因被阻塞,那麼後面的請求無法繼續進行(因為TCP是可靠連結,順序執行)。多路複用是多個http複用一個TCP連結,那麼多路複用後,請求和響應不再是按照順序一一對應。如果一個請求被堵塞,其他請求可以繼續。
3、http/2最佳化了http/1.1,但是也存在一些問題,就像上面說的,沒有完美的事情。http/3對2進行了一些最佳化:
在多路複用時是複用一個TCP連結,那麼TCP一旦傳送丟包,那麼就會阻塞所以複用它的http,這就麻煩了,這裡也是因為TCP是可靠傳輸,順序要一一對應。所以http/3直接將TCP改為UDP,但是UDP是不可靠傳輸,所以也加入了基於UDP的QUIC協議,來實現類似TCP的了靠傳輸。
http/3將TCP三次握手和SSL/TSL三次握手直接合併成了三次握手,意思是將原來的6次合併成了3次,減少了連結次數。