net中的低优先级http上传



我正在编写一个上传大量数据的程序,我需要限制它对网络浏览和其他用户活动的干扰。

上传由许多单独传输的大型ish文件组成,连接必须是标准的HTTPPOST(我无法控制服务器),我需要控制HTTP头(服务器使用它们进行身份验证和元数据)

重要的是,当用户不再使用互联网时,上传将恢复全速,否则它将永远无法完成(我预计它需要全速运行一周或更长时间才能完成)。

我想通过某种方式降低HTTP连接的优先级来解决这个问题,检测打开的浏览器窗口并放慢速度并不能解决问题,因为(a)用户可能正在使用非浏览器应用程序(FTP、twitter客户端、电子邮件等),以及(b)如果有打开的空闲web浏览器窗口,我不想放慢速度。

我找到了BITS,但我认为它与我无关,因为我需要它作为标准的HTTPPOST。

我使用的是.net 3.5,程序是用C#编写的,我目前使用的是HttpWebRequest进行上传。

澄清:我正在编写消费者软件,该软件将在客户家中的个人电脑上运行。我的测试人员抱怨他们运行我的程序时互联网速度慢(这是可以理解的,因为我正在使用他们所有的带宽),所以我想给其他程序更高的优先级,这样他们的互联网就不再慢了。

没有可以对网络上的数据包进行优先级排序的高级网络基础设施,也没有IT团队来安装和配置任何东西,我确实预计大多数客户都会有一个从ISP 免费获得的廉价无线路由器

同时使用System.Net.NetworkInformation.Pv4InterfaceStatistics类的bytesSent属性在给定的时间间隔内跟踪应用程序发送的字节数和在网络上发送的总字节数。从网络上发送的总字节(在同一时间间隔内)中减去应用程序在该时间间隔内发送的字节总数。如果差异足够大,以至于你需要限制上传,那么就这样做。一旦差异足够小,就加大上传速度。

我希望你已经解决了这个问题的节流端,所以你只需要知道两件事:

  • 何时降低上传速度

  • 减少多少

现在,使用其他API-s可能很好,但当你可以做一些更简单的事情时,为什么要学习它们并引入所有新的bug生成器呢。

现在,大多数互联网连接(比如ADSL)上传的问题是,它们消耗的宝贵UPLOAD非常有限,比如256-512k。用户可能会报告这些问题,因为你的上传会扼杀他们发送的请求,所以他们无法取回任何数据。

我建议你做两件事。。。要解决WHEN问题,请执行以下操作:

  • 为您的web服务器创建简单的GET请求
  • 通过读取到最后的响应,测量服务器完全处理和响应所需的时间
  • 对"繁忙"one_answers"空闲"连接使用一个截止值,或者测量每个客户端的时间并计算其截止值
  • 如果时间比较长,你很忙,就节流,否则全速前进
  • 你可以尽可能多地重复这个,例如每分钟

解决多少是另一个问题。首先,你应该衡量在没有其他人使用连接的情况下你能上传多少——你每个客户端的基线上传速度。然后,使用WHEN技术,你可以减少上传,直到你得到对他们的连接有效的"免费"结果。

希望我把自己说清楚了——问问是否有什么需要澄清的。

编辑:

还有几件事需要考虑:

  1. 通过POST发送二进制数据是浪费的,因为所有的数据都是在BASE64中编码的。您应该检查一些其他上传方式
  2. 对web服务器进行节流可能是个问题,因为如果上传大块数据的速度较慢,服务器可能会超时
  3. 如果您组合1+2,您可以设计一个计划,将数据拼接成块,比如1KB或更大,然后逐个发送。如果您以串行化的方式进行操作,它本身就可以解决您的节流问题

您可能会考虑采取更被动的方法来解决这个问题。您只需将应用程序生成的数据包设置为比来自系统的其他数据包更低的优先级。然后让网络负责调度数据包。

根据我的经验,即使是低端消费者网络设备(个人防火墙、网关、电缆调制解调器、DSL调制解调器,甚至Windows操作系统等)也支持流量整形。使用此功能并将您生成的流量设置为低优先级,如果未明确设置优先级,则所有其他数据包将默认为中等优先级。当媒体数据包存在时,它们将被分配大部分可用带宽,你的三分之一将被挤出。当网络上不存在中等优先级的数据包时,您的数据包将被允许使用可用带宽。

由于我自己还没有尝试过这些,所以我只能提供指针。

为了检测网络活动,您可以尝试使用NMAPI或数据包监视器

WinPCap也有一个端口。Net库,但不确定它是否捕获了http流量。

除此之外,中没有QoS库。净AFAIK。

如果您愿意深入研究C++,那么QoS API会有所帮助。

所有这些都不是直截了当的,看看你的评论,我不确定这在你的时间表内是否可行,但事实就是这样。对不起!

跳出框框思考:

仅仅扫描人类活动:键盘和鼠标的动作,屏幕保护程序的存在,或者锁定的屏幕?然后,当没有用户在电脑前时,你可以全速上传,否则,以最低速率上传。

我不知道如何实现它。NET,但你不能做一个到服务器的往返时间(RTT)的较小测试吗?如果你喜欢结果,你会增加包负载。如果你的客户端出现"拥塞",那么你可能应该有一个更长的RTT,然后降低负载?

我会选择一种解决方案,在该解决方案中,您可以获得机器的最大上传速度,如果您的应用程序没有上传,如果有任何网络流量,则每5秒"轮询"一次。

这应该确保你不会吃掉所有的网络流量,但大部分时间都有最高速度。

提供类似比特洪流的最大带宽上限是不可能的吗?您可以根据一天中的时间调整上限(例如,午夜全速,高峰时段50%),或者为用户提供配置最大速度和调度选项的选项。

最新更新