我正在使用专有工具从软件提供商处下载软件。在后端,它是一个 java 应用程序,它使用普通的 http(或可选的 https)来检索软件。
但是最近下载失败了。请注意,我无权访问下载工具的源代码,并且我在代理服务器后面。该工具在开始实际下载之前多次连接到同一主机。这些连接通常是成功的,尽管它们看起来有些慢(当然这是主观的)。
该工具执行一些日志记录,当它失败时,我们会得到这个异常:
java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(SocketInputStream.java:168)
at java.io.BufferedInputStream.read1(BufferedInputStream.java:256)
at java.io.BufferedInputStream.read(BufferedInputStream.java:317)
at sun.net.www.MeteredStream.read(MeteredStream.java:116)
at java.io.FilterInputStream.read(FilterInputStream.java:116)
at sun.net.www.protocol.http.HttpURLConnection$HttpInputStream.read(HttpURLConnection.java:2676)
通过wireshark收听时,我看到了一些奇怪的行为(或者至少是我未经训练的眼睛所特有的)。下载将“正常”进行一段时间,直到发生这种情况:
- 我们的服务器不会为特定数据包发送 ACK
- 代理服务器(超时后)执行重传
- 我们的服务器发送一个 ACK
- 直到正好 3 分钟(代理服务器上配置的超时)之后才出现更多流量,代理发送 TCP RST,我们得到上述 java 错误
一些额外的信息:
1)我还可以访问不在我们网络上的亚马逊服务器,它可以顺利执行下载。我们已经要求至少 2 个人在不同的网络上尝试下载,并且它运行良好。
2) 我们一直使用相同的服务器和代理连接到其他 http/https 站点没有问题,这包括不时的大下载