• TCP三次握手,什么情况下client会回复reset


    1. 现象
    最近线上发现如下异常包,

    tcp三次握手期间,server端发送syn_ack,client回复了reset包;

    问题:为什么client会回复reset?

    2. 分析
    参考linux2.6.32内核(redhat 6U2)源码,
    client端TCPIP协议栈在以下情况下,收到SYN_ACK包,会返回reset;

    • 第一,相应socket不存在;
    • 第二,socket处于FIN_WAIT2状态;
    • 第三,socket处于ESTABLISHED状态,并且数据包序列号大于socket待接收数据序列号;
    • 第四,socket处于SYNSENT状态,数据包ack序列号不正确 或者 timestamp时间戳不正确;

    根据抓包,

    • socket不可能处于FIN_WAIT2和ESTBALISHED状态,排除2/3;
    • ack序列号和timestamp时间戳(和syn包中的相同)是正确的,排除4;

    因此,只有可能是1;strace查看系统调用如下:

    1382000576.457377 connect(4, {sa_family=AF_INET, sin_port=htons(80), sin_addr=inet_addr("10.237.20.17")}, 16) = -1 EINPROGRESS (Operation now in progress) <0.000017>

    1382000576.457782 close(4)              = 0 <0.000023>

    3. 结果

    应用模块 为什么会迅速关闭socket,正在追查原因;

    另外,google该问题,timestamp时间戳不准确导致reset的情况很多;

  • 相关阅读:
    【JSP】jQuery Deferred exception successed is not defined
    onclick事件传递变量参数&拼接字符串
    JQuery
    设计模式
    拖拽-原型继承案例
    继承
    原型
    闭包
    promise
    jsonp
  • 原文地址:https://www.cnblogs.com/jdonson/p/4760078.html
Copyright © 2020-2023  润新知