类似 UNIX 的 Docker 容器中 TCP 套接字的默认 KeepAlive 值是多少?

类似 UNIX 的 Docker 容器中 TCP 套接字的默认 KeepAlive 值是多少?

我正在创建一个 TCP 套接字,如下所示:

_socket = new Socket(AddressFamily.InterNetwork, 
                     SocketType.Stream,
                     ProtocolType.Tcp);
if (Environment.OSVersion.Platform == PlatformID.Win32NT)
    _socket.ConfigureKeepAlive(true, 5000, 1000);

当我使用 Docker 容器时,它ConfigureKeepAlive()不会被执行,但这也意味着我不知道我的套接字将保持打开状态多长时间。当查看其源代码时,ConfigureKeepAlive()我看到如下内容:

socket.IOControl(IOControlCode.KeepAliveValues, keepAliveValues, null);

我不明白这段代码。谁能解释一下 TCP 套接字的默认 KeepAlive 值是什么以及如何从变量中读取该值_socket

提前致谢

Ps1.:特此平台信息供您参考:

Environment.OSVersion    {Unix 5.10.102.1}  System.OperatingSystem

编辑:Ps2.:供大家参考,特此提供一些对应Docker容器的信息:

# uname -a
Linux 0be4318feadd 5.10.102.1-microsoft-standard-WSL2 #1 SMP Wed Mar 2 00:30:59 UTC 2022 x86_64 GNU/Linux
# cd /proc/sys/net/ipv4
# cat tcp_keepalive_time
7200
# cat tcp_keepalive_probes
9
# cat tcp_keepalive_intvl
75

为什么 Docker 容器似乎在 ±5 分钟后断开连接,而tcp_keepalive_time相当于整整两个小时?

答案1

默认值取决于您的操作系统。

据我所知,大多数操作系统默认禁用 keepalive,这对应于零值。

通常,仅当您预计连接将长期存在且具有较长的安静期,并且如果不发送数据包连接可能会中断(例如,由于状态防火墙或按需连接)时,您通常会启用保活。

相关内容