Как я знаю, порт tcp в стате time_wait использовать нельзя. Однако в моем эксперименте сервер повторно использует порт 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 14.04, но получил тот же результат.
Состояние ожидания времени используется для предотвращения приема старых пакетов из предыдущего соединения в новое соединение. Это эффективно дает достаточно времени старым пакетам, чтобы «умереть» в сети.
Однако сокет в состоянии Timewait может принять новое соединение до тех пор, пока начальный порядковый номер в SYN выше, чем последний порядковый номер, замеченный в розетка.