Wie ich weiß, kann der TCP-Port in 'time_wait' nicht verwendet werden. In meinem Experiment verwendet der Server jedoch den Port 'time_wait'? Warum?
Geben Sie zunächst auf dem Clientcomputer den Befehl ein ehco 40000 40001 > /proc/sys/net/ipv4/ip_local_port_range
. Die maximale Anzahl von TCP-Ports beträgt also 2.
Servercode
while (1) {
int len = sizeof(struct sockaddr);
fd = accept(sfd, &remote, &len);
read(fd, buf, sizeof(buf));
close(fd);
}
Client-Code
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");
}
Show
[root@livecd ~]# ./client
connect
[root@livecd ~]# connect
connect
Es sind bis zu 3 Verbindungen. Ich denke, höchstens 2 Verbindungen. Warum ? Server hat 2 Timewait-Verbindungen.
[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
Umgebung
Linux livecd.centos 2.6.32-642.el6.i686 #1 SMP Tue May 10 16:13:51 UTC 2016
Serverkonfiguration
[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
Client-Konfiguration
[root@livecd ~]# cat /proc/sys/net/ipv4/ip_local_port_range
40000 40001
Wichtig Ich versuche auch Ubuntu Server 14.04, habe aber das gleiche Ergebnis erzielt.
Antworten:
Der Status "Wartezeit" verhindert, dass alte Pakete einer vorherigen Verbindung in eine neue Verbindung aufgenommen werden. Es lässt effektiv genug Zeit, damit alte Pakete im Netzwerk "sterben" können.
Ein Socket im Timewait-Status kann jedoch eine neue Verbindung akzeptieren, solange die anfängliche Sequenznummer auf dem SYN höher ist als die letzte auf dem Socket angezeigte Sequenznummer.
quelle