如果在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构架中出现的假死连接解决方案的更多相关文章

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

    如果在2台不同的公网机器,对TCP的c/s做过详细的压力测试,那么很不幸,会有很多人发现自己的server端会出现大量的假死连接. 假死连接具体表现如下: 1.在s端机器上,会有一些处于TCP_EST ...

  2. TCP/IP 协议中的滑动窗口

    一个例子明白发送缓冲区.接受缓冲区.滑动窗口协议之间的关系. 在上面的几篇文章中简单介绍了上述几个概念在TCP网络编程中的关系,也对应了几个基本socket系统调用的几个行为,这里再列举一个例子,由于 ...

  3. TCP连接探测中的Keepalive和心跳包

    TCP连接探测中的Keepalive和心跳包 tcp keepalive 心跳 保活 Linuxtcp心跳keepalive保活1. TCP保活的必要性 1) 很多防火墙等对于空闲socket自动关闭 ...

  4. TCP/IP协议中backlog参数

    TCP建立连接是要进行三次握手,但是否完成三次握手后,服务器就处理(accept)呢? backlog其实是一个连接队列,在Linux内核2.2之前,backlog大小包括半连接状态和全连接状态两种队 ...

  5. 【Linux网络编程】TCP网络编程中connect()、listen()和accept()三者之间的关系

    [Linux网络编程]TCP网络编程中connect().listen()和accept()三者之间的关系 基于 TCP 的网络编程开发分为服务器端和客户端两部分,常见的核心步骤和流程如下: conn ...

  6. 请问使用jmeter在tcp取样器测试中服务器名称或ip,端口可以填变量值吗?

    请问使用jmeter在tcp取样器测试中服务器名称或ip,端口可以填变量值吗?

  7. TCP报文格式和三次握手——三次握手三个tcp包(header+data),此外,TCP 报文段中的数据部分是可选的,在一个连接建立和一个连接终止时,双方交换的报文段仅有 TCP 首部。

    from:https://blog.csdn.net/mary19920410/article/details/58030147 TCP报文是TCP层传输的数据单元,也叫报文段. 1.端口号:用来标识 ...

  8. TCP之三:TCP/IP协议中backlog参数(队列参数)

    目录: <TCP洪水攻击(SYN Flood)的诊断和处理> <TCP/IP协议中backlog参数> TCP建立连接是要进行三次握手,但是否完成三次握手后,服务器就处理(ac ...

  9. tcp连接过程中的三次握手和四次挥手

    在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手握手建立连接 @第一次握手: 建立连接是,客户端A发送SYN包到服务器B,并进入SYN_SEND状态,等待B确认. @第二次握手: 服务 ...

随机推荐

  1. 基于vue的web应用如何构建成手机端的原生安装包

    话不多说,点击前往

  2. CompoundScope说明

    A class scope adds capabilities to keep track of changes in relatedclass scopes - this allows client ...

  3. C#基础篇二变量与变量类型

    说到数据类型,先把基本的数据类型拿出来 byte 0 到 255 无符号 8 位整数sbyte -128 到 127 有符号 8 位整数short -32,768 到 32,767 有符号 16 位整 ...

  4. springboot 多模块 -- 将 dao(mybatis) 拆分出去

    前言: 以前我们在建项目的时候, 要么将所有的package建在一个项目里面, 在处理引用的时候, 真的很方便. 不用担心, 有些东西配置不到或者读取不到. 或者, 将package独立出去, 到一个 ...

  5. Solidity类型转换

    类型转换,是一个十分重要,常用的手段. 一.隐式转换 隐式转换,就是当一个运算符能支持不同类型,编译器会隐式的尝试将一个操作数的类型,转为另一个操作数的类型,赋值同理. 条件是:值类型间的互相转换只要 ...

  6. Git 管理项目

    一个很小的HTML项目,使用.Git来记录和跟踪这个项目.包括以下内容: 创建版本库. 添加与修改文件. 创建新分支. 打标签并整理版本库. 克隆版本库. 创建版本库 Creating a Repos ...

  7. intellij idea 怎么全局搜索--转

    https://jingyan.baidu.com/article/29697b9163ac7dab20de3cbf.html intellij idea是一款智能,功能强大的ide,对比eclips ...

  8. Java Web 项目简单配置 Spring MVC进行访问

    所需要的 jar 包下载地址: https://download.csdn.net/download/qq_35318576/10275163 配置一: 新建 springmvc.xml 并编辑如下内 ...

  9. PowerBuilder编程新思维2:嵌入(Thread多线程)

    PowerBuilder编程新思维2:嵌入(Thread多线程) 在PB中使用多线程,在网上有大量的文章介绍.不过深入研究并试着给出更易用的模型的,目前还只有"路人甲cw"的一篇& ...

  10. webpack3新特性简介

    6月20号webpack推出了3.0版本,官方也发布了公告.根据公告介绍,webpack团队将未来版本的改动聚焦在社区提出的功能需求,同时将保持一个快速.稳定的发布节奏.本文主要依据公告内容,简单介绍 ...