Delphi:TIdTCPClient 断开连接不要关闭连接

ar0*_*968 1 delphi tcp indy delphi-10.1-berlin

我正在调查不断增长的活动 TCP 连接。

似乎TIdTCPClient.Disconnect没有关闭连接。

这是一个示例项目

program Project2;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils,
  IdTCPClient;

var
  FClient: TIdTCPClient;
begin
  try
    FClient := TIdTCPClient.Create();
    FClient.Connect('LOCALHOST', 6379);

    FClient.Disconnect;
    FClient.Free;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.
Run Code Online (Sandbox Code Playgroud)

多次打开此控制台应用程序会导致连接增加

netstat -na | find "6379"
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

旁注:我在柏林 10、Windows 7 上(但在 Windows 10 上是一样的)

Rem*_*eau 6

Disconnect() 正在关闭连接。该TIME_WAIT状态是正常的TCP行为。

无论哪个对等方首先主动关闭 TCP 连接(在本例中,是您的客户端),其套接字端点都会进入该TIME_WAIT状态,这是 TCP 的一项安全功能,可以丢弃该连接中剩余的任何杂散数据包。一旦TIME_WAIT超时,端点将在几分钟后完全释放。

在另一个对等点上,被动接收关闭通知的那个点,它的套接字端点CLOSE_WAIT改为进入状态,并ACK在另一个对等点关闭关闭后被释放。那边没有TIME_WAIT

请参阅TIME_WAIT 及其对协议和可伸缩客户端服务器系统的设计含义,其中对什么TIME_WAIT是、为什么存在以及如何有效地使用它进行了非常冗长的讨论。