2010-11-19 52 views
2

我正在使用的Mac OSX网络客户端有时无法连接到HTTPS端口。纵观网络跟踪,我们看到的是:忽略SYN/ACK

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连接同时进行,并且它们在网络跟踪中似乎没有问题。

我怀疑是有竞争条件导致套接字有时不正确的管理。但到目前为止,我一直无法在任何代码中重新创建这个文件,但受影响的客户端(这是一个非常庞大而复杂的软件)。即使使用nmaphping3手工处理数据包,客户端始终至少发送一个RST。

是否有任何方式来配置(故意或错误)在用户级代码这样的套接字,所以它不响应SYN/ACK?

回答

1

不,没有办法在用户域中配置一个TCP套接字来忽略SYN/ACK,除非关闭它,这会引发一个传出RST来响应传入的SYN/ACK。这听起来像是一个内核bug。我想知道所有这些连接。您应该最大限度地使用HTTP保持活动状态,以尽量减少每单位时间新连接的数量。

0

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

很难提供更多的帮助而不知道该计划。希望这可以帮助!

编辑:检查您是否正确关闭了以前的客户端套接字。它可能发生以前的套接字未被正确关闭,并且操作系统达到允许的开放套接字的限制。在那种情况下,发送RST分组。

+0

如果服务器不可访问,那么我不会从它得到SYN/ACK。我的问题是*我的*端没有发送所需的ACK(因此显然可以忽略SYN/ACK,尽管有规则,因为它发生了:D Reality总是胜过规范)。同样,如果我的套接字用完了,我不会发送最初的SYN,但我是。我的工作理论是,我必须使用相同的套接字文件描述符偶然地将线程网络连接到两个不同的服务器。尽管如此,我还是无法证明会发生什么。 – 2010-11-19 17:30:35

+0

对不起,但我不同意你。您不能忽略TCP连接上的三次握手!如果你忽略它,那么连接将不会建立。但是你的理论可能是正确的:也许你正在使用并发线程访问同一个套接字,在客户端,其中一个可能会关闭套接字,而不是发送ACK,并因此发送服务器发送的RST。尝试检查你的理论(我不知道你的程序)。事实上,RST最常见的原因是插座被关闭:) – jmpcm 2010-11-19 22:38:52

+0

我同意OP。上面的答案显然是不正确的。如果服务器套接字未正确打开,则它不发送SYN/ACK。 – EJP 2010-11-20 01:39:29