• 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 算法,但是如果没有关闭 真的出现了呢???

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

  • 相关阅读:
    MySQL 连接的使用:语法及案例剖析、INNER JOIN、LEFT JOIN、RIGHT JOIN
    MySQL GROUP BY 分组语句:语法及案例剖析、使用 WITH ROLLUP
    MySQL 排序:语法及案例剖析、在命令提示符中使用 ORDER BY 子句
    MySQL UNION 操作符:语法及案例剖析
    MySQL LIKE 子句:语法及案例剖析、在命令提示符中使用 LIKE 子句
    maven仓库
    maven安装配置
    Jedis
    Redis下载安装以及String类型
    Redis介绍
  • 原文地址:https://www.cnblogs.com/codestack/p/13580341.html
Copyright © 2020-2023  润新知