文章來源:王琦的個人博客 ,互聯網打雜,喜歡多語言編程,記錄一些知識碎片,分享一些心得。
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,表示相應控制字段開啓
三次握手
整個三次握手的過程中涉及到了控制字段的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
。
四次揮手過程
- 客戶端先發送FIN 斷開請求也就是第一次揮手①,此時客戶端進入到
FIN_WAIT_1
狀態。 - 服務端接收到客戶端請求後會回覆一個帶有ACK確認字段的請求第二次揮手②,此時服務端進入
CLOSE_WAIT
狀態。 - 客戶端接收到服務端回覆的請求後會從
FIN_WAIT_1
進入到FIN_WAIT_2
。 - 服務端所處的的
CLOSE_WAIT
狀態會再次發送請求,此時是第三次揮手③,此時請求是一個帶有FIN的斷開連接的請求,然後進入到LAST_ACK
也就是最後確認的狀態。 - 客戶端在
FIN_WAIT_2
的狀態接收到服務端的斷開請求後會回覆ACK的請求此時是第四次揮手④,隨後進入TIME_WAIT
。服務端在LAST_ACK
狀態接收到收到客戶端發來的ACK後進入CLOSED
狀態。 - 服務端已經斷開連接,客戶端還在處於一個特殊的狀態
TIME_WAIT
,在這個狀態會等待2MSL的時間,這個時間一般是15-30秒,最後會自動變爲CLOSED
狀態。
有一種特殊的狀態,CLOSING
狀態。在四次揮手中有可能發生異常。也就是在第二次揮手中②,如果ACK確認信息沒有正常發送到客戶端,客戶端沒有收到ACK確認信息,收到了第三次揮手的信息③,FIN ACK斷開連接的信息,此時客戶端會由FIN_WAIT_1
進入到CLOSING
,然後把ACK的信息發出。
爲什麼握手是三次,揮手是四次呢,唯一的區別就是在第二次傳輸的過程中有所不同,在三次握手中,傳輸的是SYN 和ACK是同時發生的,四次揮手是先進行ACK確認,然後在發送FIN和ACK。
TCP三次握手和四次揮手過程中是在OSI七層模型中的傳輸層完成的,這個傳輸層並不是控制層,真正的控制層是在上三層應用層,也就是在這個層次上,相應的連接或者斷開的信息並不是由傳輸層完成的,而是由應用層,接收到應用層指令後纔會發送斷開連接的信息。