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

2021-07-28 07:13:59 字數 1119 閱讀 3005

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

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

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

1.client -> fin  -> server   

2.client

3.client

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

server 程式處於close_wait狀態,而不是last_ack狀態,說明還沒有發fin給client,那麼可能是在關閉連線之前還有許多資料要傳送或者其他事要做, 

導致沒有發這個fin packet。 

通常來說,乙個close_wait會維持至少2個小時的時間(這個時間外網伺服器通常會做調整,要不然太危險了)。 

如果有個流氓特地寫了個程式,給你造成一堆的close_wait,消耗你的資源,那麼通常是等不到釋放那一刻,系統就已經解決崩潰了。 

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

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

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

c** 

int nret = recv(s,....); 

if (nret == socket_error) 

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

我的理解,當主動關閉的一方傳送fin到被動關閉這邊後,被動關閉這邊的 tcp馬上回應乙個ack過去,同時向上面應用程式提交乙個error, 

導致上面的socket的send或者recv返回socket_error,正常情況下,如果上面在返回socket_error後呼叫了 closesocket,那麼被動關閉的者一方的tcp就會傳送乙個fin過去,自己的狀態就變遷到last_ack.

tcp狀態變遷

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

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

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

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

CLOSE WAIT狀態的生成原因

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