今天在新入职的公司处理waf 的问题时,突然看到了一个tcp状态close-wait

  想一想 close-wait 是怎样产生的???? 被动收到FIN 关闭请求,协议栈主动发出ACK, 等待 本端主动发出 FIN,但是本端一直没有执行CLOSE。也就是在被动关闭连接情况下,在已经接收到FIN,但是还没有发送自己的FIN的时刻,连接处于CLOSE_WAIT状态。按道理此状态一般非常短暂,

  出现大量close_wait的现象,主要原因是某种情况下对方关闭了socket链接,但是我方忙与读或者写,没有关闭连接。代码需要判断socket,一旦读到0,断开连接,read返回负,检查一下errno,如果不是AGAIN,就断开连接。

那么怎么解决此问题:??

也就是要检测出对方已经关闭的socket,然后我们去close掉它!!!

1、代码需要判断socket,一旦read返回0,断开连接,read返回负,检查一下errno,如果不是AGAIN,EINTR等 也需要断开连接

2、给每一个socket设置一个时间戳last_update,每接收或者是发送成功数据,就用当前时间更新这个时间戳。定期检查所有的时间戳,如果时间戳与当前时间差值超过一定的阈值,就关闭这个socket。http server 经常这样处理。

3、设置SO_KEEPALIVE选项,使用setsockopt修改socket参数,参考man 7 socket。

但是有个问题:我们是使用read fd 返回0 认为是收到Fin

但是有没有存在一种可能:Fin和数据包报文一起发送????Nagle's算法会累积TCP包,如果最后的数据包和FIN包被Nagle's算法合并呢??read 那端使用ET触发!!

虽然可以使用TCP_NODELAY关闭Nagle 算法,但是如果没有关闭 真的出现了呢???

----------------------------------------------------------???---------------------------------

最新文章

  1. 破解版windows 7(旗舰版)下安装并使用vagrant统一开发环境
  2. C#零碎知识汇总
  3. linux在yum下安装mysql
  4. 如果我用C#来输出99表
  5. [Effective JavaScript 笔记]第41条:将原型视为实现细节
  6. curl命令常见用法汇总 good
  7. java的io读取
  8. 关于WCF中间层服务器端DTO属性更新如何同步回仓储实体的处理方式
  9. POJ 2096-Collecting Bugs(概率dp入门)
  10. 通过SERVICES的方式往商品列表FINDER加入多个ACTION
  11. JAVA课设---五子棋
  12. Pat1071: Speech Patterns
  13. Idea主题下载
  14. PAT甲级1123 Is It a Complete AVL Tree【AVL树】
  15. Java中代理
  16. tomcat 取消项目名访问路径
  17. 透彻理解Spring事务设计思想之手写实现
  18. MySql 语句收集
  19. BZOJ 3516 国王奇遇记加强版(乱推)
  20. Ubuntu 下 vi 输入方向键会变成 ABCD 的解决方法

热门文章

  1. (数据科学学习手札97)掌握pandas中的transform
  2. 【C语言教程】“双向循环链表”学习总结和C语言代码实现!
  3. spring boot:actuator的安全配置:使用spring security做ip地址限制(spring boot 2.3.2)
  4. STM32时钟和定时器
  5. Codeforces Round #676 (Div. 2) A - D个人题解(E题待补)
  6. SELECT INTO与INSERT INTO SELECT用法
  7. Spring 事务失效
  8. Kubernetes K8S之调度器kube-scheduler详解
  9. vivo 基于原生 RabbitMQ 的高可用架构实践
  10. 安卓WebSocket使用