close wait狀態的產生原因及解決

2021-06-01 22:55:06 字數 966 閱讀 8119

最近需要上線的邏輯server由於需要與大量的後台server互動,今天突然發現有大量的close_wait產生,於是仔細研究了一下:

首先我們知道,如果我們的伺服器程式處於close_wait狀態的話,說明套接字是被動關閉的!

因為如果是client端主動斷掉當前連線的話,那麼雙方關閉這個tcp連線共需要四個packet:

client --

-> fin  --

-> server

client <

--- ack  <

--- server

這時候client端處於fin_wait_2狀態;而server 程式處於close_wait狀態。

client <

--- fin  <

--- server

這時server 傳送fin給client,server 就置為last_ack狀態。

client --

-> ack  --

-> server

client回應了ack,那麼server 的套接字才會真正置為closed狀態。

但是實際上,還是主要是因為我們的程式**有問題,通常是如下問題:

比如被動關閉的是客戶端。。。

當對方呼叫closesocket的時候,你的程式正在

intnret = recv(s,....);

if (nret == socket_error)

很多人就是忘記了那句closesocket,這種**太常見了。

我的理解,當主動關閉的一方傳送fin到被動關閉這邊後,被動關閉這邊的 tcp馬上回應乙個ack過去,同時向上面應用程式提交乙個error,導 致上面的socket的send或者recv返回socket_error,正常情況下,如果上面在返回socket_error後呼叫了 closesocket,那麼被動關閉的者一方的tcp就會傳送乙個fin過去,自己的狀態就變遷到last_ack.

[文章出處]

close wait狀態的產生原因及解決

最近測試環境server由於需要與大量的後台server互動,今天突然發現有大量的close wait產生,於是仔細研究了一下 如果我們的伺服器程式處於close wait狀態的話,說明套接字是被動關閉的!因為如果是client端主動斷掉當前連線的話,那麼雙方關閉這個tcp連線共需要四個packet...

close wait狀態的產生原因及解決

最近需要上線的邏輯server由於需要與大量的後台server互動,今天突然發現有大量的close wait產生,於是仔細研究了一下 首先我們知道,如果我們的伺服器程式處於close wait狀態的話,說明套接字是被動關閉的!因為如果是client端主動斷掉當前連線的話,那麼雙方關閉這個tcp連線共...

CLOSE WAIT狀態的生成原因

關閉socket分為主動關閉 active closure 和被動關閉 passive closure 兩種情況。前者是指有本地主機主動發起的關閉 而後者則是指本地主機檢測到遠端主機發起關閉之後,作出回應,從而關閉整個連線。其狀態圖如下圖所示 起初每個socket都是closed狀態,當客戶端初使化...