一圖勝千言,先上圖:併發
TCP 進行握手初始化一個鏈接的目標是:分配資源、初始化序列號(通知 peer 對端個人初始序列號是多少)。整個握手過程能夠簡化爲下面的交互:spa
1)client 端首先發送一個 SYN 包告訴 Server 端個人初始序列號是 X;2)Server 端收到 SYN 包後回覆給 client 一個 ACK 確認包,告訴 client 說我收到了;3)接着 Server 端也須要告訴 client 端本身的初始序列號,因而 Server 也發送一個 SYN 包告訴 client 個人初始序列號是 Y;4)Client 收到後,回覆 Server 一個 ACK 確認包說我知道了。server
注意幾個問題:
1. Server 的 ACK 確認包和接下來的 SYN 包能夠合成一個 SYN ACK 包一塊兒發送的,不必分別單獨發送,這樣省了一次交互
2. 大部分狀況下創建鏈接須要三次握手,也不必定都是三次。有可能出現四次握手來創建鏈接的。以下圖,當 Peer 兩端同時發起 SYN 來創建鏈接的時候,就出現了四次握手來創建鏈接。
TCP 進行斷開鏈接的目標是:回收資源、終止數據傳輸。因爲 TCP 是全雙工的,須要 Peer 兩端分別各自拆除本身通向 Peer 對端的方向的通訊信道。這樣須要四次揮手來分別拆除通訊信道:資源
1)Client 發送一個 FIN 包來告訴 Server 我已經沒數據須要發給 Server 了;2)Server 收到後回覆一個 ACK 確認包說我知道了;3)而後 server 在本身也沒數據發送給 client 後,Server 也發送一個 FIN 包給 Client 告訴 Client 我也已經沒數據發給 client 了;4)Client 收到後,就會回覆一個 ACK 確認包說我知道了。get