TCP連線過程及狀態變化

2021-09-03 07:04:59 字數 1874 閱讀 2443

狀態狀態描述

closed

表示初始狀態。對服務端和客戶端雙方都一樣。

listen

表示監聽狀態。服務端呼叫了listen函式,可以開始accept連線了。

syn_sent

表示客戶端已經傳送了syn報文。當客戶端呼叫connect函式發起連線時,首先發syn給服務端,然後自己進入syn_sent狀態,並等待服務端傳送ack+syn。

syn_rcvd

表示服務端收到客戶端傳送syn報文。服務端收到這個報文後,進入syn_rcvd狀態,然後傳送ack+syn給客戶端。

established

表示連線已經建立成功了。服務端傳送完ack+syn後進入該狀態,客戶端收到ack後也進入該狀態。

fin_wait_1

表示主動關閉連線。無論哪方呼叫close函式傳送fin報文都會進入這個這個狀態。

fin_wait_2

表示被動關閉方同意關閉連線。主動關閉連線方收到被動關閉方返回的ack後,會進入該狀態。

time_wait

表示收到對方的fin報文並傳送了ack報文,就等2msl後即可回到closed狀態了。如果fin_wait_1狀態下,收到對方同時帶fin標誌和ack標誌的報文時,可以直接進入time_wait狀態,而無須經過fin_wait_2狀態。

closing

表示雙方同時關閉連線。如果雙方幾乎同時呼叫close函式,那麼會出現雙方同時傳送fin報文的情況,此時就會出現closing狀態,表示雙方都在關閉連線。

close_wait

表示被動關閉方等待關閉。當收到對方呼叫close函式傳送的fin報文時,回應對方ack報文,此時進入close_wait狀態。等待本地使用者的連線終止請求。

last_ack

表示被動關閉方傳送fin報文後,等待對方的ack報文狀態,當收到ack後進入closed狀態。

msl是maximum segment lifetime英文的縮寫,中文可以譯為「報文最大生存時間」,他是任何報文在網路上存在的最長時間,超過這個時間報文將被丟棄。因為tcp報文(segment)是ip資料報(datagram)的資料部分,具體稱謂請參見《資料在網路各層中的稱呼》一文,而ip頭中有乙個ttl域,ttl是time to live的縮寫,中文可以譯為「生存時間」,這個生存時間是由源主機設定初始值但不是存的具體時間,而是儲存了乙個ip資料報可以經過的最大路由數,每經過乙個處理他的路由器此值就減1,當此值為0則資料報將被丟棄,同時傳送icmp報文通知源主機。rfc 793中規定msl為2分鐘,實際應用中常用的是30秒,1分鐘和2分鐘等。

2msl即兩倍的msl,tcp的time_wait狀態也稱為2msl等待狀態,處理原則是:當tcp執行乙個主動關閉,並發回最後乙個ack後,該連線必須在time_wait狀態停留的時間為2msl。等待2msl時間主要目的是怕最後乙個ack包對方沒收到,那麼對方在超時後將重發第三次揮手的fin包,主動關閉端接到重發的fin包後可以再發乙個ack應答包。當連線處於2msl等待階段時任何遲到的報文段都將被丟棄。在time_wait狀態時兩端的埠不能使用,要等到2msl時間結束才可繼續使用。不過在實際應用中可以通過設定so_reuseaddr選項達到不必等待2msl時間結束再使用此埠。 但是我們將看到tcp原則上扔將避免使用仍處於2msl連線中的埠。

ttl與msl是有關係的但不是簡單的相等的關係,msl要大於等於ttl。

TCP連線過程

1 建立連線協議 三次握手 1 客戶端傳送乙個帶syn標誌的tcp報文到伺服器。這是三次握手過程中的報文1.2 伺服器端回應客戶端的,這是三次握手中的第2個報文,這個報文同時帶ack標誌和syn標誌。因此它表示對剛才客戶端syn報文的回應 同時又標誌syn給客戶端,詢問客戶端是否準備好進行資料通訊。...

TCP連線解釋及連線過程描述

1.tcp連線的建立 設主機b執行乙個伺服器程序,它先發出乙個被動開啟命令,告訴它的tcp要準備接收客戶程序的連續請求,然後服務程序就處於聽的狀態。不斷檢測是否有客戶程序發起連續請求,如有,作出響應。設客戶程序執行在主機a中,他先向自己的tcp發出主動開啟的命令,表明要向某個ip位址的某個埠建立運輸...

TCP連線過程及報文解析

可能大家都聽過tcp建立連線時需要經歷三次握手和四次揮手的。那麼具體的握手揮手的過程是怎麼樣的呢?這篇文章就通過wireshark抓包來了解tcp連線建立和斷開的過程。實驗方法 寫一段簡單的 客戶端和服務端,分別部署,讓客戶端主動像伺服器發起連線,隨後斷開。讓wireshark抓股這個過程中產生了哪...