TCP連線的坑總結

FreeeLinux發表於2017-01-31

一. 關於半關閉和CLOSE_WAIT

客戶端主動關閉,傳送FIN包。服務端收到FIN,發出ACK,停留在CLOSE_WAIT狀態。這個狀態持續時間非常長,伺服器如果積攢大量的CLOSE_WAIT狀態socket,有可能耗盡資源。為什麼會產生這樣情況?有可能sockfd通過fork被子程式複製了一份,這樣該sockfd引用計數為2。在關閉socket時使用close()函式並沒有關掉該fd,僅僅是引用計數減1,所以服務端沒有向客戶端傳送FIN,這樣就造成了socket處於CLOSE_WAIT狀態。解決的辦法是:使用shutdown()函式。關於shutdown()函式用法參見:linux網路程式設計之shutdown() 與 close()函式詳解

二. 關於FIN_WAIT2狀態

FIN_WAIT2

三. 關於TIME_WAIT狀態

這裡寫圖片描述
這裡寫圖片描述

相關文章