天天看點

HTTPS的作用和過程,詳解為什麼要 三次握手 四次揮手HTTPS

HTTPS

由HTTP加上 TLS/SSL 協定建構的可進行加密傳輸、身份認證的網絡協定,主要通過數字證書、加密算法、非對稱密鑰等技術完成網際網路資料傳輸加密,實作網際網路傳輸安全保護。

SSL證書是數字證書的一種,因為配置在伺服器上也稱為伺服器SSL證書,遵守SSL協定,由受信任的數字證書頒發機構CA在驗證伺服器身份後,頒發的一種數字證書。

使用者通過HTTP協定通路網站時,浏覽器和伺服器之間是明文傳輸。伺服器安裝SSL後,使用HTTPS加密協定通路網站,可激活用戶端浏覽器到網站伺服器間的“SSL”加密信道。

用戶端發送Client Hello包含以下資訊

SSL/TSL version:1.2(協定版本)

Cipher Suites:(支援的加解密算法族)

Random:(用戶端生産随機數random_client)

Session ID:(如果之前建立過https且伺服器傳回SID,則發送時會有值)

Extension:(擴充資料 如:service name:www.baidu.com)

服務端響應Server Hello

Random:服務端生産的随機數random_server

Session ID: 分為三種情況

1、恢複Session ID:如果client hello 裡面的Session ID在服務端有緩存,伺服器端會嘗試恢複這個session。

2、建立Session ID:如果client hello 裡面的Session ID是空值,或者client hello 裡面的Session ID沒有對應得緩存,此時伺服器就會建立一個Session ID給用戶端。

3、null:伺服器端不希望session被恢複,是以session ID 為空。

Cipher Suite:(在Client Hello裡面,用戶端給出了多個加解密族,服務端挑其中選一個)

Server Certificate:服務端證書

HTTPS的作用和過程,詳解為什麼要 三次握手 四次揮手HTTPS

源端口和目的端口,各占2個位元組,分别寫入源端口和目的端口;

序号,占4個位元組,TCP連接配接中傳送的位元組流中的每個位元組都按順序編号。例如,一段封包的序号字段值是 301 ,而攜帶的資料共有100字段,顯然下一個封包段(如果還有的話)的資料序号應該從401開始;

确認号,占4個位元組,是期望收到對方下一個封包的第一個資料位元組的序号。例如,B收到了A發送過來的封包,其序列号字段是501,而資料長度是200位元組,這表明B正确的收到了A發送的到序号700為止的資料。是以,B期望收到A的下一個資料序号是701,于是B在發送給A的确認封包段中把确認号置為701;

資料偏移,占4位,它指出TCP封包的資料距離TCP封包段的起始處有多遠;

保留,占6位,保留今後使用,但目前應都位0;

緊急URG,當URG=1,表明緊急指針字段有效。告訴系統此封包段中有緊急資料;

确認ACK,僅當ACK=1時,确認号字段才有效。TCP規定,在連接配接建立後所有封包的傳輸都必須把ACK置1;

推送PSH,當兩個應用程序進行互動式通信時,有時在一端的應用程序希望在鍵入一個指令後立即就能收到對方的響應,這時候就将PSH=1;

複位RST,當RST=1,表明TCP連接配接中出現嚴重差錯,必須釋放連接配接,然後再重建立立連接配接;

同步SYN,在連接配接建立時用來同步序号。當SYN=1,ACK=0,表明是連接配接請求封包,若同意連接配接,則響應封包中應該使SYN=1,ACK=1;

終止FIN,用來釋放連接配接。當FIN=1,表明此封包的發送方的資料已經發送完畢,并且要求釋放;

視窗,占2位元組,指的是通知接收方,發送本封包你需要有多大的空間來接受;

檢驗和,占2位元組,校驗首部和資料這兩部分;

緊急指針,占2位元組,指出本封包段中的緊急資料的位元組數;

選項,長度可變,定義一些其他的可選的參數。

三次握手(TCP的建立)

HTTPS的作用和過程,詳解為什麼要 三次握手 四次揮手HTTPS

用戶端發封包:SYN=1,seq=x;

伺服器回應封包:SYN=1,ACK=1,seq=y,ack=x+1;

用戶端回應封包:ACK=1,,seq=x+1,ack=y+1;

1、TCP伺服器程序先建立傳輸控制塊TCB,時刻準備接受客戶程序的連接配接請求,此時伺服器就進入了LISTEN(監聽)狀态;

2、TCP客戶程序也是先建立傳輸控制塊TCB,然後向伺服器發出連接配接請求封包,這是封包首部中的同部位SYN=1,同時選擇一個初始序列号 seq=x ,此時,TCP用戶端程序進入了 SYN-SENT(同步已發送狀态)狀态。TCP規定,SYN封包段(SYN=1的封包段)不能攜帶資料,但需要消耗掉一個序号。

3、TCP伺服器收到請求封包後,如果同意連接配接,則發出确認封包。确認封包中應該 ACK=1,SYN=1,确認号是ack=x+1,同時也要為自己初始化一個序列号 seq=y,此時,TCP伺服器程序進入了SYN-RCVD(同步收到)狀态。這個封包也不能攜帶資料,但是同樣要消耗一個序号。

4、TCP客戶程序收到确認後,還要向伺服器給出确認。确認封包的ACK=1,ack=y+1,自己的序列号seq=x+1,此時,TCP連接配接建立,用戶端進入ESTABLISHED(已建立連接配接)狀态。TCP規定,ACK封包段可以攜帶資料,但是如果不攜帶資料則不消耗序号。

5、當伺服器收到用戶端的确認後也進入ESTABLISHED狀态,此後雙方就可以開始通信了。

為什麼TCP用戶端最後還要發送一次确認呢?

主要防止已經失效的連接配接請求封包突然又傳送到了伺服器,進而産生錯誤。

如果使用的是兩次握手建立連接配接,假設有這樣一種場景,用戶端發送了第一個請求連接配接并且沒有丢失,隻是因為在網絡結點中滞留的時間太長了,由于TCP的用戶端遲遲沒有收到确認封包,以為伺服器沒有收到,此時重新向伺服器發送這條封包,此後用戶端和伺服器經過兩次握手完成連接配接,傳輸資料,然後關閉連接配接。此時此前滞留的那一次請求連接配接,網絡通暢了到達了伺服器,這個封包本該是失效的,但是,兩次握手的機制将會讓用戶端和伺服器再次建立連接配接,這将導緻不必要的錯誤和資源的浪費。

如果采用的是三次握手,就算是那一次失效的封包傳送過來了,服務端接受到了那條失效封包并且回複了确認封包,但是用戶端不會再次發出确認。由于伺服器收不到确認,就知道用戶端并沒有請求連接配接。

四次揮手(TCP的釋放)

HTTPS的作用和過程,詳解為什麼要 三次握手 四次揮手HTTPS

用戶端發送封包:FIN=1,seq=a;

伺服器響應封包:ACK=1,seq=b,ack=a+1;

伺服器發送封包:FIN=1,ACK=1,seq=c,ack=a+1;

用戶端響應封包:ACK=1,seq=a+1,ack=c+1

1、用戶端程序發出連接配接釋放封包,并且停止發送資料。釋放資料封包首部,FIN=1,其序列号為seq=u(等于前面已經傳送過來的資料的最後一個位元組的序号加1),此時,用戶端進入FIN-WAIT-1(終止等待1)狀态。 TCP規定,FIN封包段即使不攜帶資料,也要消耗一個序号。

2、伺服器收到連接配接釋放封包,發出确認封包,ACK=1,ack=u+1,并且帶上自己的序列号seq=v,此時,服務端就進入了CLOSE-WAIT(關閉等待)狀态。TCP伺服器通知高層的應用程序,用戶端向伺服器的方向就釋放了,這時候處于半關閉狀态,即用戶端已經沒有資料要發送了,但是伺服器若發送資料,用戶端依然要接受。這個狀态還要持續一段時間,也就是整個CLOSE-WAIT狀态持續的時間。

3、用戶端收到伺服器的确認請求後,此時,用戶端就進入FIN-WAIT-2(終止等待2)狀态,等待伺服器發送連接配接釋放封包(在這之前還需要接受伺服器發送的最後的資料)。

4、伺服器将最後的資料發送完畢後,就向用戶端發送連接配接釋放封包,FIN=1,ack=u+1,由于在半關閉狀态,伺服器很可能又發送了一些資料,假定此時的序列号為seq=w,此時,伺服器就進入了LAST-ACK(最後确認)狀态,等待用戶端的确認。

5、用戶端收到伺服器的連接配接釋放封包後,必須發出确認,ACK=1,ack=w+1,而自己的序列号是seq=u+1,此時,用戶端就進入了TIME-WAIT(時間等待)狀态。注意此時TCP連接配接還沒有釋放,必須經過2∗*∗MSL(最長封包段壽命)的時間後,當用戶端撤銷相應的TCB後,才進入CLOSED狀态。

6、伺服器隻要收到了用戶端發出的确認,立即進入CLOSED狀态。同樣,撤銷TCB後,就結束了這次的TCP連接配接。可以看到,伺服器結束TCP連接配接的時間要比用戶端早一些。

為什麼用戶端最後還要等待2MSL?

MSL(Maximum Segment Lifetime),TCP允許不同的實作可以設定不同的MSL值。

第一,保證用戶端發送的最後一個ACK封包能夠到達伺服器,因為這個ACK封包可能丢失,站在伺服器的角度看來,我已經發送了FIN+ACK封包請求斷開了,用戶端還沒有給我回應,應該是我發送的請求斷開封包它沒有收到,于是伺服器又會重新發送一次,而用戶端就能在這個2MSL時間段内收到這個重傳的封包,接着給出回應封包,并且會重新開機2MSL計時器。

第二,防止類似與“三次握手”中提到了的“已經失效的連接配接請求封包段”出現在本連接配接中。用戶端發送完最後一個确認封包後,在這個2MSL時間中,就可以使本連接配接持續的時間内所産生的所有封包段都從網絡中消失。這樣新的連接配接中不會出現舊連接配接的請求封包。

為什麼建立連接配接是三次握手,關閉連接配接确是四次揮手呢?

建立連接配接的時候, 伺服器在LISTEN狀态下,收到建立連接配接請求的SYN封包後,把ACK和SYN放在一個封包裡發送給用戶端。

而關閉連接配接時,伺服器收到對方的FIN封包時,僅僅表示對方不再發送資料了但是還能接收資料,而自己也未必全部資料都發送給對方了,是以己方可以立即關閉,也可以發送一些資料給對方後,再發送FIN封包給對方來表示同意現在關閉連接配接,是以,己方ACK和FIN一般都會分開發送,進而導緻多了一次。

如果已經建立了連接配接,但是用戶端突然出現故障了怎麼辦?

TCP還設有一個保活計時器,顯然,用戶端如果出現故障,伺服器不能一直等下去,白白浪費資源。伺服器每收到一次用戶端的請求後都會重新複位這個計時器,時間通常是設定為2小時,若兩小時還沒有收到用戶端的任何資料,伺服器就會發送一個探測封包段,以後每隔75秒發送一次。若一連發送10個探測封包仍然沒反應,伺服器就認為用戶端出了故障,接着就關閉連接配接。

繼續閱讀