网络限速方法?

yby4769250 2011-11-23 12:59:33
比如像BT这样的软件,可以对上传和下载进行最大速度的限制,但是,这个限速的原理是什么?肯定先排除Sleep。
我搜了一下,有提到下载端不要快速地读掉socket缓冲区中的数据,而是定时的去读,这个道理可以理解,但是,这有一个问题,定时去读的话,会导致socket的缓冲区经常处于满状态,速度是限制了,但是,传输速度却也高不了。我想到的是,同样是从TCP缓冲区的角度去考虑,利用TCP滑动窗口机制,当我检测到接收端的速度达到临界值之后,我把滑动窗口的大小马上改为很小很小,1byte,或者0,socketopot里面不知道有无这个操作。通过这样的操作,使得发送端这个时候只能发送微小的数据,但是又不能不发,当速度降下来之后,又把窗口的值慢慢改大,一个动态的过程。

不知道限速的做法有经验的都是怎么弄的?真心求教~
...全文
1167 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
zjcqoo 2012-11-05
  • 打赏
  • 举报
回复
需要那么复杂吗?应用层就可以实现的事。 迅雷的限制其实也不准的。比如限制200k,实际速度也有很大的波动。 上传限速很简单,当前1000ms内发送字节快接近上限的话,剩下的时间就不发送数据了。 http下载的话,降低request的间隔时间,或减少线程,每秒收到的数据就变少了。 p2p的话,需要服务器参与。让服务器根据你的速度需求维护数据转发
Joseph-Growth 2012-10-19
  • 打赏
  • 举报
回复
首先分析这个速度是如何计算的。
发送/接收的频率*缓冲区大小?

如果是这样,我倒有办法帮你。你可以设置接收/发送缓冲区的低水位值的大小。当发送频率大的时候,增大发送缓冲区低水位值。反之。当接收频率大时,增加接收缓冲区低水位值。

这样没准能达到你说的限速问题。
丧心病狂的我 2012-10-19
  • 打赏
  • 举报
回复
编程小白菜鸟实习一个,前来观摩学习。
有点懂,但又不是很懂。
baoyz 2012-07-10
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]
下载和上传的部分代码应该是你自己写的吧?
我也写过类似的限速下载的程序。加一个速度记录INT。
各线程下载时累加INT的值,当该INT大于设定下载网速是,停止下载代码的运行。
每秒清零一次。
[/Quote]

我就是这么干的 。
ajsamr88 2012-07-04
  • 打赏
  • 举报
回复
.防火墙都是这么搞的.
albertcorleone 2012-07-04
  • 打赏
  • 举报
回复
楼主提的好问题,理论上应该是制造一个count值,超过这个值就不读了。
你所说的慢慢发送,除非是改写驱动,很明显p2p并非这样。
从内核模型说起,tcp/ip协议好像对时间并没有定义,只是一方不停send,一方不停recv。发送时数据放入send buffer,然后再发送出去。如果send buffer已经满了,里边的数据没有发送出去,此时继续调用send会失败或是一直阻塞着,取决于你使用的是同步或是异步模型。recv时道理也相同,recv buffer数据满了时还没有读取就不再接收数据了。所谓的滑动窗口就是这个东西,他通常反映的是对方内核buffer的能力,当对方buffer满了时tcp窗口会通告发送方对方已经无能力接收了,省点力气吧。
setsockopt即使把buffer设置为1,只要网速够快也一样起不到限速的作用。此外,还会因为频繁调用send,recv导致cpu消耗过高,反倒不是一个好选择。最好方案是超过count值就不再发送或接受,此时recv或send方的buffer会迅速被数据充满,从而不再发送数据了,带宽被节约出来给其他程序了。

choday 2011-12-08
  • 打赏
  • 举报
回复
让他 的send,recv,sendto,recvto,wsa系统函数延时就可以了,目前我就这样做的
自己写lsp或者winsocket hook就搞定
wlwlxj 2011-12-07
  • 打赏
  • 举报
回复
应用层加throttle ,异步读取拆分成小的原子块,排队读写网络,大概就是这样,底层方式有点...
meyers_007 2011-12-05
  • 打赏
  • 举报
回复
RSVP协议
czydxj 2011-12-02
  • 打赏
  • 举报
回复
提速费劲,限速还能难吗!
用户 昵称 2011-11-28
  • 打赏
  • 举报
回复
限自己的速,就是边传输 边 计算当前速度,如果网络连不上的话,那么速度就是0就行了。
Yofoo 2011-11-28
  • 打赏
  • 举报
回复
上传 比如重写send 函数, 如果超出速度, 可以返回失败, 错误用缓冲满
下载 recv 用sleep也是很正常的
smwhotjay 2011-11-25
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 yby4769250 的回复:]
引用 6 楼 smwhotjay 的回复:
限速.限制send recv就行了.防火墙都是这么搞的.


send和recv也是操作socket的缓冲区,如果不让recv或者定时recv的话,又回到了上面那个问题
[/Quote]
防火墙dll hook目标进程啊
baoyz 2011-11-25
  • 打赏
  • 举报
回复
下载和上传的部分代码应该是你自己写的吧?
我也写过类似的限速下载的程序。加一个速度记录INT。
各线程下载时累加INT的值,当该INT大于设定下载网速是,停止下载代码的运行。
每秒清零一次。
yby4769250 2011-11-23
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 smwhotjay 的回复:]
限速.限制send recv就行了.防火墙都是这么搞的.
[/Quote]

send和recv也是操作socket的缓冲区,如果不让recv或者定时recv的话,又回到了上面那个问题
smwhotjay 2011-11-23
  • 打赏
  • 举报
回复

限速.限制send recv就行了.防火墙都是这么搞的.
xhz2000 2011-11-23
  • 打赏
  • 举报
回复
关注此贴! 我也有这方面的需求。
yby4769250 2011-11-23
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 aaadddzxc 的回复:]

崩想了。WINDOWS 下的话就做 NDIS 驱动吧。
[/Quote]
这个功能不会涉及到这么底层的东西吧
yby4769250 2011-11-23
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 chenjiawei007 的回复:]

NDIS层做驱动是啥都能搞 ,但这层的开发能熟练winpcap的人也不多吧。

说到bt,迅雷都有对下载的限速,这类文件传输都是采用p2p协议,当然像迅雷这样成熟的公司,p2p协议一定丰富了许多自己的算法。

要实现这个功能方式有许多,如果不做限制,如果你带宽良好,传输速率就是服务器数据的比特率。实现可以有两种思路,一:告诉服务器降低比特率,二:客户端接收效率降低。以前自己这样做过,但是……
[/Quote]

第一种思路正是我在考虑的,因为服务器也是自己写的,但是,有一种情况,像从FTP、Web服务器下载,这是服务器都不是自己写的,一思路就不可行。我的服务器协议通道还是很容易扩展的,准备实践一下一思路
chenjiawei007 2011-11-23
  • 打赏
  • 举报
回复
NDIS层做驱动是啥都能搞 ,但这层的开发能熟练winpcap的人也不多吧。

说到bt,迅雷都有对下载的限速,这类文件传输都是采用p2p协议,当然像迅雷这样成熟的公司,p2p协议一定丰富了许多自己的算法。

要实现这个功能方式有许多,如果不做限制,如果你带宽良好,传输速率就是服务器数据的比特率。实现可以有两种思路,一:告诉服务器降低比特率,二:客户端接收效率降低。以前自己这样做过,但是是个人写着玩的,不是商业级的开发。
加载更多回复(2)
^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ 软件说明: 可突破任意ARP防火墙,以限制流量为目标的简单网络管理软件。 使用方法: 1.在参数设置中选择好工作网卡; 2.检查网关信息和本机信息是否正确,如果不正确,请手动输入,无需保存; 3.点击流量探测或手动添加或自动扫描以填充目标列表; 4.设置一个代理,最好不同于目标,代理设置后,只有代理主机会收到伪流量; 5.选择要限制网速的主机; 6.开始控制。 V3.31 更新说明 1.修正不能设置代理的BUG; 2.修正延时探测 无法自动释放内存的BUG; 3.增加Radar绘图开关,以满足部分不能很好支持绘图的机器 4.增加自动更新 5.增加多主机选择 6.重新定义版本序列为 *.* 格式 v3beta2 更新说明: 1.修正流量探测容易被防火墙发现的BUG 2.修正流量计数器BUG 3.增加自动保存功能 4.增加ALT+W老板键功能 5.界面调整 v3beta 更新说明: 1.增加MAC厂商显示; 2.更新出现本机IP的bug; 3.增加代理功能 4.增加检测相同产品功能,当发现skiller v2 时,状态栏文字会变红,并且提示; 5.增加整体网络负载显示; 6.界面调整 7.更新流量统计单位 v2beta2 更新说明: 增加被动探测功能 v2beta1 更新说明: 增加流量探测功能 使用说明: 1.点击流量探测或手动添加或自动扫描以填充目标列表 2.选择要限制网速的主机 3.开始控制 特别注明: 集成了无ARP欺骗的上行,下行,劫持。过任意ARP防火墙,流量探测为抽样探测模式,流量探测时强度可调高些。 注意:本版本无需安装winpcap ,需安装.net framework 2.0,不支持无线网卡。 bugs mailto:cncert.net@gmail.com 更新版本请手动检查 http://www.cncert.net 官方网站。

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧