首页
社区
课程
招聘
关于数据传输速度的问题
发表于: 2011-4-3 17:28 5841

关于数据传输速度的问题

2011-4-3 17:28
5841
我用这个代码传输数据:
while(...)
{
send(s, buff, sizeof(buff), 0);
}

另一边这样收数据:
while(...)
{
recv(s, buff, sizeof(buff), 0)
PostMessage(...);
}

也就是差不多无限发送。
可是实际的上传速度远远没有达到迅雷的下载速度。(迅雷能到120+KB/s, 我的只到70+KB/s)

这是为什么呢?
看互动百科上面的介绍,这样的传输速率应该接近临界了,可是为什么差距还是很大呢?

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (9)
雪    币: 27
活跃值: (127)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
2
ADSL。。
2011-4-3 19:28
0
雪    币: 1240
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
这问题挺有趣,也很难回答,因为限制带宽的因素太多了。
楼上是个正解,ADSL的上传速度只有512K(哪怕你下载有4兆),如果你是ADSL,那多半就是这问题了。
因外的可能是QOS,可能是你本机,也可能是对端,只要有一个环节对QOS作了限制,速度就会上不去。
可以试试同时开两个线程上传,看看速度有没有提升
或者换个网络环境试试
2011-4-3 20:24
0
雪    币: 30032
活跃值: (2572)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
"可是实际的上传速度远远没有达到迅雷的下载速度。(迅雷能到120+KB/s, 我的只到70+KB/s)"
请你先确定,你是用上传速度跟讯雷的下载速度比较.(上传速度跟下载速度是不对等的).

如果你是用下载速度跟讯雷的下载速度比较,还是慢,我再继续作答.
2011-4-3 21:47
0
雪    币: 143
活跃值: (61)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
5
好!明天,我去试试下载和双线程^_^
2011-4-3 22:42
0
雪    币: 246
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
1、通常普通用户使用的ADSL是非对称数字用户环路,上行带宽和下行带宽差很多,比如某地的情况为:
   带宽    上行        理论值(bps)           实际
   1M      上行        256K          32K~200K
   2M      上行        384K          32K~330K
   3M      上行        512K          32K~450K
   4M      上行        640K          32K~550K
   12M     上行        768K          32K~700K
   16M     上行        1M            ADSL上行带宽最高为1M。
      
        512Kbps的上行带宽 = 64K字节/S,这还不是有效数据(净荷)传输速率,净荷传输速率还要减去协议的消耗(如:IP头、tcp头等)。
 
2、用迅雷下载时,数据源可能具有大的上行带宽和你的大下行带宽配套,从而形成较大的下载速度;即使数据源也是普通用户,由于迅雷采用多线程下载,即它可以同时从多个数据源同时下载,从而把多个数据源的上行带宽组合起来形成较大的带宽,而你的程序是单线程只具有一个数据源,必受制于数据源的实际上行有效带宽,所以你达不到迅雷的下载速度(即使你的传输速率接近临界)。
 
3、另外,每个包传输的有效数据的长度也会影响净荷传输速率,即在其他条件不变的情况下,每个包发送1字节和发送1K字节所获得最大传输速率是不一样的。有效数据越长净荷传输速率越高。

因此,如果你采用多线程(比如20个),同时从多个数据源(比如20台机器)接收数据,且传输使用最大包尺寸,肯定会达到甚至超过迅雷的传输速度。

背景知识:
  以太网一个数据包最大长度1514字节,那么IP包最大为1500,至于TCP和UDP部分的长度,要看IP协议里面是否有router等等选项,不能一概而论,如果以最简单的局域网来说,那么是1480个字节。

  对于TCP协议来说,整个包的最大长度是由最大传输大小(MSS,Maxitum Segment Size)决定,MSS就是TCP数据包每次能够传输的最大数据分段。为了达到最佳的传输效能TCP协议在建立连接的时候通常要协商双方的MSS值,这个值TCP协议在实现的时候往往用MTU值代替(需要减去IP数据包包头的大小20Bytes和TCP数据段的包头20Bytes)所以往往MSS为1460。TCP有一个MSS发现机制,来确定通讯线路的最大MSS,对此可参考有关TCP/IP详解方面的书籍。
2011-4-3 23:58
0
雪    币: 30032
活跃值: (2572)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
如果你的程序同时和讯雷一起测试,那么你N线程都无法比它快的.如果你自己设计过TCP协议栈,那么就会很清楚其中的原因了.
2011-4-4 01:37
0
雪    币: 1240
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
TCP里的QOS参数也是带宽限制的一个原因,但我想楼主应该不会笨到在测试的时候还开着迅雷吧……
2011-4-4 02:44
0
雪    币: 143
活跃值: (61)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
9
...........不会下载文件的说。。
2011-4-4 11:07
0
雪    币: 28
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
你铁定是开了什么抢速度的程序了,迅雷速度之所以快是因为它由很强大的抢速度算法!
2011-4-4 19:45
0
游客
登录 | 注册 方可回帖
返回
//