對於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...