我正在开发的一个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 RST3秒的延迟与重试失败的SYN/ACK的TCP超时时间相匹配,因此这是意料之中的。但令人难以置信的是,客户端从未使用ACK或RST进行响应。当客户端尝试第二次登录时,登录成功。在第一次尝试连接时,此问题会重现。此程序中的其他HTTPS连接也在同时进行,它们在网络跟踪中似乎没有问题。
我怀疑有一个竞争条件导致套接字有时被错误地管理。但到目前为止,除了受影响的客户端(这是一个非常大和复杂的软件部分)之外,我无法在任何代码中重新创建它。即使使用nmap和hping3手工创建数据包,客户端始终至少发送一个RST。
有没有办法在userland代码中(有意或无意地)配置这样的套接字,使其不响应SYN/ACK?
发布于 2010-11-20 07:46:20
不,除了关闭SYN/ACK之外,没有办法在用户区域中配置TCP套接字忽略SYN/ACK,这将触发传出RST以响应传入的SYN/ACK。对我来说,这听起来像是一个内核bug。不过,我想知道所有这些联系。您应该最大限度地使用HTTP keep alive,以最大限度地减少单位时间内新连接的数量。
发布于 2010-11-20 00:29:43
您不能忽略SYN/ACK,因为它是TCP协议的三次握手连接的一部分。在我看来,问题在于服务器套接字没有正确打开。其他假设是服务器不可访问(例如,防火墙阻止它)。
在不了解程序的情况下,很难给出比这更多的帮助。希望这能有所帮助!
编辑:检查您是否正确地关闭了以前客户端的套接字。以前的套接字没有正确关闭,操作系统达到允许打开的套接字的限制,可能会发生这种情况。在这种情况下,将发送RST数据包。
https://stackoverflow.com/questions/4226997
复制相似问题