强制连接工作

问题描述 投票:0回答:1

我在运行 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,我没有这个问题)...?

performance unix networking telnet
1个回答
0
投票
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 已接收到已建立。

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.

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

© www.soinside.com 2019 - 2024. All rights reserved.