why linux reuse 'time_wait' port?
As I know, tcp port in 'time_wait' stat cann't be used. However, in my experiment, server reuses the 'time_wait' port? Why?
Firstly, in client machine, type command ehco 40000 40001 > /proc/sys/net/ipv4/ip_local_port_range
. So, the maximum number of TCP ports is 2.
server code
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
It's up to 3 connections. I think, 2 connections at most. Why ? server has 2 timewait connections.
[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
Environment
Linux livecd.centos 2.6.32-642.el6.i686 #1 SMP Tue May 10 16:13:51 UTC 2016
server config
[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 config
[root@livecd ~]# cat /proc/sys/net/ipv4/ip_local_port_range
40000 40001
Important I also try ubuntu server 14.04, but got the same result.
Solution 1:
The Time Wait state is used prevent old packets from a previous connection from being accepted into a new connection. It effectively allows enough time for old packets to "die" in the network.
However, a socket in Timewait state can accept a new connection as long as the Initial Sequence Number on the SYN is higher than the last sequence number seen on the socket.