Java 什么会导致TCP/IP在不中断连接的情况下丢弃数据包?

Java 什么会导致TCP/IP在不中断连接的情况下丢弃数据包?,java,http,tomcat,tcp,Java,Http,Tomcat,Tcp,我有一个基于web的应用程序和一个客户端,都是用Java编写的。值得一提的是,客户端和服务器都在Windows上。客户端通过HTTP GETs发出消息。服务器最多会阻塞一分钟,如果在这一分钟内客户端没有收到任何消息,服务器将不返回HTTP 204内容。否则,一旦为客户机准备好消息,它就会返回HTTP 200 OK正文 让我感到困惑的是:对于特定的客户端子集(总是具有明显不稳定的网络连接的客户端),客户端发出GET,服务器接收并处理GET,但客户端永远处于静止状态。启用客户端的调试日志,我看到Ht

我有一个基于web的应用程序和一个客户端,都是用Java编写的。值得一提的是,客户端和服务器都在Windows上。客户端通过HTTP GETs发出消息。服务器最多会阻塞一分钟,如果在这一分钟内客户端没有收到任何消息,服务器将不返回HTTP 204内容。否则,一旦为客户机准备好消息,它就会返回HTTP 200 OK正文

让我感到困惑的是:对于特定的客户端子集(总是具有明显不稳定的网络连接的客户端),客户端发出GET,服务器接收并处理GET,但客户端永远处于静止状态。启用客户端的调试日志,我看到HttpClient仍在等待响应的第一行

服务器上没有抛出异常,至少任何地方都没有记录任何内容,Tomcat和我的webapp都没有。根据调试日志,有迹象表明服务器成功响应了客户端。但是,客户没有收到任何东西的迹象。客户端无限期地挂起。这在会话超时并且客户端采取导致另一个线程发出HTTP POST的操作后变得很明显。当然,POST失败是因为会话已过期。在某些情况下,从会话到期到客户端发出POST并发现这一事实之间已经过去了数小时。在整个过程中,
executeMethod
仍在等待HTTP响应行

当我使用WireShark查看导线级别的实际情况时,不会发生此故障。也就是说,对于特定的客户端,此故障将在几个小时内发生,但当WireShark在两端运行时,这些相同的客户端将在一夜之间运行14小时,而不会出现故障

还有人遇到过这样的事情吗?到底是什么原因造成的?我认为TCP/IP即使在短期的网络故障中也能保证数据包的传输。如果我设置了一个SO_超时,并在超时后立即重试请求,那么重试总是成功的。(当然,我会首先响应超时请求并释放连接,以确保使用新的套接字。)


想法?思想?Java是否有一些TCP/IP设置或Windows中的注册表设置可用于对丢失的数据包进行更积极的TCP/IP重试?

这些计算机是否安装了病毒/恶意软件?使用wireshark安装winpcap(),这可能会覆盖恶意软件所做的更改(或者恶意软件可能只是检测到它正在被监控,而不尝试任何可疑的操作).

我还没有看到这一点本身,但我看到过类似的问题,即大型UDP数据报会导致IP碎片,从而导致拥塞并最终丢弃以太网帧。由于这是TCP/IP,我不认为IP碎片是一个大问题,因为它是一个基于流的协议

我要注意的一点是,TCP不能保证交付
话虽如此,我将把客户机和监控机连接到集线器。在监控机器上运行Wireshark,您应该能够看到发生了什么。我确实遇到了与HTTP请求之间的空白处理和不正确的HTTP块大小相关的问题。这两个问题都是由于手写HTTP堆栈造成的,因此只有在使用片状堆栈时才会出现问题。

忘记刷新或关闭主机端的套接字可能会间歇性地对短响应产生这种影响,具体取决于可能受任何监控机制影响的时间


尤其是忘记关闭会使套接字悬而未决,直到GC开始回收它并调用finalize()。

如果您丢失数据,很可能是由于软件错误,在读库或写库中。

您是否绝对确定服务器已成功地将响应发送到似乎失败的客户端?我的意思是服务器已经发送了响应,而客户端已经将该响应返回给服务器。您应该在服务器端使用wireshark看到这一点。如果您确定这发生在服务器端,而客户端仍然没有看到任何内容,则需要从服务器上进一步查看链。是否涉及任何代理/反向代理服务器或NAT

TCP传输被认为是一种可靠的协议,但它不能保证传输。操作系统的TCP/IP堆栈将非常努力地使用TCP重传将数据包传送到另一端。如果发生这种情况,您应该在服务器端的wireshark中看到这些。如果您看到过多的TCP重传,通常是网络基础设施问题,即硬件/接口不好或配置错误。TCP重传对于短时间的网络中断非常有效,但在中断时间较长的网络上性能较差。这是因为TCP/IP堆栈仅在计时器过期后发送重传。此计时器通常在每次不成功的重新传输后加倍。这是为了避免已经存在问题的网络中充斥着重传。正如您所想象的,这通常会导致应用程序出现各种各样的超时问题

根据您的网络拓扑,您可能还需要在网络中的其他中间位置放置探测器/wireshark/tcpdump。这可能需要一些时间来找出数据包的去向

如果我是你,我会一直用wireshark监控,直到问题再次出现。很可能会。但是,听起来你最终会发现的是你已经提到过的——易碎的硬件。如果修复脆弱的硬件是不可能的,那么您可能只需要在ext中构建