Linuxが 'time_wait'ポートを再利用するのはなぜですか?

Linuxが 'time_wait'ポートを再利用するのはなぜですか?

私が知っている限り、 'time_wait'統計のtcpポートは利用できません。しかし、私の実験では、サーバーは「time_wait」ポートを再利用しました。なぜ?

まず、クライアントコンピュータにコマンドを入力しますehco 40000 40001 > /proc/sys/net/ipv4/ip_local_port_range。したがって、TCPポートの最大数は2つです。

サーバーコード

while (1) {
    int len = sizeof(struct sockaddr);
    fd = accept(sfd, &remote, &len);

    read(fd, buf, sizeof(buf));
    close(fd);
}

顧客コード

    for (i = 0; i < 3; i++)
    {
        sleep(1);
        pid_t pid = fork();
        if (pid == 0)
        {
            handler();
            exit(0);
        }
    }

 void handler()
 {
      * ............. */

      res = connect(sfd, result->ai_addr, result->ai_addrlen);
      if (res == -1) {
        perror("error");
        exit(1);
      }

      printf("connect\n");
 }

展示する

[root@livecd ~]# ./client 
connect
[root@livecd ~]# connect
connect

最大3つの接続が可能です。私の考えでは最大2つの接続が可能です。なぜ?サーバーには2つのタイムウェイト接続があります。

[root@livecd ~]# netstat -anp | grep TIME
tcp  192.168.88.131:2016   192.168.88.132:40000  TIME_WAIT                  
tcp  192.168.88.131:2016   192.168.88.132:40001  TIME_WAIT                              

環境

Linux livecd.centos 2.6.32-642.el6.i686 #1 SMP Tue May 10 16:13:51 UTC 2016

サーバー構成

[root@livecd ~]# cat /proc/sys/net/ipv4/tcp_fin_timeout 
60
[root@livecd ~]# cat /proc/sys/net/ipv4/tcp_tw_recycle 
0
[root@livecd ~]# cat /proc/sys/net/ipv4/tcp_tw_reuse 
0

クライアント構成

[root@livecd ~]# cat /proc/sys/net/ipv4/ip_local_port_range 
40000   40001

重要 Ubuntu Server 14.04も試しましたが、同じ結果が得られました。

ベストアンサー1

質問を転写した部分にはエラーが多く重要な部分が欠けている部分があるようですが、いくらでも回答できそうです。実際にポート番号は2つだけですが、いいえつまり、2つの接続しか存在できません。接続は4つの値で区別されます。

  • ソースアドレス
  • ソースポート
  • 宛先アドレス
  • 宛先ポート

したがって、通常、クライアントが新しいポート番号で新しい接続を開くと、サーバーは同じポート番号を使用でき、それでも別のTCP接続になります。それだけです。最大サーバーは機能しますが、一つサーバーがリッスンするサーバー側のポート(つまり、いわゆるサービスの「よく知られているポート」)とそれに接続するすべてのクライアントは、クライアントのローカルアドレスとポートが異なります。

したがって、実際には3つの接続を表示する必要があります。 2つだけが表示されるのは、そのうちの1つが適切な時間を待っているか、まだその状態に達していないためです。 grepフィルタが機密情報を隠している可能性があります。このテストでは、サーバーが各接続を受け入れると、ローカルで何かを印刷することができます。

おすすめ記事