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

127.0.0.1:50000これにより、送信元ポートを使用しながらncat が に接続されます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 に答える