WSL2 + Docker - TCP协议栈中的Keep Alive Bug问题

4

我想知道其他人是否注意到了WSL2 Debian实现TCP的这个问题。

我正在从运行WSL2 Debian v. 20 的Docker容器连接。TCP客户端每秒发送一次Keep-Alive数据包,这有点过度。然后大约5分钟后,客户端没有任何原因就终止了连接。有人看到这种行为吗?

您可以通过只打开telnet会话到另一个主机来重现此问题。但是这种行为也会发生在其他类型的套接字上。

在你问之前,这个问题不是由服务器引起的,当从其他主机打开相同的TCP连接时,它不会发生。

wireshark捕获空闲TCP连接最后几秒钟的转储


1
默认的TCP保活参数可以被覆盖,此外应用程序可以基于每个套接字设置TCP保活参数;并不是TCP的实现必然决定它们。捕获中的TCP连接正常终止。某些应用层终止了连接。我认为在捕获中没有任何暗示TCP错误的东西。您可能想尝试netcat-keepalive(https://github.com/cyberelf/netcat-keepalive),以查看当您指定自己的保活参数时会发生什么。 - JimD.
2个回答

2
我在WSL2上使用Ubuntu时也遇到了同样的问题。如果连接无活动,那么出站ssh连接会在一段时间后关闭。如果你正在运行没有屏幕输出的应用程序,这可能会特别麻烦。
我怀疑将wsl连接到本地网络的内部路由器会断开空闲的TCP连接。
解决方法是缩短/proc/sys/net/ipv4中TCP keep-alive计时器的时间,以下内容适用于我:
echo 300 > /proc/sys/net/tcp_keepalive_time
echo 45  > /proc/sys/net/tcp_keepalive_intvl

0

所以我解决了这个问题。不幸的是,WSL2 实现的 Debian 似乎在堆栈中硬编码了这个问题。我尝试更改套接字打开调用的参数,但它们并没有改变行为。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接