三次握手四次揮手理解

三次握手與四次揮手

所謂三次握手(Three-way Handshake),是指創建一個 TCP 鏈接時,須要客戶端和服務器總共發送3個包。編程

三次握手的目的是鏈接服務器指定端口,創建 TCP 鏈接,並同步鏈接雙方的序列號和確認號,交換 TCP 窗口大小信息。在 socket 編程中,客戶端執行 connect() 時。將觸發三次握手。服務器

  • 第一次握手(SYN=1, seq=x):socket

    客戶端發送一個 TCP 的 SYN 標誌位置1的包,指明客戶端打算鏈接的服務器的端口,以及初始序號 X,保存在包頭的序列號(Sequence Number)字段裏。3d

    發送完畢後,客戶端進入 SYN_SEND 狀態。code

  • 第二次握手(SYN=1, ACK=1, seq=y, ACKnum=x+1):blog

    服務器發回確認包(ACK)應答。即 SYN 標誌位和 ACK 標誌位均爲1。服務器端選擇本身 ISN 序列號,放到 Seq 域裏,同時將確認序號(Acknowledgement Number)設置爲客戶的 ISN 加1,即X+1。 發送完畢後,服務器端進入 SYN_RCVD 狀態。three

  • 第三次握手(ACK=1,ACKnum=y+1)生命週期

    客戶端再次發送確認包(ACK),SYN 標誌位爲0,ACK 標誌位爲1,而且把服務器發來 ACK 的序號字段+1,放在肯定字段中發送給對方,而且在數據段放寫ISN的+1同步

    發送完畢後,客戶端進入 ESTABLISHED 狀態,當服務器端接收到這個包時,也進入 ESTABLISHED 狀態,TCP 握手結束。服務器端

三次握手的過程的示意圖以下:

three-way-handshake

 

 

通俗易懂: 1. A-->B 我要找你

      2. B-->A  我知道了 ,我準備好了,我在XXX;

      3. A-->B  收到  我來了

 

 

TCP 的鏈接的拆除須要發送四個包,所以稱爲四次揮手(Four-way handshake),也叫作改進的三次握手。客戶端或服務器都可主動發起揮手動做,在 socket 編程中,任何一方執行 close() 操做便可產生揮手操做。

  • 第一次揮手(FIN=1,seq=x)

    假設客戶端想要關閉鏈接,客戶端發送一個 FIN 標誌位置爲1的包,表示本身已經沒有數據能夠發送了,可是仍然能夠接受數據。

    發送完畢後,客戶端進入 FIN_WAIT_1 狀態。

  • 第二次揮手(ACK=1,ACKnum=x+1)

    服務器端確認客戶端的 FIN 包,發送一個確認包,代表本身接受到了客戶端關閉鏈接的請求,但尚未準備好關閉鏈接。

    發送完畢後,服務器端進入 CLOSE_WAIT 狀態,客戶端接收到這個確認包以後,進入 FIN_WAIT_2 狀態,等待服務器端關閉鏈接。

  • 第三次揮手(FIN=1,seq=y)

    服務器端準備好關閉鏈接時,向客戶端發送結束鏈接請求,FIN 置爲1。

    發送完畢後,服務器端進入 LAST_ACK 狀態,等待來自客戶端的最後一個ACK。

  • 第四次揮手(ACK=1,ACKnum=y+1)

    客戶端接收到來自服務器端的關閉請求,發送一個確認包,並進入 TIME_WAIT狀態,等待可能出現的要求重傳的 ACK 包。

    服務器端接收到這個確認包以後,關閉鏈接,進入 CLOSED 狀態。

    客戶端等待了某個固定時間(兩個最大段生命週期,2MSL,2 Maximum Segment Lifetime)以後,沒有收到服務器端的 ACK ,認爲服務器端已經正常關閉鏈接,因而本身也關閉鏈接,進入 CLOSED 狀態。

四次揮手的示意圖以下:

four-way-handshake

 

 

通俗易懂: 1. A-->B 我沒東西給你了

      2. B-->A  我知道了 

      3. B-->A  我也沒東西給你了   

      4. A-->B  我知道了 

相關文章
相關標籤/搜索