TCP三次握手 四次揮手及其狀態分析

2021-06-26 16:29:48 字數 2475 閱讀 2884

前面close_wait狀態分析與time_wait狀態分析其實都是tcp斷開連線過程中的兩個狀態.本文繼續介紹下tcp連線三次握手,四次揮手的過程及其中間的狀態

三次握手原理:

第一次握手:客戶端傳送syn包(syn=j)到伺服器,等待伺服器確認.

第二次握手:伺服器收到syn包,必須確認(ack=j+1),同時自己傳送乙個syn包(syn=k),即syn+ack包.

第三次握手:客戶端收到伺服器的syn+ack包,向伺服器傳送確認包(ack=k+1).

圖示:clinet -----          syn(j)         ----- server  

server -----  ack(j+1) syn(k) ----- clinet

clinet -----         ack(k+1)     ----- server

客戶端傳送syn包,進入syn_send狀態,伺服器收到sync包,進入syn_recv狀態.

客戶端收到伺服器端的syn+ack包進入established狀態.

伺服器端收到客戶機端的ack包,進入established狀態.

簡單的說:

客戶端問伺服器:你允許我和你建立連線麼?

伺服器端說:可以,那你也允許我和你建立連線麼?

客戶端說:可以.

於是,他們之間就建立起連線了.

四次分手原理:

由於tcp連線是全雙工的,因此每個方向都必須單獨進行關閉.這個原則是當一方完成它的資料傳送任務後就能傳送乙個fin來終止這個方向的連線.收到乙個 fin只意味著這一方向上沒有資料流動,乙個tcp連線在收到乙個fin後仍能傳送資料.首先進行關閉的一方將執行主動關閉,而另一方執行被動關閉.

(1)客戶端a傳送乙個fin,用來關閉客戶a到伺服器b的資料傳送.

(2)伺服器b收到這個fin,它發回乙個ack,確認序號為收到的序號加1.

(3)伺服器b關閉與客戶端a的連線,傳送乙個fin給客戶端a.

(4)客戶端a發回ack報文確認,並將確認序號設定為收到序號加1.

圖示:clinet  ---   fin  --- server

server ---   ack  --- clinet 

server ---   fin  --- clinet 

clinet  ---   ack --- server

客戶端主動關閉連線,傳送fin包,進入fin_wait_1狀態.接收端收到fin包,進入close_wait狀態.

客戶端收到伺服器的ack包,進入fin_wait_2狀態.

伺服器傳送fin包,進入last_ack狀態.客戶端接收到fin包,進入time_wait狀態

伺服器收到ack包,進入closed狀態.

簡單的說:

客戶端問伺服器:我們斷開連線吧?

伺服器端說:可以,我將不再接收你的資料.

伺服器端問伺服器:我將要跟你斷開連線了,可以吧?

客戶端說:可以.

客戶端說:可以.

於是,他們之間的連線就斷開了.

tcp連線正常建立和終止過程及對應狀態如圖:

這裡有個連線同時開啟的問題,跟前面文章中說的五元組問題一樣,很難出現,但如果指定本地和對方兩端的埠號還是能製造出這樣的情況.

兩端都是在syn_sent狀態下收到對方的syn包而進入syn_rcvd狀態,然後都會傳送syn+ack包,當兩端都會收到該包時,狀態會變成established.

圖示:clinet  ---        syn     --- server       server  ---      syn       --- clinet 

server ---   syn+ack  --- clinet       clinet   ---   syn+ack  --- server  

tcp連線同時建立過程及對應狀態如圖:

繼續說下closing狀態,當兩端幾乎同時關閉連線時,兩端都是在fin_wait_1狀態下收到對方的fin包,會進入closing狀態.然後都會傳送最後的ack包.當兩端都會收到該包時,狀態會變成time_wait.

圖示:clinet  ---   fin  --- server       server   ---   fin  --- clinet 

server ---   ack  --- clinet       clinet   ---   ack  --- server  

tcp連線同時關閉過程及對應狀態如圖:

還有個問題:為什麼建立連線協議是三次握手,而關閉連線卻是四次握手呢?

這是因為服務端的listen狀態下的socket當收到syn報文的建連請求後,它可以把ack和syn(ack起應答作用,而syn起同步作用)放在乙個報文裡來傳送.但關閉連線時,當收到對方的fin報文通知時,它僅僅表示對方沒有資料傳送給你了.但未必你所有的資料都全部傳送給對方了,所以你可以未必會馬上會關閉socket,也即你可能還需要傳送一些資料給對方之後,再傳送fin報文給對方來表示你同意現在可以關閉連線了,所以它這裡的ack報文和fin報文多數情況下都是分開傳送的.

tcp包頭 三次握手 四次揮手 狀態

要了解三次握手和四次揮手,首先需要了解下tcp資料報頭的結構,如下 在利用tcp實現源主機和目的主機通訊時,目的主機必須同意,否則tcp連線無法建立。為了確保tcp連線的成功建立,tcp採用了一種稱為三次握手的方式,三次握手方式使得 序號 確認號 系統能夠正常工作,從而使它們的序號達成同步。如果三次...

TCP三次握手 四次揮手

tcp 三次握手 tcp 連線是通過三次握手進行初始化的。三次握手的目的是同步連線雙方的序列號和確認號並交換 tcp 視窗大小資訊。以下步驟概述了通常情況下客戶端計算機聯絡伺服器計算機的過程 1.客戶端向伺服器傳送乙個syn置位的tcp報文,其中包含連線的初始序列號x和乙個視窗大小 表示客戶端上用來...

TCP三次握手 四次揮手

服務端的tcp程序先建立傳輸控制塊tcb,準備接受客戶端程序的連線請求,然後服務端程序處於listen狀態,等待客戶端的連線請求,如有,則作出響應。1 客戶端的tcp程序也首先建立傳輸控制模組tcb,然後向服務端發出連線請求報文段,該報文段首部中的syn 1,ack 0,同時選擇乙個初始序號seq ...