关于TCP/IOCP构架中出现的Socket假死连接解决方案
2017-06-22 17:46
239 查看
如果在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%干掉假死连接),但是一定会做用户层的心跳检测机制。
好文要顶 关注我 收藏该文
假死连接具体表现如下:
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构架中出现的假死连接解决方案
- WCF关于svcutil生成关于TCP绑定出现 元数据包含无法解析的引用:“net.tcp://127.0.0.1:9999/xxxx/”的解决方案
- 关于oracle出现ORA-06143:连接未打开 解决方案
- 关于远程桌面连接阿里云服务器ECS出现的卡顿、自动退出问题的解决方案
- 关于使用putty私钥连接linux出现失败的原因解决方案
- 关于用DB2v8.2驱动连接数据库出现 No suitable driver错误的解决方案
- FlashFXP出现“数据Socket错误,连接超时”解决方案
- 关于Jedis连接Linux上的redis出现 DENIED Redis is running in protected mode问题的解决方案
- 关于PC套件显示红外连接出现问题而导致连接不上的解决方案(zz)
- FlashFXP出现“数据Socket错误,连接超时”解决方案
- 关于Jedis连接Linux上的redis出现 DENIED Redis is running in protected mode问题的解决方案
- 关于VS2013连接Oracle数据库提示:“尝试加载oracle客户端时引发badimage,如果在安装 32 位 Oracle 客户端组件的情况下以 64 位模式运行,将出现此问题”的解决方案。
- 关于sqlserver 2008r2 中出现 通过端口1433连接到主机 的localhost 的TCP/IP 解决办法
- 关于TcpClient,Socket连接超时的几种处理方法
- 关于php socket客户端连接java socket服务器端,出现连接中断的问题。
- 关于PC套件显示红外连接出现问题而导致连接不上的解决方案(zz)
- 关于Jedis连接Linux上的redis出现 DENIED Redis is running in protected mode问题的解决方案
- 关于Ajax下拉菜单中出现“回发或回调参数无效”的解决方案
- 关于利用CMWAP的方式不能通过TCP/IP连接INTERNET的说明!
- C#中使用异步Socket编程实现TCP网络服务的C/S的通讯构架(一)