让我们假设有一个客户,使得很多的短期居住连接到一个服务器。

如果客户关闭连接,将有许多港口在 TIME_WAIT 国家在客户端。由于客户的当地端口,就不可能作出新的尝试连接迅速。

如果服务器关闭连接,我会看到许多 TIME_WAITs在服务器上面。然而,这不会做任何伤害吗?客户(或其他客户)可以保持使得连接的企图,因为它从来没有用尽当地端口,而该号码的 TIME_WAIT 国家将增加,在服务器上面。发生什么事情最终吗?做坏事发生吗?(放缓,崩溃,下降了连接,等等。)

请注意,我的问题不是"的目的是什么 TIME_WAIT?"但是"如果发生了什么有这么多 TIME_WAIT 各国在服务器上?" 我已经知道会发生什么时候关闭连接在TCP/IP和为什么 TIME_WAIT 国家是必需的。我并不想麻烦-拍摄但是只是想知道什么是潜在的问题。

把简单地说,让我们说 netstat -nat | grep :8080 | grep TIME_WAIT | wc -l 印刷品 100000.会发生什么?不O/S网络堆慢下来?"打开了太多的文件"的错误?或者,只是没什么好担心的?

有帮助吗?

解决方案

每个插座 TIME_WAIT 消耗的一些内存在的核心,通常略有不到一个 ESTABLISHED 插但仍然显着。一个足够大的数字可能会排核心内存,或者至少是导致性能下降,因为这存储器可能被用于其他目的。 TIME_WAIT 卯不举行公开文件的描述(假定它们已经正确地关闭),所以你应该不需要担心"打开了太多的文件"的错误。

插座,也关系,特别是 src/dst IP地址和港口,所以它不能重复使用的持续时间 TIME_WAIT 时间间隔。(这是预期的目的 TIME_WAIT 状态。) 占港口通常不是一个问题,除非你需要重新连接与相同的口对。最经常的一个方面将利用一个短暂的港口,只有一个侧锚定一个众所周知的港口。然而,一个非常大的数目 TIME_WAIT 插座可以排的临时口的空间如果你是重复和频繁之间的连接的相同的两个IP地址。注意这不仅影响这个特殊的IP地址对,并不会影响建立与其他主机。

其他提示

调查结果迄今为止:

甚至如果服务器关闭插座使用的系统调,其文件的描述不会被释放,如果它进入TIME_WAIT状态。该文件描述将被释放后,当TIME_WAIT国家消失(即后2*MSL秒)。因此,太多的TIME_WAITs将可能导致'太多的公开文件的'误差在服务器的进程。

我相信O/S TCP/IP堆已经实施适当的数据结构(例如散列表的),这样总人数的TIME_WAITs不应影响业绩的O/S TCP/IP堆。只有处理(服务器)拥有插座在TIME_WAIT国家将受到影响。

每个连接是确定的一组(服务器IP、服务器的端口,客户IP,客户端口)。至关重要的是, TIME_WAIT 连接(无论他们是在服务器上面或在客户端)各占一个这元组。

TIME_WAITs在客户端,很容易看到,为什么你不能做任何更多的连接-你没有更多的当地端口。但是,同样的问题适用的服务器上面的-一旦它有64k连接 TIME_WAIT 状态 对于一个单一的客户, 它不能接受任何更多的连接 从那个客户, ,因为它没有的方式来告诉之间的差旧的连接和新连接两个连接都确定的同元组。服务器应就送回 RSTs到新的连接企图从该客户在这种情况。

如果你有一个很大的连接来自许多不同的客户IPs到服务器IPs你可能会遇到的限制连接跟踪表。

检查:

sysctl net.ipv4.netfilter.ip_conntrack_count
sysctl net.ipv4.netfilter.ip_conntrack_max

在所有src ip/港口和目标ip/口组只能有网。ipv4。netfilter.ip_conntrack_max在跟踪表。如果这种限制是打中你会看到一个消息你的日志"nf_conntrack:表完整,下降的分组。"服务器不会接受新来的连接,直到没有空间在跟踪表。

这种限制可能会打你很久以前短暂的港口运出。

在我的情景我跑了一个脚本时间表的文件,反复多次,我的产品做一些计算和发响应客户即客户是制作一个重复http呼吁得到的响应每个文件。当大约150文件定插座港口在我的服务器在time_wait国家和一个例外是扔在客户打开一个http即连接

 Error : [Errno 10048] Only one usage of each socket address (protocol/network address/port) is normally permitted

其结果是,我的申请被绞死。我不知道可以threadshave了在等待国家或发生了什么事但我要杀死所有的进程或重新启动我的应用程序,使它的工作。

我试图减少等待时间为30秒钟,因为它是240秒钟的默认,但它没有工作。

所以基本上整体影响是至关重要的,因为它使我应用程序不响应

它看起来像服务器可以运行出口要分配用于进入的连接(期间的现有TIMED_WAITs)-一种情况下DOS攻击。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top