我正在创建一个 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,这对应于零值。
通常,仅当您预计连接将长期存在且具有较长的安静期,并且如果不发送数据包连接可能会中断(例如,由于状态防火墙或按需连接)时,您通常会启用保活。