在一台机器上,我发现有许多 TIME_WAIT 连接(到不同的远程服务器)使用相同的本地端口netstat
:
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 的设计目的是防止来自先前连接的旧数据包被接受到新连接中。但由于与不同远程服务器的新连接不会被误认为是旧连接,所以我认为对不同的远程服务器使用 TIME_WAIT 端口显然是安全的。
那么,我看到的(不同连接中的相同本地端口)是否证明 TIME_WAIT 端口被重用?
我在 CentOS 6.5 上(tcp_tw_reuse 设置为 0),这些连接是由 python2.7.6/requests2.12.1 创建的。
答案1
事实上你的套接字处于 TIME_WAIT 状态真的不管怎样,它们可能处于 ESTABLISHED 状态,而你的问题仍然存在 -为什么我在多个连接中看到相同的源端口?
结论:只要 TCP 四元组(源 IP、源端口、目标 IP、目标端口)不相同,就允许多个连接使用相同的源端口。
TIME-WAIT 用于防止使用完全一样TCP 4元组作为旧连接。
大多数情况下,Linux 会自动从临时端口范围(默认为 32768 至 61000)中分配源端口:
# cat /proc/sys/net/ipv4/ip_local_port_range
32768 60999
在决定使用哪个源端口时,内核首先会检查临时端口范围内是否有任何未使用的源端口。在大约 28k 个可能的源端口的情况下,内核通常能够找到一个可用端口并在那里停止。但是,如果所有 28k 个端口都在使用中,它接下来会检查是否有任何端口通过check_established
来源只要新的连接针对不同的 TCP 4 元组,该功能就允许重新使用已分配的源端口。
此外,除了让内核自动分配源端口之外,还可以通过编程方式告诉内核您想要为特定连接使用哪个源 IP 和端口。