`
mowen99
  • 浏览: 63565 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

关于TCP/IOCP构架中出现的假死连接解决方案

    博客分类:
  • IOCP
 
阅读更多
如果在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%干掉假死连接),但是一定会做用户层的心跳检测机制,当然我的项目也是这样处理的,目前反馈信息良好。
0
0
分享到:
评论

相关推荐

    稳定版本tcp/udp iocp服务器及客户端

    在实际应用中,TCP/iOCp服务器常用于需要稳定性和可靠性的服务,如文件传输、数据库连接等,而UDP/iOCp客户端则适用于需要快速响应且对丢包有一定容忍度的场景,如在线游戏中的位置同步、视频直播等。 总的来说,...

    TCP/UDP IOCP整合

    本文将围绕"TCP/UDP IOCP整合"这一主题,深入探讨如何将这两种协议与IOCP(I/O完成端口)相结合,以及它们在实际项目中的应用。 首先,TCP是一种面向连接的、可靠的传输协议,它保证了数据的顺序传输和无丢失。而...

    VC++版稳定高效tcp/udp iocp服务器及客户端

    总的来说,"VC++版稳定高效tcp/udp iocp服务器及客户端"是一个利用IOCP机制实现的高性能网络通信解决方案,适合于开发需要处理大量并发连接的网络应用,如在线游戏服务器、实时通信平台等。通过阅读和理解该项目的源...

    TCP-IOCP连接.rar

    《TCP-IOCP连接详解与应用实践》 TCP(Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议,而IOCP(I/O完成端口)是Windows操作系统提供的一种高效率、高性能的异步I/O模型。...

    易语言TCP-IOCP连接

    易语言TCP-IOCP连接源码,TCP-IOCP连接,服务器处理函数,子程序2,标记,向上跳转,调用子程序_,读内存整数,写内存整数,复制内存,取字节集地址,封装分包,CRC32,取类函数地址,取整数型地址,取类指针,启动,停止,取消息类型,...

    TCP\IOCP易语言源码

    在TCP/IP编程中,易语言提供了丰富的网络库,支持TCP连接、数据收发等操作,同时,通过内嵌汇编,可以对性能进行优化,以满足高性能网络服务的需求。 "内嵌汇编版源码"指的是在易语言的程序中,部分关键性能敏感的...

    e语言-易语言TCP-IOCP连接

    在“易语言TCP-IOCP连接”这个主题中,我们主要讨论的是如何利用易语言来实现TCP(传输控制协议)的异步I/O完成端口(IOCP)连接。 TCP是一种面向连接的、可靠的传输层协议,它确保数据包按顺序无损地传递。而IOCP...

    TCP.IP_zhongduangaojikaifa.rar_TCP/IP_TCP/IP编程_visual c

    在这个名为“TCP/IP_zhongduangaojikaifa.rar”的压缩包中,我们聚焦于使用TCP/IP进行高级编程,特别是在Visual C++环境中。通过源代码学习,我们可以深入了解TCP/IP通信的细节,以及如何在实际项目中应用这些知识。...

    _tcp_iocp_vc6_1.rar

    在标签“_tcp_iocp_vc6_1”中,我们可以推测这是关于TCP编程和IOCP技术的讨论,可能是某个特定版本或者阶段的代码。 由于压缩包中只有一个文件名为“_tcp_iocp_vc6”,我们可以假设这可能是一个包含源代码、文档...

    iocp.rar_TCP/IP编程_visual c_网络库

    标题中的“iocp.rar_TCP/IP编程_visual c_网络库”表明这是一个使用Visual C++进行TCP/IP网络编程的项目,其中“IOCp”是Windows操作系统中的一个关键概念——I/O完成端口(Input/Output Completion Port)。...

    TCP-IOCP模块3.0版.rar

    在提供的源代码中,我们可以学习到如何在易语言中使用API函数来创建、初始化IOCP,以及如何进行TCP连接的监听、接受、发送和接收数据等操作。例如,可能会使用到的API函数有CreateIoCompletionPort、...

    TCP_IOCP.rar_IOCP_TCP长连接_c# iocp_socketasyncsvr.exe_长连接

    通过研究这些源代码和文档,开发者可以学习到如何利用IOCP和SAEA在C#中构建高性能的TCP服务器,以及如何处理高并发下的长连接。这样的技术对于构建大型分布式系统、游戏服务器或者实时数据传输的应用尤其有价值。

    几个TCP/IP编程实例,WinSock编程,聊天实例

    在IT领域,网络编程是不可或缺的一部分,特别是在C++这样的强大编程语言中,TCP/IP协议的使用使得跨网络的通信变得可能。本主题聚焦于“TCP/IP编程实例,WinSock编程,聊天实例”,将深入探讨这些关键概念和技术。 ...

    易语言源码易语言TCP-IOCP连接源码.rar

    易语言TCP-IOCP连接源码中,开发者可能会涉及到以下几个核心知识点: 1. **TCP连接**:TCP(Transmission Control Protocol)是一种面向连接的、可靠的传输层协议,确保数据在互联网上可靠地传输。源码中会包含建立...

    epoll/iocp 比较

    不同的操作系统提供了不同的I/O多路复用机制,如Linux中的epoll和Windows上的IO完成端口(iocp)。这里我们将深入探讨这些机制,并对比它们的工作原理、性能特点以及适用场景。 1. **epoll** - **定义**:epoll是...

    _tcp_iocp_vc6.rar

    TCP/IP(Transmission Control Protocol/Internet Protocol)是一种广泛使用的网络通信协议,而IOCP(I/O完成端口,Input/Output Completion Port)是Windows操作系统中的一种高效率的异步I/O模型,尤其适用于处理...

    IOCP技术源码(长连接休眠唤醒机制)

    在TCP/IP通信中,IOCP能显著提高服务器处理并发连接的能力,特别适合于长连接的场景,例如游戏服务器、实时数据交换应用等。本源码包包含了一个基于IOCP的TCP服务器实现,让我们来详细探讨一下其中的关键技术和设计...

    TCP/IP高效编程:改善网络程序的44个技巧

    最后,书中可能会探讨一些高级话题,如TCP连接的延迟打开和延迟关闭,UDP的使用场景以及与TCP相比的优缺点,以及在高并发环境下如何使用TCP Keepalive防止死连接。 总的来说,《TCP/IP高效编程:改善网络程序的44个...

    iocp_tcp服务端.rar

    标题中的“iocp_tcp服务端”指的是使用IO完成端口(IOCP,Input/Output Completion Port)技术实现的TCP服务器。在Windows操作系统中,IOCP是一种高效率的异步I/O模型,它允许多个线程并发处理I/O操作,提高了系统的...

    易语言TCP服务器完整源码(基于IOCP实现)

    IOCP是Windows操作系统中的一种高度优化的异步I/O模型,它能处理大量并发连接,尤其适用于高负载的网络服务器。以下是关于这个主题的详细知识点: 1. **TCP/IP协议**:TCP(传输控制协议)是互联网上最常用的一种...

Global site tag (gtag.js) - Google Analytics