代码之家  ›  专栏  ›  技术社区  ›  Mike Spross Alex Martelli

套接字编程:一些ISP是否对FTP上传施加速率限制?

  •  2
  • Mike Spross Alex Martelli  · 技术社区  · 17 年前

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

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

    因此,我唯一能想到的是,客户端和路由器之间的中间主机人为地限制了客户端的速率并断开了它的连接(我们以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 回复  |  直到 13 年前
        1
  •  2
  •   Mark Ransom    17 年前

    搜索Comcast和BitTorrent。这是 one article

        2
  •  1
  •   xmjx    17 年前

    尝试隔离问题:

        3
  •  1
  •   Caerbanog    17 年前

    是的,ISP可以在他们认为合适的时候对数据包进行限制(尽管这在道德上是有问题的)。以我的ISP为例,它的硬件能够嗅出任何P2P流量,这一点都没有问题。它叫 traffic shaping

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

    here

    或者是客户端安装的路由器或电缆有故障或配置不当。

        4
  •  1
  •   Robert Paulson    17 年前

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

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

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

        5
  •  0
  •   Mostlyharmless    17 年前

    推荐文章