一. 关于半关闭和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状态
三. 关于TIME_WAIT状态