1. 程式人生 > >TCP建立連線和斷開連線流程

TCP建立連線和斷開連線流程

一、基本描述

TCP協議為提供面向連線的服務,需要先建立連線,然後才可以通訊,通訊結束時,需要斷開連線。

二、建立連線流程

建立連線的過程也叫做三次握手,流程如下:

這裡寫圖片描述

1、首先,一定是由客戶端發起連線請求,服務端來接收連線請求。客戶端發起連線請求後,會先給服務端傳送一個SYN包。

2、服務端收到SYN包,會回覆SYN的ACK,同時再回復SYN,但SYN和ACK是一起傳送的。

客戶端收到了SYN+ACK包,完成了客戶端到服務端單向連線的建立,然後給服務端回覆ACK包。

3、服務端收到客戶端發來的ACK包,完成了服務端到客戶端單向連線的建立。

說明:

 SYN包會報告TCP需要用到的一些引數。
 伺服器在收到SYN後,會將連線放入SyncQueue裡(Linux預設2048)。
 伺服器在收到ACK後,會將連線放入AcceptQueue裡(Linux最大128,應用層可以傳入backlog,兩者的較小值為AcceptQueue的最大長度)。     

三、斷開連線流程

斷開連線的過程也叫四次揮手,流程如下:

這裡寫圖片描述

1、斷開連線時,發起方可以是客戶端也可以是服務端。發起方會先發送一個FIN包,就進入FIN_WAIT_1狀態,此時就不能傳送使用者資料,等待響應方回覆ACK。

2、響應方收到FIN包後,就給發起方回覆ACK。此時,響應方進入CLOSE_WAIT狀態,因為響應方還有待發送的資料,需要等待發送完畢,才能關閉連線(發起方在傳送FIN前,會保證已經發送完資料)。

3、發起方收到ACK後,就進入FIN_WAIT_2。此時還能繼續接收資料,直到收到響應方的FIN。

4、響應方等資料傳送完畢後,就給發起方傳送FIN包。

5、發起方收到響應方的FIN包後,就進入TIME_WAIT狀態。

6、響應方收到ACK後,就進入CLOSED狀態,完成了斷開流程。

7、發起方的TIME_WAIT狀態會持續2MSL(最大報文生存時間)。然後,進入到CLOSED。

四、為何建立連線是三次握手,而斷開連線需要四次揮手?

1、下圖是TCP協議頭的結構:

這裡寫圖片描述
裡面有專門的位來標記SYN包,FIN包,ACK序號是否有效。

2、三次握手時的SYN和ACK,是可以通過一個TCP包來發送的。

3、四次揮手時為何沒有將SYN和ACK一起傳送,是因為響應方還有待發送的資料,需要等資料傳送完成才能傳送SYN包。

五、為何需要TIME_WAIT狀態?

1、一個重要的原因是在發起方傳送了ACK後,不能保證響應方一定能收到ACK。響應方在傳送FIN後,就等待發起方的ACK,在等待一段時間後,如果沒有收到ACK,就會重發FIN包。發起方在TIME_WAIT的時間內(等待ACK的時間+重發FIN最大需要2MSL),如果又收到了響應方的FIN包,就會再發ACK包。