1. 程式人生 > >Https,Http,TCP,IP的一些理解

Https,Http,TCP,IP的一些理解

網路模型分為7層,應用層,表現層,會話層,傳輸層,網路層,鏈路層,物理層,每一層有很多不同的協議。

http:屬於應用層的協議,負責的是資料以什麼結構傳輸也可以說成是打包成什麼樣子

SSL/TLS:屬於應用程協議,同樣是負責資料打包成什麼樣子(主要側重於資料加密,TLS 算是SSL的後續版本所以通常放在一起說)

tcp:屬於傳輸層,負責的是傳輸的通道建立

ip:並沒有這麼一個協議,通常說的ip說的是IPv4,IPv6,屬於網路層,負責定址

https:並不是某個單獨的協議,(全稱Http on TLS)其實是2個協議的組合應用

這裡說到每一層其實都還有其他協議,例如傳輸層還有udp,應用層還有ssh等

 

這裡有一個概念需要了解,資料在網路上傳輸並不是直接到達接收方的。而是經過了很多次的跳轉以後才能達到。這個過程叫做路由。

這裡由於這裡經過了很多中間過程。就存在資料在某個中間過程點上被劫持。

為了保證中間過程沒有被劫持資料沒有被篡改,就引入了互相驗證的過程,通常採用雙向不對稱加密的方式來驗證,演算法通常為RSA。

基於RSA這種加密演算法發展出了,SSH,SSL/TLS這兩種協議,SSH和SSL/TLS的協議驗證的方式,個人認為的主要區別就是SSL/TLS更通用。因為他引入了CA這麼個機構。

具體的驗證方式也就是比SSH多了最開始先驗證“證書是否是CA頒發的合法證書”的這個流程。

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

傳送方任何一個請求從發出到接收方接收到,都是經歷了網路的7層的流程。每一層都按照對應協議包裝,當然最後都是通過物理層(網線,電纜,光纖)到達伺服器。

傳送方打包:

具體資料>應用層>表現層>會話層>傳輸層>網路層>鏈路層>物理層

接收方解包:

物理層>鏈路層>網路層>傳輸層>會話層>表現層>應用層>具體資料

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

TCP負責建立通道:

這裡所謂的建立通道指的是客戶端和伺服器已經做好了接受對方資料的準備,所以這裡是一個所謂的概念上的通道(這裡要明確,建立通道的資料傳輸依然是要經過上述的的7層包裝傳遞的)。

這段是從百度百科上的說明:

應用層向TCP層傳送用於網間傳輸的、用8位位元組表示的資料流,然後TCP把資料流分割槽成適當長度的報文段(通常受該計算機連線的網路的資料鏈路層的最大傳輸單元( 1MTU)的限制)。之後TCP把結果包傳給IP層,由它來通過網路將包傳送給接收端實體的TCP層。TCP為了保證不發生丟包,就給每個包一個序號,同時序號也保證了傳送到接收端實體的包的按序接收。然後接收端實體對已成功收到的包發回一個相應的確認(ACK);如果傳送端實體在合理的往返時延(RTT)內未收到確認,那麼對應的資料包就被假設為已丟失將會被進行重傳。TCP用一個校驗和函式來檢驗資料是否有錯誤;在傳送和接收時都要計算校驗和。

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

我們通常說的http的3次握手,其實指的是tcp的3次握手。也就是這個過程基於tcp協議實現的。

我們的http資料傳送是基於通道建立已經成功的基礎上。所以必須先通過一個握手的過程來建立通道。

握手的過程(傳輸層按tcp協議打包):

1.客戶端發syn包:應用層向傳輸層傳送資料流,這個資料流裡面包含內容為:一個SYN標識和一個數字,

2.接收方確認:接收方收到這個包解析以後看到SYN標識就知道了客戶端是要建立連線。這時就會把客戶端發過來的這個數字加1,然後帶上一個自己的數字,傳送返回包給客戶端。

3.客戶端確認接收方並準備以及接收方確認客戶端已準備:客戶端收到返回的包以後看到自己發過去的數字已經被加了1,說明伺服器以接到自己請求,這個時候把伺服器發過來的數字也加1,發包給伺服器並且自己做好準備。

4.伺服器看到自己返回的數字也加了1,說明客戶端也已經準備好了,此時自己也做好準備。

握手完成(這個過程發了3次包所以被稱為3次握手)。

這裡伺服器為什麼不實在第2步就做好準備的原因是因為伺服器資源有限。必須要客戶端做好準備以後再準備,不然很有可能自己做好了準備,客戶端那邊沒接到自己的響應導致沒有做好準備

 

揮手的過程(傳輸層按tcp協議打包):

與握手過程相似只不過包內的標識為fin,並且伺服器向客戶端傳送的時候ack和fin是分為開為2步傳送(上面的百科說明tcp協議是支援資料打成多個包的)。至於為什麼要分兩步發,因為通道時雙向通訊的,很有可呢客戶端提出關閉的時候伺服器這邊還有資料沒傳送完,所以先返回一個ack告訴客戶端已經收到,資料傳送完以後再告訴客戶端已經發完了可以關閉了。

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

通道建立以後。

接下來傳輸資料。傳資料的時候我們根據輸入的url來分辨是用http還是用https。如果用的是https。 這個時候就牽涉到SSH,SSL/TLS了。

在使用http協議組織資料之前。要先保證剛才建立的通道是否是安全的,一旦確定了通道安全,就可以開始傳遞加密的資料了,這時候再來劫持就已經晚了。劫持到也解密不出來。

所以只要保證協商加密的這個步驟安全就行。所以這裡就在傳輸資料之前協商加密的時候,加入了證書認證的這個過程。

證書認證的底層邏輯就是雙向不對稱加密,公鑰可以很多,私鑰只有一個。私鑰可以解密所有公鑰加密的內容,所有公鑰都可以解密私鑰加密的內容。但是公鑰之間不能互相解密。

這裡認證的這個行為就是公鑰解密私鑰的過程並比較解密以後是否正確的過程。正確則說明內容是由私鑰加密的。

這裡具體的說一下:證書的內容包含如釋出者名稱之類的一些資訊,加上一個用摘要演算法(MD5)對這些內容算出來的摘要,然後用私鑰對這個摘要加密生成的結果,這個結果就是簽名。

完整的證書驗證行為就是先用公鑰對這個簽名解密,然後對證書上公開的其餘資訊同樣用摘要演算法(MD5)算摘要。如果算出來的摘要和公鑰解密之後的摘要相同則說明是正確的。

這也就是SSH的過程,然後中間再加上了CA簽名的話就是SSL/TLS了。

這裡CA又牽涉到一個分級的問題。這裡就要牽涉到一個證書鏈。因為CA是分級的。CA機構有很多,但是最頂層的CA只有固定的幾個。通常證書都是由下級的CA頒發的。而下級CA頒發的證書裡面其實是包含上一級CA的資訊的。最低階的CA頒發的證書解開以後會包含上一級CA的資訊,這裡又可以繼續解析上一層CA的資訊。解析過程相同(公鑰解密,確認摘要),然後一直解析到最頂層。也就是說客戶端這邊要儲存每一級的CA的公鑰以及最終的頂級CA的公鑰。否則任何一級驗證失敗了就解析不下去了。只有當解析到最後才能確定這個證書確實是頂頂級CA頒發的。當這些步驟完成了以後,才輪到解析伺服器的簽名也就是。

(頂級CA的證書被稱為Root Certificate,下級CA的證書被稱為InterMediate Certificate,終端使用者的被稱為End User Certificate)

所以SSL/TLS是先解析CA的證書通過證書鏈,CA的驗證通過。 在進行伺服器本身的驗證。所以SSH,SSL/TLS其實原理是一樣的。

這裡除了驗證的過程。

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

在證書傳遞的過程裡面其實還有協商加密方式,協商壓縮方式,以及協商金鑰,這個金鑰是真正資料傳送時使用對稱加密的金鑰。

這個完整的過程叫做TLS握手,具體流程是

客戶端傳送請求包裡面含有支援的 SessionId(如果有),SSL/TLS版本,壓縮方式,加密元件。以及一個隨機數字A。

伺服器挑選一種壓縮方式,加密套件,附帶上證書並且也產生一個隨機數字以後傳送返回包給客戶端,這裡產生的這個隨機數為B。

客戶端驗證證書,驗證通過以後,根據前面傳輸的所有內容,產生第三個數字PreMaster,然後用A,B,PreMaster三個引數算出資料傳輸對稱加密的金鑰trasnKey。然後發包給伺服器告訴伺服器這邊驗證好了,我們的通道是安全的,可以開始資料傳輸了。伺服器這個時候根據之前傳輸的內容也可以算出同樣的trasnKey,然後雙方就可以開始以trasnKey互相傳輸資料。

TLS握手完成。

在然後就是http 的傳輸了。