我可以让 TCP/IP 会话运行时间少于 60 秒吗?

我可以让 TCP/IP 会话运行时间少于 60 秒吗?

我们的服务器因 TCP/IP 会话而超载,有 1200 - 1500 个会话。其中大多数处于 TIME_OUT 状态。事实证明,处于 TIME_OUT 状态的连接会占用套接字,直到 60 秒超时结束。

问题是服务器没有响应,许多客户端无法获得服务。

我做了一个简单的测试:使用 Internet Explorer 8.0 从服务器下载一个 XML 文件。下载在几分之一秒内完成。但随后我发现 TCP/IP 连接处于 TIME_OUT 状态长达 60 秒。

有什么方法可以摆脱 TIME_OUT 等待或者减少释放套接字以进行新连接的时间?

我理解为什么 TCP/IP 连接进入 TIME_OUT 状态,但我不明白为什么 Internet Explorer 在 XML 文件下载结束后不关闭连接。

细节。

我们的服务器运行用 Perl (mod-perl) 编写的 Web 服务。该服务向客户端提供天气数据。客户端是一个 Flash 应用程序(实际上是嵌入在 Windows 应用程序中的 Flash ActiveX 控件)。

操作系统:Ubuntu

Apache“Keep Alive”选项设置为 0

答案1

这是 TCP 堆栈中的设置。由于我们不知道您使用的是哪个平台,因此我们无法确切地说出它的名称以及如何更改它。

更新

所以你使用的是 Ubuntu。你可以使用sysctl将值减少net.inet.tcp.msl到所需TIME_WAIT持续时间的一半(以毫秒为单位 - 请参阅man -S 4 tcp),例如sysctl net.inet.tcp.msl=2500。请注意这样做可能会对在期限过后到达的漫游数据包产生影响TIME_WAIT

答案2

我假设你的意思是TIME_WAIT。发起主动关闭的对等体是进入的对等体TIME_WAIT(参见状态转换图这里)因此,如果你可以让客户端关闭连接,那么你可以将关闭移至TIME_WAIT客户端。请参阅这个答案TIME_WAIT了解更多详细信息以及有关问题及其解决方法的优秀文章的链接。

另一种选择是,如果您无法让客户端发出主动关闭,则在关闭连接之前将 linger 设置为 false 以重置连接。这会导致RST发送 而不是FIN

答案3

服务器无响应可能与处于 TIME_WAIT 状态的连接数无关。不清楚您所说的“占用套接字”是什么意思——服务器应该早就占用了close套接字。系统应该能够处理数万个处于 TIME_WAIT 状态的连接。

相关内容