TIME WAIT狀態詳細分析

2021-09-30 07:34:34 字數 2732 閱讀 3337

對於tcp

通訊中關閉連線時需要的四次握手,最值得一說的就是

time_wait

狀態。

在閱讀相關資料和實踐的基礎上,我對這個狀態的總結是

1.

僅在主動關閉一段產生;

2.

設定so_reuseaddr選項需要在bind之前進行。

以下分別從客戶端和伺服器端來分析。

從客戶端的角度來看。如果採用的是長連線,那麼根本就不會有

close

的行為;如果採用的是短連線,那麼重新

connect

時會臨時分配隨機埠,不會與之前處於

time_wait

埠衝突。

舉例說明,在伺服器端開

10000

的埠號,觀察不同階段的

socket

狀態。伺服器和客戶端部署在同一臺機器上,以下部分以

local

代替實際的終端輸出

"localhost.localdomain"

伺服器啟動完畢後 :

local:10000 *:* listen

乙個客戶端例項連線成功後 :

local:10000 *:* listen  

local:10000 local:45358 established 

local:45358 local:10000 established

該客戶端例項關閉成功後

:  local:10000 *:* listen      

local:45358 local:10000 time_wait  //

伺服器端進入

close

狀態後已成功關閉

客戶端例項再次連線成功後

:  local:10000 *:* listen      

local:10000 local:45359 established

local:45358 local:10000 time_wait  //

這個連線仍在存在

local:45359 local:10000 established

可見,原有的

45358

埠的time_wait

不影響45359

埠連線例項的建立。

從負面影響來看,客戶端的

time_wait

會占用客戶端的

fd,處於

time_wait

狀態的fd

過多,以至於超出系統的

limit

限制,會導致無法再建立新的連線。

從伺服器端角度來看。如果伺服器主動關閉,情況就有些複雜。

伺服器啟動完畢後

: local:10000 *:* listen

乙個客戶端例項連線成功後

:  local:10000 *:* listen      

local:10000 local:45360 established 

local:45360 local:10000 established

伺服器關閉後 :

local:45360 local:10000 time_wait   //

客戶端進入

close

狀態後已成功關閉

伺服器再次啟動 :

unable to bind address:address already in use

由於伺服器的啟動並不是繫結臨時埠,而是仍要建立在固定的

10000

埠上,此時

10000

埠處於

time_wait

的狀態。到時

bind

無法正常進行。

解決該問題就需要

so_reuseaddr

引數,而該引數的設定很顯然要在

bind

之前。so_reuseaddr

官方解釋是:允許啟動乙個監聽伺服器並**其眾所周知埠,即使以前建立的將該埠用作他們的本地埠的連線仍存在。設定該引數後。

伺服器再次啟動 :

local:10000 *:* listen      

local:10000 local:45360 time_wait  //10000

埠被復用

乙個客戶端例項連線成功後 :

local:10000 *:* listen     

local:10000 local:45360 time_wait

local:45361 local:10000 established

local:10000 local:45361 established

time_wait

的值與系統實現相關。在我的機器上測試為

60s。那麼啟動時間小於

60s的服務示例都要面臨這個埠占用不能重啟的問題。

so_reuseaddr

其他用途如可以允許同時啟動多個

ip(ip別名)

的伺服器繫結在相同的埠上。但這也帶來一些安全問題,惡意的伺服器可以繫結同樣的埠,截獲部分請求。

unix

網路程式設計》第一卷

const詳細分析

最近在分析 linux 驅動的過程過程中遇到一些關於 const 的使用,現在在這裡詳細剖析一下 一,const int p 首先分析一下幾個概念 1 p 是乙個指標變數,因而它也是乙個變數,所謂變數就有變數的位址和變數的值,而這裡 p變數的值就是乙個位址,該位址下存放的是乙個整數,p的值等於這個整...

約數詳細分析

約數詳細分析 我們先來認識一下約數 約數分正約數和負約數兩種,我們一般只討論正約數。也就是說,接下來所提的約數,只考慮正約數。如果有乙個數k,滿足k n,那麼k就是n 的約數 因數 n是k的倍數。求乙個數的約數是資訊學競賽裡乙個基礎的不能再基礎的問題。如果只求乙個數,最容易想到的就是列舉。當然列舉也...

vue cli 詳細分析

vue lic 是 vue 官方提供的腳手架工具,預設搭建好乙個專案的基本架子,我們只需要在此基礎上進行相應的修改即可。注意 安裝 vue cli 前需要事先配置好 node 環境 npm install g vue cli 如果是 mac 電 sudo表示以管理員的許可權 sudo install...