2

我目前正在尝试使用我们的一款产品中的 FTP 上传功能来调试客户的问题。该功能允许客户将文件 (< 1MB) 上传到中央 FTP 服务器以进行进一步处理。FTP 客户端代码是用 VB.NET 内部编写的。

客户报告在尝试上传 300KB 到 500KB 范围内的文件时收到“远程主机强制关闭连接”错误。但是,我们使用更大的文件(相对而言)(即 3MB 及以上)在内部对此进行了测试,但从未收到此错误。我们使用相同的 FTP 登录凭据上传到客户端连接到的同一 FTP 服务器,唯一的区别是我们是在办公室完成的。

我知道 TCP 协议具有内置的流量控制,因此在单个 Send 调用中发送多少数据并不重要,因为该协议会相应地限制自己以匹配服务器的内部限制(如果我没记错的话。 ..)

因此,我唯一能想到的是,客户端和路由器之间的中间主机人为地对客户端进行限速并断开连接(我们以 512 字节块的形式循环发送文件数据)。

这是用于发送数据的循环(缓冲区是包含文件数据的字节数组):

            For i = 0 To buffer.Length - 1 Step 512
                mDataSocket.Send(buffer, i, 512, SocketFlags.None)
                OnTransferStatus(i, buffer.Length)
            Next

客户的 ISP(或他们自己的防火墙)是否有可能对我们的客户端代码在给定时间段内可以发送的数据量施加人为的速率限制?如果是这样,处理这种情况的最佳方法是什么?我想显而易见的解决方案是在我们的发送循环中引入延迟,除非有办法在套接字级别执行此操作。

对我来说,ISP 会通过终止客户端连接来处理速率限制违规,这似乎真的很奇怪。为什么他们不只依赖 TCP/IP 的内部流量控制/节流机制?

4

5 回答 5

2

搜索 Comcast 和 BitTorrent。这是一篇文章

于 2008-09-29T22:07:05.913 回答
1

尝试隔离问题:

  • 让客户将相同的文件上传到不同的服务器。也许问题出在客户端的... FTP 客户端。
  • 从客户端获取文件并自己与客户端一起上传,看看是否可以重现该问题。

最后,即使 3MB 的文件可以正常工作,500KB 的文件也不能保证正常工作,因为问题可能取决于状态,并且在结束文件传输时发生。

于 2008-09-29T22:09:53.113 回答
1

是的,ISP 可以在他们认为合适的情况下对数据包施加限制(尽管这在道德上是有问题的)。例如,我的 ISP 在切断其硬件设法嗅出的任何 P2P 流量方面没有问题。它称为流量整形

然而,对于 FTP 流量来说,这是极不可能的,但你永远不知道。问题是,他们永远不会通过流量整形丢弃你的套接字,他们只会丢弃数据包。tcp 协议在每个 pear 端处理,因此您可以丢弃其间的所有数据包并且套接字保持活动状态。在某些情况下,如果其中一台计算机崩溃,如果您不尝试使用它,则该套接字仍然存在。

我认为你最好的选择是客户端的防火墙/代理配置不好。这里有更好的解释。

客户端安装上的路由器或电缆有故障或配置错误。

于 2008-09-29T22:24:10.770 回答
1

这些天500k非常小,所以如果他们限制这么小的东西,我会有点惊讶。

我知道你已经在分块你的请求,但你能确定是否有任何数据被传输吗?代码是否总是在同一个循环点失败?您可以查看 ftp 服务器日志吗?整个堆栈跟踪呢?您是否尝试过联系 ISP 并询问他们有哪些政策?

也就是说,假设某些数据可以通过,一种想法是 ISP 具有流量整形功能,并且在写入 x 个字节后执行规则。可能发生的情况是在 data > x 时,套接字超时在数据发送之前到期,引发异常。

请记住,ftp 客户端会为数据传输创建另一个连接,但如果服务器检测到控制连接已关闭,它通常会终止数据传输连接。所以要检查的另一件事是确保控制连接仍然存在。

最后,ftp 服务器通常支持可恢复传输,所以如果所有其他补救措施都失败了,恢复失败的传输可能是最简单的解决方案。

于 2008-09-29T22:55:11.897 回答
0

我不认为 ISP 会尝试终止 500KB 的文件传输。我不是套接字事物或 ISP 方面的专家……只是就此事发表我的看法。

于 2008-09-29T21:54:45.160 回答