tcp TIME-WAIT 的真正好处及其在生产环境中的影响

tcp TIME-WAIT 的真正好处及其在生产环境中的影响

一些理论

我一直在阅读有关 tcp 的一些资料TIME-WAIT这里那里)我读到的是,它是一个设置为2 x MSL(最大段寿命)的值,它将连接保持在“连接表”中一段时间​​,以保证,“在你允许创建与同一元组的连接之前,属于该元组先前化身的所有数据包都将失效”

由于在连接存在TIME-WAIT或不再存在时收到的段(特定情况下的 SYN 除外)将被丢弃,为什么不立即关闭连接呢?

Q1:是不是因为处理来自旧连接的段所涉及的处理较少,而在同一元组上创建新连接的处理较少TIME-WAIT(即是否存在性能优势)?

如果上述解释站不住脚,那么我认为它TIME-WAIT有用的唯一原因是,如果客户端SYN在发送同一元组上旧连接的剩余段之前发送连接,在这种情况下,接收方将重新打开连接,但随后会得到坏段,并且必须终止它。

Q2:这个分析正确吗?
Q3:使用TIME-WAIT还有其他好处吗?

一些实践

我一直在查看我管理的生产服务器上的 munin 图表。下面是其中一个: 在此处输入图片描述

如您所见,中的连接数TIME-WAIT比 的多ESTABLISHED,大多数情况下大约是 的两倍,有时甚至是四倍。

Q4:这对性能有影响吗?
Q5:如果是这样,降低TIME-WAIT价值是否明智/建议(以及降低什么)?
问题 6:这个TIME-WAIT/ESTABLISHED连接比率正常吗?这可能与恶意连接尝试有关吗?

答案1

简而言之,不必担心TIME_WAIT。开销几乎为零,通常不会造成任何问题。

在繁忙的服务器上,端口耗尽是可能的,在这种情况下,可以使用 sysctl 选项net.ipv4.tcp_tw_reuse = 1,它允许内核TIME_WAIT根据需要重用仍然存在的旧端口。

TIME_WAIT 是 TCP 规范的一部分,用于捕获可能仍在传输中的数据包(请记住,并非所有连接都是可靠的,而这正是 TCP 旨在解决的问题)。对于大多数现代用途而言,超时值可能非常高,但它通常不会干扰 netstat 输出以外的任何内容。

如果您自己控制套接字,并且确定您没有等待数据(例如,您是最终发送者,或者您不关心响应),则可以在设置选项后关闭套接字SO_NOLINGER,这将终止与 的连接RST,并立即丢弃套接字。

所以你的问题是:

Q1、Q2、Q3:它用于收集延迟数据包,“以防万一”,因为链接可能不可靠。它是规范的一部分,可以防止数据包丢失,调整它没有实际好处。

问题 4:否

Q5:不用担心,如果需要,您可以选择强制重用这些插座。

Q5:TIME_WAITESTABLISHED并不相关,除了您拥有的短连接越多,该比率就越大。这可能是由恶意因素造成的,但它并不比“过度网络活动”更具有指示作用。

答案2

根据我有限的关于 TIME_WAIT 的经验,以下是一些答案:

1/2/3)参见那么问题来了这一页详细解释 TIME_WAIT。它不是一个性能问题,而是一个服务质量问题,以确保连接中的所有 TCP 数据包都能得到正确接收。

4/5) 与 TIME_WAIT 相关的一个性能问题是,在非常繁忙的服务器上,如果处于 TIME_WAIT 状态的连接过多,最终可能会用尽可用连接。如果您遇到此问题,可以尝试降低 TIME_WAIT 值,但这可能属于“我知道自己在做什么”调整类别。请参阅这个问题了解更多详细信息。

6) TIME_WAIT 的默认值“应该”在 240 秒左右(或数据包 MSL 120 秒的两倍)。因此,已建立/等待连接的比率将取决于传入连接速率以及它们保持打开状态的时间。例如,我检查了几台繁忙的服务器,比率范围从 1.3 到 400,根据服务器及其接收的流量,我认为所有这些都是正常的。

相关内容