TCP建立連線和斷開連線流程
阿新 • • 發佈:2019-01-07
一、基本描述
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序號是否有效。