如果在2台不同的公网机器,对TCP的c/s做过详细的压力测试,那么很不幸,会有很多人发现自己的server端会出现大量的假死连接。
假死连接具体表现如下:
1、在s端机器上,会有一些处于TCP_ESTABLISHED状态的“正常”连接;
2、但是在c端机器上,你的tcp客户端已经提示当前连接已经断开,比如10053/10054。
3、c端此时虽然可以断线重连s端,但是上一次的连接状态依然被s认为有效,并且得不到正确释放(例如IOCP构架中的套接字上下文及接收/发送缓冲区)。
这种情况虽然不常见,但是确实是存在的,具体造成的原因可以参考tcp/ip断开连接fin过程,如果你认为这种事情发生概率微不足道,不做任何处理的话,你的s长时间运行后,会面临大量假死连接得不到正常释放,然后服务器越来越慢,IO处理效率越来越低。
最常见诡异现象:采用IOCP的c/s构架中,明明c端closesocket了,但是s端的GCQS就是不会返回失败信息!
网上通常的解决方案:
1、对连接上的套接字做保活处理,即设置keeplive,此后如果在规定时间内无数据传输,那么tcp协议栈会自动发送keeplive探测包,以维护当前连接有效性。如果你在s端采用这个方案,那么很可惜,假死连接不会得到根本性的解决。常见现象:c端意外断电、网络异常终止、被第三方软件或防火墙干掉等。
2、c端定时发送用户层心跳包,s端针对每个已连接套接字记录最后一次收到心跳包的时间,同时开启线程定时检测:超过XX秒还未收到心跳包的套接字,kill掉,释放占用的上下文及收发缓冲区资源。
稳定的c/s构架可能不会用协议栈的keeplive(没办法100%干掉假死连接),但是一定会做用户层的心跳检测机制。
详细解决方案
关于TCP/IOCP构架中出现的Socket假死连接解决方案
热度:90 发布时间:2024-02-24 12:25:06.0
相关解决方案
- xml/xslt 变量自增。解决方案
- DB2 调用java自定义方法报错,请大牛帮忙~解决方案
- 一个JSP页面,在NETBEANS里报错!解决方案
- 急来者有分,晚了就没了!解决方案
- disable在IE8中可以接收焦点了?解决方案
- 求网页采集器的正则表达式。解决方案
- 关于FckEdit。解决方案
- servlet+jquery1.4.2(ajax error?)解决方案
- jsp、taglib、velocity、freemarker等都过时了吗?解决方案
- 有开发过CA认证的朋友,帮个忙!解决方案
- EXTJS中treepanel树内部机制?解决方案
- 高分求解!解决方案
- java可以跟PHP对接吗?解决方案
- 有什么办法在JSP页面在不使用<%%>情况下 使用数学函数Math.floor()解决方案
- 在JSP页面调用JavaBean,出错!初学!求指导!解决方案
- JS方法内取的值是false,给方法传递的值却是正确的,请高手指教。解决方案
- 求教各位大神,初学JSP看什么书比较好呢?新一点的。解决方案
- java调用so,解决方案
- JPA到底是神马?解决方案
- 什么是servlet容器?解决方案
- ajaxupload里onComplete:的response输出全是jsp代码?解决方案
- request.getCookies()方法得不到cookie,只得到一个内存cookie.解决方案
- 有哪些比较好用的嵌入式http server库或者组件?解决方案
- struts2 EXCEL文件上传导入过程中进行字段的有效判断,求解!解决方案
- hibernate的Criteria在数据库中求和,float格式求和为什么只有一位小数?解决方案
- 新手集成SSH遇到困难。解决方案
- 2012年终总结?解决方案
- 说不出的难受,坐等老鸟(不需要安慰,只想听听看法)解决方案
- 终于能发300分的帖子了,可是这又有什么用呢。解决方案
- 【散分】不知不觉~周末就来了.解决方案