CLOSE_WAIT:
出现的原因:客户端异常断开,服务器没有捕捉到异常,从而没有使用close()关闭socket(调用close后就不再是CLOSE_WAIT状态)。
总的来说,就是服务器没有调用或没有及时调用close();
出现大量CLOSE_WAIT会导致:
大量socket的fd被占用,这个是有上限的,超过了就不能接受新的连接了。
TIME_WAIT:
TIME_WAIT一般出现在服务器主动要求关闭连接或服务器需要重启,TIME_WAIT状态时会导致端口不能复用,解决这个问题也很简单,把socket设置成SO_REUSEADDR就可以了(服务器主动关闭连接产生的TIME_WAIT不用理会,因为服务器不创建socket,只是接受请求而已,也就没有复用端口之说。服务器创建的唯一socket就是用于监听的那个,当重启后才需要复用这个端口)
参考:
https://www.zhihu.com/question/298214130