圖解TCP/IP三次握手和四次揮手!

文章來源:王琦的個人博客 ,互聯網打雜,喜歡多語言編程,記錄一些知識碎片,分享一些心得。

TCP的三次握手四次和四次揮手

總結一下TCP三次握手和四次揮手以及中間的11種狀態的轉換

11種狀態

客戶端:SYN_SEND、FIN_WAIT1、FIN_WAIT2、CLOSING、TIME_WAIT。
服務端:LISTEN、SYN_RCVD、CLOSE_WAIT、LAST_ACK。
CLOSED、ESTABLISHED

TCP報文結構

Sequence Number(序號)
在傳輸的過程中對數據進行切分,再接收端,依靠sequence Number進行分段重組。
Acknowledgement Number(確認號)

控制字段

  • ack:表示確認控制字段,TCP通過確認應答(ACK)實現數據可靠連接。
    主機A發送數據給主機B的時候,假設發送了1G的數據過去,作爲主機B可以接收到這個數據,主機A如何確認主機B接收到這個數據了,可以讓主機B給主機A回覆一個確認信息,在確認信息裏他的數據報文的控制字段ack就會起作用,就表示上一個信息已經接收了,回覆確認,實現了可靠連接建立
  • syn:表示請求建立連接字段
  • fin:表示請求斷開連接字段。

說明:控制字段信息默認爲0,控制字段功能不起作用。控制字段置爲1,表示相應控制字段開啓

三次握手

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-rcsB2LrG-1591289403532)(/img/tcp/three-way-handshake.jpg)]

整個三次握手的過程中涉及到了控制字段的SYN,ACK以及Seq(序列號)的設置,還有確認號Ack。
1、首先是Closed狀態,最開始服務端和客戶端都處於關閉狀態,在關閉狀態時作爲主動建立連接方的客戶端開始第一次握手①(對應上圖序號)發出SYN控制字段,和序列號seq然後從Closed狀態變爲SYN_SEND
2、服務端會從Closed變爲Listen狀態(這個時候會創建一個Socket),開始進行第二次握手②,服務端在Listen狀態接收到了客戶端的SYN字段,服務端會返回一個ACK確認字段和跟客戶端請求建立連接的字段SYN,同時也會發送Seq和確認號Ack,這個時候服務端狀態變爲SYN_RCVD
3、客戶端在SYN_SEND狀態接收到了服務端發送的SYN,ACK,就會進入到ESTABLISHED狀態,並且在進入連接狀態之前會再次給服務端回覆ACK,也就是三次握手③的第三次過程。
4、服務端在SYN_RCVD的狀態接收到了客戶端發送的ACK之後也會變成ESTABLISHED

四次揮手過程

在這裏插入圖片描述

  1. 客戶端先發送FIN 斷開請求也就是第一次揮手①,此時客戶端進入到FIN_WAIT_1狀態。
  2. 服務端接收到客戶端請求後會回覆一個帶有ACK確認字段的請求第二次揮手②,此時服務端進入CLOSE_WAIT狀態。
  3. 客戶端接收到服務端回覆的請求後會從FIN_WAIT_1進入到FIN_WAIT_2
  4. 服務端所處的的CLOSE_WAIT狀態會再次發送請求,此時是第三次揮手③,此時請求是一個帶有FIN的斷開連接的請求,然後進入到LAST_ACK也就是最後確認的狀態。
  5. 客戶端在FIN_WAIT_2的狀態接收到服務端的斷開請求後會回覆ACK的請求此時是第四次揮手④,隨後進入TIME_WAIT。服務端在LAST_ACK狀態接收到收到客戶端發來的ACK後進入CLOSED狀態。
  6. 服務端已經斷開連接,客戶端還在處於一個特殊的狀態TIME_WAIT,在這個狀態會等待2MSL的時間,這個時間一般是15-30秒,最後會自動變爲CLOSED狀態。

有一種特殊的狀態,CLOSING狀態。在四次揮手中有可能發生異常。也就是在第二次揮手中②,如果ACK確認信息沒有正常發送到客戶端,客戶端沒有收到ACK確認信息,收到了第三次揮手的信息③,FIN ACK斷開連接的信息,此時客戶端會由FIN_WAIT_1進入到CLOSING,然後把ACK的信息發出。

爲什麼握手是三次,揮手是四次呢,唯一的區別就是在第二次傳輸的過程中有所不同,在三次握手中,傳輸的是SYN 和ACK是同時發生的,四次揮手是先進行ACK確認,然後在發送FIN和ACK。

TCP三次握手和四次揮手過程中是在OSI七層模型中的傳輸層完成的,這個傳輸層並不是控制層,真正的控制層是在上三層應用層,也就是在這個層次上,相應的連接或者斷開的信息並不是由傳輸層完成的,而是由應用層,接收到應用層指令後纔會發送斷開連接的信息。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章