首頁 > 軟體

TCP 三次握手與四次揮手

2020-06-16 16:27:39

TCP是什麼

TCP(Transmission Control Protocol 傳輸控制協定)是一種面向連線(連線導向)的、可靠的、 基於IP的傳輸層協定。

TCP有6種標示:SYN(建立聯機) ACK(確認) PSH(傳送) FIN(結束) RST(重置) URG(緊急)

TCP的三次握手

第一次握手:用戶端向伺服器傳送請求報文,這時報文首部中的同部位SYN=1,並生成一個隨機序列值seq=n。用戶端進入syn-sent(同步已傳送)狀態,等待伺服器確認

第二次握手:TCP伺服器收到請求報文後,如果同意連線,則發出確認報文。確認報文中應該 ACK=1,SYN=1,確認號ACK=n+1,同時自己也隨機生成一個seq=m,此時伺服器進入SYN-RCVD(同步收到)狀態。

第三次握手:TCP用戶端進程收到確認後,還要向伺服器給出確認。確認報文的ACK=1,ack=m+1,

TCP的三次握手抓包

使用nc -l localhost 8088 監聽8088埠

用戶端使用nc -v localhost 8088 連線8088埠

再開個終端使用 tcpdump -i lo -vv -nnn tcp port 8088 抓包8088 埠tcp連線

抓包資料

為什麼需要三次握手

埠 client傳送了一個請求連線的報文,但是網路不好,這個請求沒有立即達到伺服器端,用戶端沒有收到伺服器的確認訊息後,任務該請求報文已失效了,但是過了一會之後server收到報文,還是會像client傳送確認的報文,表示同意連線。如果這裡不用三次握手,那麼只要server發出確認報文,新的連線就

建立了,但其實這個請求client已經任務失效了,不會理睬server的確認資訊,也不會像伺服器發出確認的請求,但是server的請求已經建立了,並一直等待client的資料,這樣會浪費server的資源,採用三次握手就是為了防止這種情況的發生,server會因為收不到確認的報文,而不會建立連線。

舉個列子:就好比找工作的時候,你通過手機問面試官,我能去面試嗎,面試官說可以,你收到面試官的確認,然後你在確認面試時間,那就可以愉快的去面試了。

四次揮手

第一次揮手:TCP client傳送一個FIN ,用來關閉到伺服器端的連線,client進入FIN_WAIT_1狀態

client進程發出連線釋放報文,並且停止傳送資料。釋放報文首部,FIN=1,其序列號為seq=x

第二次揮手:TCP server 收到FIN 後,傳送一個ACK 確認,server進入CLOSE_WAIT狀態,用戶端收到ACK後會進入FIN_WAIT_2狀態

這時候處於半關閉狀態,即用戶端已經沒有資料要傳送了,但是伺服器若傳送資料,用戶端依然要接受

第三次揮手:TCP server 傳送一個FIN,用來關閉server到client的連線,server進入LAST_ACK狀態。

伺服器將最後的資料傳送完畢

第四次揮手:TCP client收到FIN後,client進入TIME_WAIT狀態,接著傳送一個ACK給server,server進入CLOSED狀態

TCP連線還沒有釋放,必須經過2∗∗MSL(最長報文段壽命)的時間後,當用戶端復原相應的TCB後,才進入CLOSED狀態

四次揮手抓包

開個終端使用 tcpdump  -vv -nnn tcp port 80 埠tcp連線

再另一個終端裡面使用curl www.baidu.com

抓包資料

為什麼需要四次揮手

終端為了確保資料能夠完全輸出,關閉連線時,當收到主動方的FIN報文通知時,它僅僅表示主動方是沒有資料需要傳送了,但是被動方可能還需要傳送資料,所以不會馬上關閉SOCKET。於是被動方只傳送ACK確認報文,繼續傳送一些資料給主動方,然後再傳送FIN報文,此時就可以關閉連線了

一次網頁存取的抓包


IT145.com E-mail:sddin#qq.com