为什么到环回接口的TCP连接最终在TIME_WAIT
(套接字关闭SO_DONTLINGER
设置),但与{1}}的相同连接不同于TIME_WAIT
(它们会立即重置/销毁)?
以下是用于说明的方案:
(A)两个应用程序(客户端和服务器)都在同一台Windows计算机上运行。客户端通过服务器的环回接口(127.0.0.1,端口xxxx)连接到服务器,发送数据,接收数据并关闭套接字(SO_DONTLINGER
已设置)。
假设连接非常是短暂的,因此客户端应用程序每秒都会建立并销毁大量连接。最终的结果是套接字最终在TIME_WAIT
,并且客户端最终耗尽其最大套接字数量(在Windows上,默认情况下为~3900,我们假设此值不会在注册表)。
(B)与场景(A)相同的两个应用程序,但服务器位于不同的主机上(客户端仍在Windows上运行)。这些连接在各方面都是相同的,除了它们的目的地不是127.0.0.1,而是其他一些IP。客户端计算机上的连接不会进入TIME_WAIT
,客户端应用程序可以继续无限期地建立连接。
为何出现差异?
答案 0 :(得分:3)
TIME_WAIT状态仅发生在连接的一端 - 首先关闭的结束。对于环回接口,两端都在同一台机器上,因此您将始终看到TIME_WAIT。
在您的其他情况下,请尝试查看其他计算机。我想你会在那里看到TIME_WAIT套接字。