今天去面试,被问到关于TCP 的close_wait出现的原因和解决方案问题,这个问题被难到了,平时一直做应用开发,运维方面的知之甚少,但作为服务器端开发人员,这些应该都是要清楚的,毕竟掌握好了原理性的知识才能开发出性能更好的服务端应用.

TCP三次握手和四次挥手:(这里借用下其他网站的图片)

20120811114737950.jpg

上图已经和清晰地显示出了建立连接的三次握手和关闭连接的四次挥手的过程,三次握手就不说了,关于四次挥手中的close_wait状态:

1、只会出现在被动关闭端

2、状态一直停留在close_wait状态,而没有发送FIN信号并迁移到LAST_ACK状态,一般都是在收到主动关闭发起方的FIN信号后没有调用进程的close方法导致状态不迁移

解决方案:

1、当收到客户端关闭连接之后,主动关闭进程

2、设置keepAlive参数,默认是7200秒,windows不管,linux下设置如下三个参数:

/proc/sys/net/ipv4/tcp_keepalive_time当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时。

/proc/sys/net/ipv4/tcp_keepalive_intvl当探测没有确认时,重新发送探测的频度。缺省是75秒。

/proc/sys/net/ipv4/tcp_keepalive_probes在认定连接失效之前,发送多少个TCP的keepalive探测包。缺省值是9。这个值乘以tcp_keepalive_intvl之后决定了,一个连接发送了keepalive之后可以有多少时间没有回应。

(http://www.2cto.com/net/201208/147485.html)