为什么与环回接口的 TCP 连接最终会出现TIME_WAIT
(套接字关闭并SO_DONTLINGER
设置),但与不同主机的相同连接不会结束TIME_WAIT
(它们会立即重置/销毁)?
以下是用于说明的场景:
(A) 两个应用程序,一个客户端和一个服务器,都在同一台 Windows 机器上运行。客户端通过服务器的loopback接口(127.0.0.1,端口xxxx)连接服务器,发送数据,接收数据,关闭socket(SO_DONTLINGER
设置)。
假设连接非常短暂,因此客户端应用程序每秒都在建立和销毁大量连接。最终结果是套接字最终在 中TIME_WAIT
,并且客户端最终耗尽了它的最大套接字数(在 Windows 上,默认情况下约为 3900,我们假设此值不会在注册表中更改)。
(B) 与场景 (A) 相同的两个应用程序,但服务器在不同的主机上(客户端仍在 Windows 上运行)。这些连接在各方面都是相同的,只是它们的目的地不是 127.0.0.1,而是其他一些 IP。这里客户端机器上的连接不会进入TIME_WAIT
,客户端应用程序可以无限期地继续建立连接。
为什么会出现差异?