TIME_WAIT 端口可以被不同的远程服务器重复使用吗?

TIME_WAIT 端口可以被不同的远程服务器重复使用吗?

在一台机器上,我发现有许多 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 和端口。

相关内容