在一台机器上,我发现netstat使用相同的本地端口有很多的TIME_WAIT连接(到不同的远程服务器):
tcp 0 0 10.32.198.120:10240 10.32.92.81:4000 TIME_WAIT tcp 0 0 10.32.198.120:10240 10.66.32.192:80 TIME_WAIT tcp 0 0 10.32.198.120:10242 10.32.92.81:4000 TIME_WAIT tcp 0 0 10.32.198.120:10242 10.66.32.192:80 TIME_WAIT tcp 0 0 10.32.198.120:10243 10.32.92.81:4000 TIME_WAIT tcp 0 0 10.32.198.120:10243 10.66.32.192:80 TIME_WAIT tcp 0 0 10.32.198.120:10244 10.32.92.81:4000 TIME_WAIT tcp 0 0 10.32.198.120:10244 10.66.32.192:80 TIME_WAIT tcp 0 0 10.32.198.120:10245 10.66.32.192:80 TIME_WAIT
我知道TIME_WAIT被devise用于阻止来自之前连接的旧数据包被接受到新的连接中。 但是由于到不同远程服务器的新连接不会被误认为是旧连接,所以我认为使用不同的远程服务器的TIME_WAIT端口显然是安全的。
那么,是我看到(在不同的连接相同的本地端口)certificateTIME_WAIT端口被重用?
我在CentOS 6.5上(tcp_tw_reuse设置为0),这些连接是由python2.7.6 / requests2.12.1创build的。
事实上,你的套接字在TIME_WAIT在这里并不重要,它们可能处于ESTABLISHED状态,你的问题仍然存在 – 为什么我看到多个连接的同一个源端口 ?
TLDR :只要TCP四元组(源IP,源端口,目的IP,目的端口)不相同,就允许多个连接使用同一个源端口。
TIME-WAIT用于防止在使用与旧连接完全相同的 TCP 4元组的新连接中接受旧数据包。
在大多数情况下,Linux会自动将源端口从默认为32768到61000的临时端口范围分配给:
# cat /proc/sys/net/ipv4/ip_local_port_range 32768 60999
当决定使用哪个源端口时,内核将首先检查是否有任何源端口在临时端口范围内未使用。 有了~28K的可能的源端口,内核通常能够find一个可用的端口并停在那里。 如果所有的28k端口都在使用,那么接下来将检查是否有任何端口通过了check_established 源函数,只要新连接是针对不同的TCP四元组,将允许已经分配的源端口被重新使用。
另外,不要让内核自动分配一个源端口,也可以通过编程的方式告诉内核你想要为特定连接使用哪个源IP和端口。