为什么到环回接口的TCP连接最终会
TIME_WAIT
(插座闭合
SO_DONTLINGER
设置),但到其他主机的相同连接不会以
时间等待
(它们立即重置/销毁)?
以下是要说明的场景:
(A)两个应用程序(客户端和服务器)都在同一台Windows计算机上运行。客户端通过服务器的环回接口(127.0.0.1,端口XXXX)连接到服务器,发送数据、接收数据并关闭套接字。(
索登多林格
设置)。
假设连接是
非常
短暂的,所以客户端应用程序每秒建立和破坏大量的连接。最终的结果是套接字以
时间等待
,客户端最终会耗尽其最大套接字数(在Windows上,默认情况下为~3900,我们假设不会在注册表中更改此值)。
(B)与场景(A)相同的两个应用程序,但服务器位于不同的主机上(客户端仍在Windows上运行)。连接在各个方面都是相同的,除了它们不是为127.0.0.1而准备的,而是一些其他IP。在这里,客户机上的连接不会进入
时间等待
,客户端应用程序可以无限期地继续进行连接。
为什么存在差异?