如何确定是啥在重置我的连接?
Posted
技术标签:
【中文标题】如何确定是啥在重置我的连接?【英文标题】:How do I determine what's resetting my connection?如何确定是什么在重置我的连接? 【发布时间】:2022-01-04 21:41:12 【问题描述】:我有一个基于TcpListener
和TcpClient
的客户端和服务器。客户端连接到服务器并交换一些数据。当我在本地运行时,一切正常。
但是当我将服务器放在 Azure 容器服务上的 Docker 容器中,并将客户端连接到它时,会发生以下情况:
客户端成功连接服务器 客户端和服务器成功握手 数据传输开始 大约 20 秒后(这应该需要几分钟)整个事情都爆炸了。服务器报告“对等方重置连接”,客户端报告“读取流结束时出错”。每一方似乎都认为另一方是有问题的一方。当我在本地运行时,一切都按预期工作,这让我相信问题介于两者之间。
建立连接没有根本问题,例如防火墙阻碍,因为我已在两端验证它们正在连接并执行握手。客户不是"slamming the phone down";它期待来自服务器的更多数据。但是“对等连接重置”意味着某处有人故意发送 RST 数据包。
有什么好的方法可以找出干扰我的数据传输的原因吗?
【问题讨论】:
关键是connection reset by peer。这意味着一方决定断开连接。由于您的客户端还报告 在流结束后读取错误,这将我指向 Internet 路由器(电缆调制解调器)或防病毒软件作为第一个罪魁祸首。您在客户端设置了哪种类型的网络/Internet/路由器?当我从家庭 Internet 看到类似问题时,我首先重新启动 Internet 路由器并重新启动计算机。然后我再次检查防病毒软件是否是我多次看到的问题的根源。 这似乎是针对 dba.stackexchange.com 或 serverfault 的 @JohnHanley 路由器或防病毒软件是否允许我连接并仅在几秒钟后才中断事情? 是的。家用路由器经常出现错误、内存不足、被 ISP 重置或光纤/电缆错误等。防病毒软件可以监控流量的行为,然后决定阻止连接。从您到主机的路径中的任何东西都可能中断您的连接。 您可以使用 Wireshark 在最低级别查看正在发生的事情。也许网络中发生了一些事情。 【参考方案1】:对于 Azure 容器服务(无论是 Azure 容器实例还是 Azure Kubernetes 服务),间歇性连接问题的主要原因是在建立新的出站连接时遇到限制。您可以达到的限制包括:
TCP 连接 SNAT 端口请看:
Detecting SNAT port exhaustion on Azure Kubernetes Service Troubleshooting intermittent outbound connection errors in Azure App Service(即使是关于 Azure 应用服务,大多数仍然适用)更多信息:
kube-proxy Subtleties: Debugging an Intermittent Connection Reset Fix a random network Connection Reset issue in Docker/Kubernetes【讨论】:
很好的信息链接,但这些不适用于已连接的连接。 我遇到过类似的情况,Azure Kubernetes 中的 Apache Ignite 服务器与 Azure Web 应用程序中的瘦客户端之间的通信问题。对等方的重置同时出现在服务器端和客户端。唯一的解决方案是在客户端使用指数退避重试逻辑。我断定这是 Azure 负载均衡器中的一个问题,也许我对调用过于激进 这不是建立新的出站连接;它是一个接收入站连接的服务器,只是在几秒钟后终止了它。 对于入站问题可能来自 Azure 容器实例负载均衡器空闲超时。如果不活动时间长于超时值,则无法保证客户端和云服务之间会保持 TCP 或 HTTP 会话。当连接关闭时,您的客户端应用程序可能会收到以下错误消息:“基础连接已关闭:预期保持活动状态的连接已被服务器关闭。”一种常见的做法是使用 TCP keep-alive。这种做法可以使连接保持更长时间的活动状态。 如果服务器达到 tcp 限制,即使是已建立的入站也可能会受到影响。在我的示例中,Apache Ignite 服务器接收并建立了一个入站连接,几秒钟后它抛出“对等方重置连接”,而瘦客户端抛出“无法从传输连接读取数据:连接尝试失败,因为连接方没有一段时间后正确响应,或者由于连接的主机未能响应而建立的连接失败.."以上是关于如何确定是啥在重置我的连接?的主要内容,如果未能解决你的问题,请参考以下文章