1. 程式人生 > 其它 >TCP建立連線的三次握手和釋放連線的四次揮手

TCP建立連線的三次握手和釋放連線的四次揮手

三次握手

為什麼要進行三次握手?

  1. 客戶端需要知道自己傳送的訊息服務端能夠收到
  2. 客戶端自己本身也能夠接收服務端傳送的訊息
  3. 服務端也需要知道自己傳送的訊息客戶端能夠收到
  4. 服務端本身也能夠接收客戶端傳送的訊息。

三次握手的作用?

1.確認客戶端和伺服器雙方的接收能力和傳送能力;
2.指定自己的初始化序列號為後面的可靠性傳輸做準備;
3.連線伺服器指定的埠,建立TCP連線,並同步連線雙方的序列號和確認號;

為何兩次握手不可以?

弄清這個問題,我們需要先弄明白三次握手的目的是什麼,能不能只用兩次握手來達到同樣的目的。
第一次握手:客戶端傳送網路包,服務端收到了。 這樣服務端就能得出結論:客戶端的傳送能力、服務端的接收能力是正常的。
第二次握手:服務端發包,客戶端收到了。 這樣客戶端就能得出結論:服務端的接收、傳送能力,客戶端的接收、傳送能力是正常的。不過此時伺服器並不能確認客戶端的接收能力是否正常。
第三次握手:客戶端發包,服務端收到了。 這樣服務端就能得出結論:客戶端的接收、傳送能力正常,伺服器自己的傳送、接收能力也正常。 因此,需要三次握手才能確認雙方的接收與傳送能力是否正常。


在說三次握手之前,先來了解TCP頭格式的幾個東西

序號:就是SEQ,SEQ是一個32位的數,第一次使用時會由計算機自動生成,往後的使用會不斷累加一
確認號:ack,ack是序號加一
SYN:一位,只有兩種表達方式,0/1,為1表示:需要請求建立連線
ACK:應答訊號,注意和小寫的ack不一樣,ACK只有一位,為1表示:收到了
FIN:請求斷開連線,只有一位,可以理解為finish(完成)的縮寫,為1表示:請求斷開連線
瞭解了TCP請求頭格式之後,下面看三次揮手

第一次握手

客戶端需要向服務端發起建立連線的請求
此時SYN=1,就好像:我需要和你建立連線了
SEQ=x,x是序號,第一次使用是隨機生成的,往後客戶端的SEQ都會在此基礎上加1,每傳送一次資訊就都會加一,是個累加的值
注意:此時客戶端只是傳送了請求,它並不知道服務端是否能收到

第二次握手

服務端收到了客戶端的請求,那麼他就需要告訴客戶端,我可以和你建立連線了
此時SYN=1,表示:我可以和你建立連線
ack是確認序號,要在客戶端的序號上加一
SEQ自動生成,之後服務端的SEQ都會在此基礎上加一,每傳送一次資訊就都會加一,是個累加的值
ACK是應答訊號,ACK=1表示:我收到了你的請求
注意:此時服務端已經收到了客戶端的資訊,但是他不能確認自己所傳送的資訊是否能夠被服務端接收,因此還需要第三次握手來解決這個問題

第三次握手

客戶端收到了服務端的請求,此時客戶端知道了一件事:我傳送的訊息服務端能夠接收了,同時我也能夠收到服務端的訊息
但是此時還不能建立連線,因為,服務端並不確認自己的訊息客戶端能否收到
所以:客戶端需要再發送一次訊息確認
ACK=1表示:我收到了你的訊息
SEQ=x+1,在之前的SEQ加一
ack=y+1,應答訊號,在服務端傳送的SEQ上加一
當服務端收到了客戶端的確認訊息之後,就相當於知道了:我可以收到客戶端的訊息,自己傳送的訊息客戶端也能夠接收

至此,三次握手的過程已經完成。
如果在第三次握手階段,服務端沒有收到客戶端傳送的確認訊息,是不會建立連線的,這就保證了連線的安全可靠性。

四次揮手

握手是用來建立連線的,那麼揮手就是用來斷開連線的,也稱為釋放連線,因為連線斷開後就將佔用空間釋放了
注意:釋放連線可以是由服務端傳送斷開連線請求,也可以是由客戶端傳送斷開請求,兩者是一樣的過程
下面以客戶端傳送斷開請求為例
釋放連線需滿足的四個條件:

客戶端需知道服務端可以斷開連線
服務端也需知道客戶端可以斷開連線
服務端確認本身可以斷開連線
客戶端確認本身可以斷開連線

四次揮手過程圖如下

第一次揮手

客戶端傳送斷開請求
FIN=1:表示我需要斷開請求
SEQ=x:從建立連線開始,累加到此刻的值,這裡使用x表示
注意:此時,客戶端確認了本身可以斷開連線,但是不能夠確認服務端是否可以斷開連線,滿足條件4

第二次揮手

服務端接收到客戶端的斷開請求,便傳送確認訊息
ACK=1,表示:我收到了你的訊息
ack=x+1,確認序號,為接收客戶端的序號加一
注意:此時,服務端已經能夠知道客戶端可以斷開連線了,但是他還不能確認本身能夠斷開連線,導致的原因:有正在接收的訊息服務端還未接收完成,滿足條件4、2

第三次揮手

服務端傳送可以斷開連線的請求
FIN=1,表示:我可以和你斷開連線了
SEQ=y,序號,從建立連線開始,累加到此刻的序號值
注意:此時,服務端確認客戶端能夠可以斷開連線,也確認了本身可以斷開連線;客戶端確認了本身可以斷開連線,但是無法確認服務端能夠斷開連線,滿足條件4、2、3,因此需要再次傳送確認訊號,就有了第四次揮手

第四次揮手

客戶端傳送確認訊息
ACK=1:表示:我收到了你的訊息,你可以斷開連線了
ack=y+1,為接收到服務端傳送的序號加一
注意:此刻,儘管客戶端已經滿足了斷開連線的條件,但客戶端不會立即斷開連線,而是會等待一段時間再斷開連線,目的是為了保證服務端能夠接收到確認訊息。當服務端收到了確認訊息之後,已經滿足了斷開的四個條件,他會立即斷開連線,而客戶端等待了一段時間之後也會斷開連線。如果服務端沒有收到確認訊息,他會再一次發起斷開連線請求,客戶端收到請求之後,會再次傳送確認訊息,同時重新整理等待時間,如果在等待時間內並沒有收到斷開請求,客戶端就斷開連線。

至此,四次揮手結束。