CLOSE_WAIT:当接收到Client的FIN(M),还未发送FIN(N),sever处于CLOSE_WAIT状态、
出现大量CLOSE_WAIT的场景:server未能正常发送FIN(N)。
server关闭连接通过close或者shutdown这两个系统调用来实现。
close的原理:内核检查socket上的引用计数器。如果大于1,则将这个计数器减1,然后直接返回。如果等于1,内核才会真正地关闭此socket连接(发送FIN到客户端来关闭连接)。
shutdown的原理:内核不会检查socket上的计数器,而是直接发送FIN到client关闭连接。
那么出现大量CLOSE_WAIT的场景:一个进程打开一个socket,然后fork出子进程,父进程打开的socket是会被子进程所继承,即子进程能够访问该socket。此时socket上的引用计数为 2。如果子进程调用close并退出,并不会关闭该连接,因为此时引用计数为1。如果父进程是负责监听连接的主进程,永远都不会关闭,那么close_wait就会越积越多,导致出现大量的close_wait。