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

WKP*_*lus 4 centos tcp

在一台机器上,我发现有许多 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
Run Code Online (Sandbox Code Playgroud)

我知道 TIME_WAIT 是为了防止来自先前连接的旧数据包被新连接接受而设计的。但由于到不同远程服务器的新连接不会被误认为是旧连接,所以我认为对不同远程服务器使用 TIME_WAIT 端口显然是安全的。

那么,我所看到的(不同连接中的相同本地端口)是否是 TIME_WAIT 端口被重用的证据?

我使用的是 CentOS 6.5(tcp_tw_reuse 设置为 0),这些连接是由 python2.7.6/requests2.12.1 创建的。

Mar*_*ell 5

事实上,你的套接字处于 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
Run Code Online (Sandbox Code Playgroud)

在决定使用哪个源端口时,内核将首先检查临时端口范围中是否存在未使用的源端口。通过大约 28k 可能的源端口,内核通常能够找到可用端口并停在那里。然而,如果所有 28k 端口都在使用中,接下来它将检查是否有任何端口通过源函数check_established 只要新连接用于不同的 TCP 4 元组,这将允许重新使用已分配的源端口。

此外,也可以通过编程方式准确地告诉内核您想要用于特定连接的源 IP 和端口,而不是让内核自动分配源端口。