close wait 状态的随想
今天在新入职的公司处理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 算法,但是如果没有关闭 真的出现了呢???
----------------------------------------------------------???---------------------------------
最新文章
- 破解版windows 7(旗舰版)下安装并使用vagrant统一开发环境
- C#零碎知识汇总
- linux在yum下安装mysql
- 如果我用C#来输出99表
- [Effective JavaScript 笔记]第41条:将原型视为实现细节
- curl命令常见用法汇总 good
- java的io读取
- 关于WCF中间层服务器端DTO属性更新如何同步回仓储实体的处理方式
- POJ 2096-Collecting Bugs(概率dp入门)
- 通过SERVICES的方式往商品列表FINDER加入多个ACTION
- JAVA课设---五子棋
- Pat1071: Speech Patterns
- Idea主题下载
- PAT甲级1123 Is It a Complete AVL Tree【AVL树】
- Java中代理
- tomcat 取消项目名访问路径
- 透彻理解Spring事务设计思想之手写实现
- MySql 语句收集
- BZOJ 3516 国王奇遇记加强版(乱推)
- Ubuntu 下 vi 输入方向键会变成 ABCD 的解决方法
热门文章
- (数据科学学习手札97)掌握pandas中的transform
- 【C语言教程】“双向循环链表”学习总结和C语言代码实现!
- spring boot:actuator的安全配置:使用spring security做ip地址限制(spring boot 2.3.2)
- STM32时钟和定时器
- Codeforces Round #676 (Div. 2) A - D个人题解(E题待补)
- SELECT INTO与INSERT INTO SELECT用法
- Spring 事务失效
- Kubernetes K8S之调度器kube-scheduler详解
- vivo 基于原生 RabbitMQ 的高可用架构实践
- 安卓WebSocket使用