TCP 三次握手和四次揮手(使用Wireshark進行抓包檢視)
首先介紹一些專業術語的意思:
Source Port:源埠,16位。
Destination Port:目的埠,16位。
Acknowledgment Number:確認序列號,32位。
Sequence Number:傳送資料包中的第一個位元組的序列號,32位。
ACK:表示Acknowledgment Number欄位有意義
SYN:表示SYN報文(在建立TCP連線的時候使用)
FIN:表示沒有資料需要傳送了(在關閉TCP連線的時候使用)
三次握手的過程:
(1)第一次握手:建立連線,客戶端傳送SYN報文(SYN = 0,seq=0)給伺服器端,進入SYN_SEND狀態。
SYN為0,表示SYN被置位,是有效的。
seq(Sequence Number)就是傳送的資料包中第一個位元組的序列號。它是一個相對值。也就是說”基礎值+傳送的內容的位元組數”
與“基礎值”的一個差值。由於第一次握手的時候,是不能進行資料傳輸的,傳送的位元組數是0,因此seq也就是0。
(2)第二次握手:伺服器端收到客戶端發來的SYN報文
這個y是隨機產生的。seq(Sequence Number)就是傳送的資料包中第一個位元組的序列號。
ACK,確認序號,它的值是收到的序列號+1,表示ACK之前的所有報文我都已經收到了。
(3)第三次握手:客戶端收到伺服器端的SYN報文,檢查確認序號(ACK)是否正確,即第一次客戶端向伺服器傳送的序號seq+1、
迴應一個ACK(ACK=y+1)報文,進入Established狀態。
三次握手完成,TCP客戶端和伺服器端成功地建立連線,可以開始傳輸資料了。
注意 :
(1)如果接收到的ACK是有值的,那麼傳送的SYN就等於ACK的值 。
(2)序列號是一個相對值。在三次握手的時候是不允許進行資料傳遞的,因此len是為0,ACK確認序號的值=seq+1。
但是如果當三次握手以後,開始傳遞資料的時候,確認序號的值 = seq + len。確認序號的意義就是告訴對方,這個確認序號之前的所有報文我都接受到了,保證TCP協議的穩定可靠的傳輸。
四次揮手:當建立了TCP連線以後,資料傳送完畢後,要斷開TCP連線,這個時候就有了四次揮手。
(1)第一次揮手:
客戶端向伺服器傳送FIN報文,用來關閉客戶端到伺服器的傳送。此時客戶端進入FIN_WAIT_1狀態。
(2)第二次揮手:
伺服器收到客戶端傳送過來的FIN報文,它會返回一個ACK給客戶端,確認序號 = 接收到的序號+1,伺服器進入CLOSE_WAIT狀態。
(3)第三次揮手:
伺服器傳送一個FIN報文給客戶端,用來關閉伺服器到客戶端的資料傳送。伺服器進入LAST_ACK狀態
(4)第四次揮手:
客戶端收到伺服器傳送過來的FIN報文之後,像伺服器端傳送確認序號(=收到的序號+1)。此時客戶端進入CLOSED狀態。完成四次揮手。