3

我在运行 red hat 5 的 VM 上在 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,我没有这个问题)......?

4

1 回答 1

0

它与端口相关。启动 TCP 连接时,对于客户端,会选择端口上限 (32786+) 中随机未使用的端口。然后完成通常的TCP 握手,仅在称为同时启动的特殊情况下完成。这里假设连接的双方都想同时建立一个连接,见下图来自 RFC。

您可以使用 ncat 强制执行该行为:

ncat -p 50000 127.0.0.1 50000

这将使 ncat 连接到127.0.0.1:50000,同时使用源端口50000。您可以立即获得有效连接,而无需事先侦听传入连接。


尽管评论者说了什么,这里发生的案例被称为同时启动,并且在RFC 793 第 3.4 节中有详细说明,其中说:

同时启动只是稍微复杂一些,如图 8 所示。每个 TCP 循环从 CLOSED 到 SYN-SENT 到 SYN-RECEIVED 到 ESTABLISHED。

      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.

我还更正了第一段,使其更加清晰和准确。

于 2012-10-29T17:13:17.583 回答