我只需要帮助理解下图,但我会给出上下文背景。
我们有一个应用程序配置为使用端口 8080 上的代理并需要互联网访问。在一天中的任意时间,应用程序无法连接并死机。我们正在努力找出原因。我们已经排除了固件和代理 URL 规则(无论工作还是失败,它总是会访问相同的 URL)。我认为这个问题与代理本身的性能问题有关。为了弄清真相,我一直在发生这种情况时进行网络捕获。
如果您查看下图,您会发现它是删除了 IP 详细信息的片段。源“42”的第一行是客户端计算机通过端口 8080 上的代理 (IP 35) 发出 TLS 请求。 注意:它通常可以工作并请求相同的 URL/IP,但这是失败的一次。底部窗口是第一条绿线的详细信息。
突出显示的部分“下一个序列号”与 35(第 2 行到最后一行)最后返回的数据包的 ACK 匹配。这实际上是 35 回复客户端,声明它已收到发送给它的所有数据(这意味着设备已启动,因为它确认收到数据(意味着没有固件或网络问题))。请注意,它不会发回任何数据。此后客户端立即发出 TCP RST。这是我的解释,但我希望有人验证一下,因为我的 TCP 技能有点生疏。
客户端正在向代理发送某种形式的请求,但由于某种原因代理没有响应(在应用程序层)。由于代理确实回复了 TCP ACK,这意味着在网络层一切都很好。这意味着当数据通过网络堆栈传递到代理本身时,正是代理断开了连接。我还不知道为什么会这样,但我正在寻求澄清,以便我可以与代理团队交谈并告诉他们需要对此进行调查(他们认为这不是代理)。
支持我的观点的其他证据是,您在 RST 之前的图像中看到的前 4 行重复了很多次。同样,这意味着客户端正在重新发送它所收到的任何请求,但从未得到响应;然后它最终放弃并发出重置信号。
显然,代理前面有一个负载均衡器,而代理实际上是几台机器。我有一种感觉,其中一个后端存在问题,并且 LB 没有从池中删除该节点,因此可能会将数据发送到黑洞。
我正在寻求第二意见,根据捕获的结果,我上面的总结看起来是否准确?
不是立即。RST 是在服务器发送最后一个 ACK 后 30 秒由客户端发送的。
这些不是同一条线。它们的 ACK 值不同。
我的解释是,客户端正在发送一个具有更大负载的请求(因此来自服务器的多个 ACK 来确认这一点),然后期望代理发回响应。30 秒后没有响应,客户端将放弃并关闭与 RST 的连接。
目前尚不清楚代理为何不发送响应。可能是代理的问题。但也可能是上游服务器的问题,服务器只是将问题传播到客户端。
但请注意,解释可能是错误的。没有提供太多上下文和数据包捕获,因此这更像是一个有根据的猜测。