我正在使用的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连接同时进行,并且它们在网络跟踪中似乎没有问题。
我怀疑是有竞争条件导致套接字有时不正确的管理。但到目前为止,我一直无法在任何代码中重新创建这个文件,但受影响的客户端(这是一个非常庞大而复杂的软件)。即使使用nmap
和hping3
手工处理数据包,客户端始终至少发送一个RST。
是否有任何方式来配置(故意或错误)在用户级代码这样的套接字,所以它不响应SYN/ACK?
如果服务器不可访问,那么我不会从它得到SYN/ACK。我的问题是*我的*端没有发送所需的ACK(因此显然可以忽略SYN/ACK,尽管有规则,因为它发生了:D Reality总是胜过规范)。同样,如果我的套接字用完了,我不会发送最初的SYN,但我是。我的工作理论是,我必须使用相同的套接字文件描述符偶然地将线程网络连接到两个不同的服务器。尽管如此,我还是无法证明会发生什么。 – 2010-11-19 17:30:35
对不起,但我不同意你。您不能忽略TCP连接上的三次握手!如果你忽略它,那么连接将不会建立。但是你的理论可能是正确的:也许你正在使用并发线程访问同一个套接字,在客户端,其中一个可能会关闭套接字,而不是发送ACK,并因此发送服务器发送的RST。尝试检查你的理论(我不知道你的程序)。事实上,RST最常见的原因是插座被关闭:) – jmpcm 2010-11-19 22:38:52
我同意OP。上面的答案显然是不正确的。如果服务器套接字未正确打开,则它不发送SYN/ACK。 – EJP 2010-11-20 01:39:29