我在运行 red hat 5 的虚拟机上的 bash 中运行以下行:
for i in {1..100000};
do telnet 10.10.10.105 41941;
done
在某些时候,即使没有人在侦听,telnet 也会连接到该端口。它似乎正在与它的自我连接?
当我启动应用程序的客户端而不启动服务器时,也会出现同样的问题 - 客户端成功连接到 ip:port。客户端看起来像这样:
addr.sin_family = AF_INET;
addr.sin_port = htons(atoi(port));
addr.sin_addr.s_addr = inet_addr(hostname);
some_while_loop
{
status = ::connect(sock, (sockaddr *)&addr, sizeof(addr));
if (status == -1)
{
shutdown(sock, 2);
close(sock);
return false;
}
}
我找到了这篇文章:http://web.deu.edu.tr/doc/soket/
,其中在 6.2 中指出,如果您连接到正在运行的同一台计算机,则连接将会成功。我的问题是,为什么会发生这种情况?这是硬件问题还是正在使用故障安全的红帽内核,或者可能是因为我正在使用的端口(例如,对于 1025,我没有这个问题)...?
,只有一种称为同时启动的特殊情况。这里假设连接的双方都想同时建立连接,见下图来自RFC。 您可以使用 ncat 强制执行该行为:
ncat -p 50000 127.0.0.1 50000
这将使 ncat 连接到
127.0.0.1:50000
,同时使用源端口
50000
。您可以立即获得有效的连接,而无需事先侦听传入的连接。
不管评论者怎么说,这里发生的情况被称为“同时启动”,并且在 中有详细说明,其中写道: 同时发起只是稍微复杂一些,如图8所示。每个TCP从CLOSED到SYN-SENT循环到 SYN 已接收到已建立。
TCP A TCP B
1. CLOSED CLOSED
2. SYN-SENT --> <SEQ=100><CTL=SYN> ...
3. SYN-RECEIVED <-- <SEQ=300><CTL=SYN> <-- SYN-SENT
4. ... <SEQ=100><CTL=SYN> --> SYN-RECEIVED
5. SYN-RECEIVED --> <SEQ=100><ACK=301><CTL=SYN,ACK> ...
6. ESTABLISHED <-- <SEQ=300><ACK=101><CTL=SYN,ACK> <-- SYN-RECEIVED
7. ... <SEQ=101><ACK=301><CTL=ACK> --> ESTABLISHED
Simultaneous Connection Synchronization
Figure 8.
我还更正了第一段,使其更加清晰和准确。