套接字编程:有些ISP对FTP上传施加了速率限制吗?

时间:2008-09-29 21:52:21

标签: .net networking sockets

我目前正在尝试使用我们的某个产品中的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的内部流量控制/限制机制?

5 个答案:

答案 0 :(得分:2)

搜索Comcast和BitTorrent。这是one article

答案 1 :(得分:1)

尝试隔离问题:

  • 让客户将同一文件上传到其他服务器。也许问题出在客户的... FTP客户端。
  • 从客户端获取文件并自行将其上传到您的客户端,看看您是否可以重新解决此问题。

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

答案 2 :(得分:1)

是的,ISP可以根据需要对数据包施加限制(尽管在道德上有问题)。例如,我的ISP在削减其硬件设法嗅探的任何P2P流量方面没有问题。它被称为traffic shaping

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

我认为最好的选择是客户端的防火墙/代理配置错误。更好的解释here

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

答案 3 :(得分:1)

这些天,500k是非常小的,所以如果他们扼杀一些小的东西,我会有点惊讶。

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

也就是说,假设某些数据通过,一个想法是ISP有流量整形,并且规则在写入x字节后启用。可能发生的事情是数据&gt; x套接字超时在数据发送之前到期,抛出异常。

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

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

答案 4 :(得分:0)

我不认为ISP会试图杀死500KB的文件传输。我既不是套接字的专家,也不是互联网服务供应商的专家...只是就此事提出我的想法。