posts - 25,  comments - 36,  trackbacks - 0

以前觉得飞鸽传输的速度在100Mbps 网卡上能够跑7 8M/s的样子感觉很神奇,看了一下源代码貌似没有发现很大特别地方,只是觉得那个日本人写的代码比较正规,学生很少看见漂亮代码,只会写垃圾代码。

以前写过传送文件代码,发现速度只有飞鸽传送一般的速度并且貌似传送的速度还不稳定。想好了好久没有想明白,后来想貌似网上好多说什么多线程下载,p2p下载。我就想弄个多线程就OK就应该可以提高速度。后面经过自己测试发现这个不是很对,在某种程度上速度稍微有一点点提高。后来,知道网卡是数据传送不是并行,所以多线程根本不解决本质。(为什么多线程下载可以提高下载速度,你是不是看到过一些浏览器的下载管理器 下载一个文件时候都开启几个线程,显然他们开启多线程是为提高下载速度。。。想知道原理请看下面分解)。

我想了好久,想到IP协议是以最大速度传送数据,那么TCP 和 UDP 都是在IP基础上出来,显然他们也基础IP这个特性,所以可见SOCKET 没有提高网卡传送的方法,这就说明速度是一个定值。

我们所说网速其实就是 每秒网卡进过数据流量。
这里我就要举一个例子,否则越说越糊涂了。

一个可以装20吨的货车装满了沙子,一个可以装10吨的小货车装满了沙子。 但他们最大速度都相同,他们都以最大速度在2条一样的条路上行驶,并且都要经过个完全一样收费站。

货车长度是一样。
汽车速度就是我们网卡物理最大速度100Mbps == 货车的速度
以为长度一样 速度一样 我们假设经过的时间为1s
收费站速度(以沙子为对象) :大货车的:20吨/s  小货车:10吨/s   ====== 我们所说的网速
说到这里我也明白,我以前学习网络课程不明白的地方,以前网卡最大速度 和 网速 为什么不是一样。
网卡100Mbps : 类似如 一个汽车 一秒 可以跑 多少米
我们所说网速:类似 收费站 一秒 经过的沙子量
这个2个是不同概念。
这就好像 长度 和 面积差别。。看来以前学习数学还是有一点用的。

所以这里就可说: 货车装载量就是套接字(字节流)缓存区大小。我们只要增加缓冲区大小就可以提高我们传送文件的速度。
经过测试确实验证这个说话,测试结果就不贴出来了。

后面看steven 的tcp/ip详解 里面也写了一段话,也说明这个观点。

插口A P I允许进程设置发送和接收缓存的大小。接收缓存的大小是该连接上所能
够通告的最大窗口大小。有一些应用程序通过修改插口缓存大小来增加性能。

[Mogul 1993]显示了在改变发送和接收缓存大小(在单向数据流的应用中,如文件传输,
只需改变发送方的发送缓存和接收方的接收缓存大小)的情况下,位于以太网上的两个工作
站之间进行文件传输时的一些结果。它表明对以太网而言,默认的 4 0 9 6字节并不是最理想的
大小,将两个缓存增加到 1 6 3 8 4个字节可以增加约 4 0 %左右的吞吐量。在 [ P a p a d o p o u l

o s和Parulkar 1993]中也有相似的结果。

他这里插口API 就是套接字(我就单纯认为套接字)
windows 缓存区默认大小是8k。

为什么多线程可以稍微提高网络速度?
其实我们想想 一张网卡只要不停跑满流量就可以达到最高速度。多线程就是使缓存区数据保持被填满,但这里只是稍微提高。其实单线程就足够做到这点,
我们 send 传入一个Buf 参数时候 只要这个Buf一个合适的值,就足够使网卡保持繁忙。
这里就好像怎么是cpu 效率最高就是不要cpu停下来,同理怎么是网卡效率最高,也就是不要它停下来。

为什么多线程下载可以提高网速?
我们知道带宽速度比起网卡速度那完全是皮毛,说实在网卡I/O设备是中断读取数据,它读取数据也不能并行读取(不知道这么说对不对),所以多线程不是使网卡并行读取数据,而是增加服务器对你服务器时间(因为你使用多线程),自然传送速度会快些。
p2p 我认为无非也是增加服务器对你服务器时间(这里不是指特定服务器,而是能够给你传送数据我就叫着服务器,貌似p2p叫对等方)。(我没有写过p2p,只是通过一些书籍介绍,凭自己感觉思考的)。因为网卡的读取速度比起带宽要快很多,所以p2p 在很大范围来说 给你上传数据的对等方越多你的速度越快,但超过一定的值,其实就不可能提高了。


上面都是本人通过以有知识推测,有些经过验证,有些没有进过验证。如果有错误,那就错了吧!!
注:错别字不算错误。。。。。。

 

posted on 2013-05-15 23:00 小鱼儿 阅读(5055) 评论(5)  编辑 收藏 引用

FeedBack:
# re: SOCK_STRAM SOCKET 的缓存区 和 传送速度的关系[未登录]
2013-05-16 14:43 | 春秋十二月
网速主要取决于程序、网卡和网络带宽,程序属于软件因素,包括发送方和接收方;网卡和带宽则是硬件因素。
1)只要发送方不停地发,每次尽可能发多数据,就能使网卡繁忙。但还需要接收方读得快才行。
2)多线程仅当多核并发时才能提高性能,这时下载就是同时获取文件的多个块。
3)增大缓冲区的值确实能提高速率,但减少却不意味着降低速率。  回复  更多评论
  
# re: SOCK_STRAM SOCKET 的缓存区 和 传送速度的关系
2013-05-18 22:32 | wysaid
发现速度只有飞鸽传送"一般"的速度并且貌似传送的速度还不稳定
→_→  回复  更多评论
  
# re: SOCK_STRAM SOCKET 的缓存区 和 传送速度的关系
2013-05-19 12:38 | 小鱼儿
恩,同意你的说话  回复  更多评论
  
# re: SOCK_STRAM SOCKET 的缓存区 和 传送速度的关系
2013-05-19 12:39 | 小鱼儿
@wysaid
呵呵,没有办法。
打字经常打错。。。。。


  回复  更多评论
  
# re: SOCK_STRAM SOCKET 的缓存区 和 传送速度的关系
2013-05-28 10:46 | tb
呵呵 同意 IT又多一个人才  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


<2013年5月>
2829301234
567891011
12131415161718
19202122232425
2627282930311
2345678

常用链接

留言簿(4)

随笔档案(25)

搜索

  •  

最新评论

阅读排行榜

评论排行榜