代码之家  ›  专栏  ›  技术社区  ›  Rob Napier

忽略SYN/ACK

  •  2
  • Rob Napier  · 技术社区  · 13 年前

    我正在开发的Mac OSX网络客户端有时连接到HTTPS端口时遇到问题。查看网络跟踪,我们看到:

    T0.0 client:port -> server:443 SYN
    T0.1 server:443 -> client:port SYN, ACK
    T3.1 server:443 -> client:port SYN, ACK
    T6.1 server:443 -> client:port RST
    

    3秒的延迟与在失败的SYN/ACK上重试的TCP超时相匹配,因此这是预期的。但令人难以置信的是,客户从来没有用ACK或RST响应。当客户端再次尝试登录时,它将成功。这个问题在许多首次尝试连接时重复出现。这个程序还有其他的HTTPS连接在同一时间进行,在网络跟踪中看起来还不错。

    我的怀疑是有一个竞争条件导致套接字有时被错误地管理。但到目前为止,除了受影响的客户机(这是一个非常庞大和复杂的软件),我无法在任何代码中重新创建它。甚至使用 nmap hping3 为了手工制作数据包,客户端总是至少发送一个RST。

    有没有办法(有意或无意地)在userland代码中配置这样的套接字,使其不响应SYN/ACK?

    2 回复  |  直到 13 年前
        1
  •  1
  •   user207421    13 年前

    不,除了关闭SYN/ACK之外,无法在用户区域中配置TCP套接字来忽略它,这将触发出站RST以响应传入的SYN/ACK。对我来说这听起来像是个内核错误。不过,我想知道这些联系。您应该最大限度地利用HTTP保持活力,以尽量减少每单位时间的新连接数。

        2
  •  0
  •   jmpcm    13 年前

    不能忽略SYN/ACK,因为它是TCP协议的三方握手连接的一部分。在我看来,问题是服务器套接字没有正确打开。另一个假设是服务器不可访问(例如防火墙阻止它)。

    不知道这个程序很难提供比这更多的帮助。希望这有帮助!

    编辑: 检查您是否正确关闭前一个客户端的套接字。以前的套接字可能未正确关闭,操作系统可能会达到允许打开的套接字的限制。在这种情况下,发送RST包。