私が知っているように、「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つのtimewait接続があります。
[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サーバー14.04も試してみましたが、同じ結果が得られました。
時間待機状態は、以前の接続からの古いパケットが新しい接続に受け入れられるのを防ぐために使用されます。古いパケットがネットワークで「死ぬ」のに十分な時間を効果的に与えます。
ただし、Timewait状態のソケットは、SYNの初期シーケンス番号がソケットで確認された最後のシーケンス番号よりも大きい限り、新しい接続を受け入れることができます。