以前觉得飞鸽传输的速度在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 在很大范围来说 给你上传数据的对等方越多你的速度越快,但超过一定的值,其实就不可能提高了。
上面都是本人通过以有知识推测,有些经过验证,有些没有进过验证。如果有错误,那就错了吧!!
注:错别字不算错误。。。。。。![](http://www.cppblog.com/Emoticons/QQ/10.gif)
posted on 2013-05-15 23:00
小鱼儿 阅读(5076)
评论(5) 编辑 收藏 引用