三次握手和四次揮手
(1). 三次握手(我要和你建立連結,你真的要和我建立連結麼,我真的要和你建立連結,成功):
第一次握手:Client将标志位SYN置為1,随機産生一個值seq=J,并将該資料包發送給Server,Client進入SYN_SENT狀态,等待Server确認。
第二次握手:Server收到資料包後由标志位SYN=1知道Client請求建立連接配接,Server将标志位SYN和ACK都置為1,ack=J+1,随機産生一個值seq=K,并将該資料包發送給Client以确認連接配接請求,Server進入SYN_RCVD狀态。
第三次握手:Client收到确認後,檢查ack是否為J+1,ACK是否為1,如果正确則将标志位ACK置為1,ack=K+1,并将該資料包發送給Server,Server檢查ack是否為K+1,ACK是否為1,如果正确則連接配接建立成功,Client和Server進入ESTABLISHED狀态,完成三次握手,随後Client與Server之間可以開始傳輸資料了。
**注:**前兩次握手SYN位位1,不允許攜帶資料,第三次握手SYN位0,可以攜帶資料。
(2). 四次揮手(我要和你斷開連結;好的,斷吧。我也要和你斷開連結;好的,斷吧):
第一次揮手:Client發送一個FIN,用來關閉Client到Server的資料傳送,Client進入FIN_WAIT_1狀态。
第二次揮手:Server收到FIN後,發送一個ACK給Client,确認序号為收到序号+1(與SYN相同,一個FIN占用一個序号),Server進入CLOSE_WAIT狀态。此時TCP連結處于半關閉狀态,即用戶端已經沒有要發送的資料了,但服務端若發送資料,則用戶端仍要接收。
第三次揮手:Server發送一個FIN,用來關閉Server到Client的資料傳送,Server進入LAST_ACK狀态。
第四次揮手:Client收到FIN後,Client進入TIME_WAIT狀态,接着發送一個ACK給Server,确認序号為收到序号+1,Server進入CLOSED狀态,完成四次揮手。
CLOSE-WAIT 狀态問題:
用戶端發送了 FIN 連接配接釋放封包之後,伺服器收到了這個封包,就進入了 CLOSE-WAIT 狀态。這個狀态是為了讓伺服器端發送還未傳送完畢的資料,傳送完畢之後,伺服器會發送FIN 連接配接釋放封包。
TIME-WAIT 狀态問題
用戶端接收到伺服器端的 FIN 封包後進入此狀态,此時并不是直接進入 CLOSED 狀态,還需要等待一個時間計時器設定的時間 2MSL。這麼做有兩個理由:
- 確定最後一個确認封包能夠到達。如果 B 沒收到 A 發送來的确認封包,那麼就會重新發送連接配接釋放請求封包,A 等待一段時間就是為了處理這種情況的發生。
- 等待一段時間是為了讓本連接配接持續時間内所産生的所有封包都從網絡中消失,使得下一 個新的連接配接不會出現舊的連接配接請求封包。
通信雙方建立TCP連接配接後,主動關閉連接配接的一方就會進入TIME_WAIT狀态。
TCP為什麼不能兩次握手? 不是三次揮手?
不是兩次握手:
為了實作可靠資料傳輸(有序,完整,無差錯), TCP 協定的通信雙方, 都必須維護一個序列号, 以辨別發送出去的資料包中, 哪些是已經被對方收到的。 三次握手的過程即是通信雙方互相告知序列号起始值, 并确認對方已經收到了序列号起始值的必經步驟
為什麼不是三次揮手的原因:
與握手的情況相似,即發送方A發出的第一個釋放請求封包并沒有丢失,而是在某些網絡結點長時間滞留,以緻延誤到下次TCP連接配接的某個時間才到接收端B,本來這是一個早已失效的封包段,但接收到後誤認為是發送方A請求釋放連接配接,如果沒有最後一次發送方發送确認封包,那麼接收方就會在結束目前發送的封包後立即斷開連接配接,那麼就會影響目前的TCP連接配接

上圖的seq是下圖的序号,ACK是下圖中的确認号,而不是真正的ACKbit位。