netstat 显示大量 TIME_WAIT 连接

netstat 显示大量 TIME_WAIT 连接

好吧,这让我毛骨悚然——我看到了大约 1500-2500 个这样的:

root@wherever:# netstat

Proto Recv-Q Send-Q Local Address           Foreign Address         State      
tcp        0      0 localhost:60930         localhost:sunrpc        TIME_WAIT  
tcp        0      0 localhost:60934         localhost:sunrpc        TIME_WAIT  
tcp        0      0 localhost:60941         localhost:sunrpc        TIME_WAIT  
tcp        0      0 localhost:60947         localhost:sunrpc        TIME_WAIT  
tcp        0      0 localhost:60962         localhost:sunrpc        TIME_WAIT  
tcp        0      0 localhost:60969         localhost:sunrpc        TIME_WAIT  
tcp        0      0 localhost:60998         localhost:sunrpc        TIME_WAIT  
tcp        0      0 localhost:60802         localhost:sunrpc        TIME_WAIT  
tcp        0      0 localhost:60823         localhost:sunrpc        TIME_WAIT  
tcp        0      0 localhost:60876         localhost:sunrpc        TIME_WAIT  
tcp        0      0 localhost:60886         localhost:sunrpc        TIME_WAIT  
tcp        0      0 localhost:60898         localhost:sunrpc        TIME_WAIT  
tcp        0      0 localhost:60897         localhost:sunrpc        TIME_WAIT  
tcp        0      0 localhost:60905         localhost:sunrpc        TIME_WAIT  
tcp        0      0 localhost:60918         localhost:sunrpc        TIME_WAIT  
tcp        0      0 localhost:60921         localhost:sunrpc        TIME_WAIT  
tcp        0      0 localhost:60673         localhost:sunrpc        TIME_WAIT  
tcp        0      0 localhost:60680         localhost:sunrpc        TIME_WAIT  
[etc...]

root@wherever:# netstat | grep 'TIME_WAIT' |wc -l
1942

这一数字正在迅速变化。

我的 iptables 配置确实很严格,所以我不知道是什么原因导致的这种情况。有什么想法吗?

谢谢,

塔马斯

编辑:“netstat -anp”的输出:

Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 127.0.0.1:60968         127.0.0.1:111           TIME_WAIT   -               
tcp        0      0 127.0.0.1:60972         127.0.0.1:111           TIME_WAIT   -               
tcp        0      0 127.0.0.1:60976         127.0.0.1:111           TIME_WAIT   -               
tcp        0      0 127.0.0.1:60981         127.0.0.1:111           TIME_WAIT   -               
tcp        0      0 127.0.0.1:60980         127.0.0.1:111           TIME_WAIT   -               
tcp        0      0 127.0.0.1:60983         127.0.0.1:111           TIME_WAIT   -               
tcp        0      0 127.0.0.1:60999         127.0.0.1:111           TIME_WAIT   -               
tcp        0      0 127.0.0.1:60809         127.0.0.1:111           TIME_WAIT   -               
tcp        0      0 127.0.0.1:60834         127.0.0.1:111           TIME_WAIT   -               
tcp        0      0 127.0.0.1:60872         127.0.0.1:111           TIME_WAIT   -               
tcp        0      0 127.0.0.1:60896         127.0.0.1:111           TIME_WAIT   -               
tcp        0      0 127.0.0.1:60919         127.0.0.1:111           TIME_WAIT   -               
tcp        0      0 127.0.0.1:60710         127.0.0.1:111           TIME_WAIT   -               
tcp        0      0 127.0.0.1:60745         127.0.0.1:111           TIME_WAIT   -               
tcp        0      0 127.0.0.1:60765         127.0.0.1:111           TIME_WAIT   -               
tcp        0      0 127.0.0.1:60772         127.0.0.1:111           TIME_WAIT   -               
tcp        0      0 127.0.0.1:60558         127.0.0.1:111           TIME_WAIT   -               
tcp        0      0 127.0.0.1:60564         127.0.0.1:111           TIME_WAIT   -               
tcp        0      0 127.0.0.1:60600         127.0.0.1:111           TIME_WAIT   -               
tcp        0      0 127.0.0.1:60624         127.0.0.1:111           TIME_WAIT   -               

答案1

编辑:tcp_fin_timeout才不是控制 TIME_WAIT 持续时间,它被硬编码为 60 秒

正如其他人提到的,建立一些连接TIME_WAIT是 TCP 连接的正常部分。您可以通过检查来查看间隔/proc/sys/net/ipv4/tcp_fin_timeout

[root@host ~]# cat /proc/sys/net/ipv4/tcp_fin_timeout
60

并通过修改该值来改变它:

[root@dev admin]# echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout

或者永久添加到 /etc/sysctl.conf

net.ipv4.tcp_fin_timeout=30

另外,如果您不使用 RPC 服务或 NFS,您可以将其关闭:

/etc/init.d/nfsd stop

并彻底关闭它

chkconfig nfsd off

答案2

TIME_WAIT 是正常的。它是套接字关闭后的状态,内核用它来跟踪可能已丢失或迟到的数据包。大量的 TIME_WAIT 连接是获得大量短寿命连接的症状,无需担心。

答案3

这并不重要。这只意味着您正在打开和关闭大量 Sun RCP TCP 连接(每 2-4 分钟 1500-2500 个)。状态TIME_WAIT是套接字关闭时进入的状态,以防止消息到达错误的应用程序(如果套接字重用得太快,可能会出现这种情况),并用于其他一些有用的目的。不要担心。

(当然,除非您实际上没有运行任何应该处理那么多 RCP 操作的程序。那么,就担心吧。)

答案4

tcp_fin_timeout不控制TIME_WAIT延迟。您可以使用 ss 或 netstat 加上 -o 来查看倒计时器:

cat /proc/sys/net/ipv4/tcp_fin_timeout
3

# See countdown timer for all TIME_WAIT sockets in 192.168.0.0-255
ss --numeric -o state time-wait dst 192.168.0.0/24

NetidRecv-Q  Send-Q    Local Address:Port    Peer Address:Port                             
tcp  0       0         192.168.100.1:57516   192.168.0.10:80    timer:(timewait,55sec,0)   
tcp  0       0         192.168.100.1:57356   192.168.0.10:80    timer:(timewait,25sec,0)   
tcp  0       0         192.168.100.1:57334   192.168.0.10:80    timer:(timewait,22sec,0)   
tcp  0       0         192.168.100.1:57282   192.168.0.10:80    timer:(timewait,12sec,0)   
tcp  0       0         192.168.100.1:57418   192.168.0.10:80    timer:(timewait,38sec,0)   
tcp  0       0         192.168.100.1:57458   192.168.0.10:80    timer:(timewait,46sec,0)   
tcp  0       0         192.168.100.1:57252   192.168.0.10:80    timer:(timewait,7.436ms,0) 
tcp  0       0         192.168.100.1:57244   192.168.0.10:80    timer:(timewait,6.536ms,0)

即使将 tcp_fin_timeout 设置为 3,TIME_WAIT 的倒计时仍然从 60 开始。但是,如果将 net.ipv4.tcp_tw_reuse 设置为 1 ( echo 1 > /proc/sys/net/ipv4/tcp_tw_reuse),则如果内核确定 TCP 段编号中不会发生任何冲突,则可以重用 TIME_WAIT 中的套接字。

相关内容