為什么是三次握手?
為了防止已經失效的連接請求報文段突然又傳到服務端,因而產生錯誤。
建立很多無效的連接,浪費資源
客戶端收到來自服務端的報文后,還需要再次發送確認報文來建立連接。

三次握手
第一次握手
Client將標志位SYN置1,隨機產生一個值seq=J,並將數據包發給Server
Client進入SYN_SENT狀態,等待Server確認
第二次握手
Server收到數據包后標志位SYN=1知道Client請求建立連接,Server將標志位SYN和ACK都置1,隨機產生一個值,並將數據包發給Client確認連接請求,Server進入SYN_RCVD狀態
第三次握手
Client收到確認后若ACK為1,則將該數據包發送給Server,Server檢查ACK為1則連接建立成功,Client與Server進入ESTABLISHED狀態完成三次握手,可以傳輸數據
第一次握手:
Client什么都不能確認
Server確認了對方發送正常
第二次握手:
Client確認:自己發送/接收正常,對方發送/接收正常
Server確認:自己接收正常 ,對方發送正常
第三次握手:
Client確認:自己發送/接收正常, 對方發送/接收正常
Server確認:自己發送/接收正常,對方發送/接收正常
四次揮手

第一次揮手:
Clien發送一個FIN,用來關閉Client到Server的數據傳送,Client進入FIN_WAIT_1狀態。
第二次揮手:
Server收到FIN后,發送一個ACK給Client,Server進入CLOSE_WAIT狀態。
第三次揮手:
Server發送一個FIN,用來關閉Server到Client的數據傳送,Server進入LAST_ACK狀態。
第四次揮手:
Client收到FIN后,Client進入TIME_WAIT狀態,發送ACK給Server,Server進入CLOSED狀態,完成四次握手。
建立連接
因為服務端在LISTEN狀態下,收到建立連接請求的SYN報文后,把ACK和SYN放在一個報文里發送給客戶端。
關閉連接
當收到對方的FIN報文時,僅表示對方不再發送數據但還能接收收據,我們也未必把全部數據都發給了對方,所以我們可以立即close,也可以發送一些數據給對方后,再發送FIN報文給對方表示同意關閉連接。因此我們的ACK和FIN一般會分開發送。
上面是一方主動關閉,另一方被動關閉的情況,實際中還會出現同時發起主動關閉的情況,具體流程如下圖
為什么需要TIME_WAIT狀態
1、可靠的終止TCP連接
2、保證讓遲來的TCP報文段有足夠的時間被識別並丟棄
參考資料:
https://blog.csdn.net/yu876876/article/details/81560122?ivk_sa=1024320u