2013-03-13 86 views
0

当读取本地文件并通过网络(本地和Internet)发送它时,是否有任何建议或建议的缓冲区大小?我们使用4k,因为它是Windows VM的页面大小,但由于这可能是延迟,带宽,抖动等复杂的功能,因此我想了解在大多数情况下可以很好地实现的实现。我们宁愿采用更简单的解决方案来尽量减少代码更改(代码审计)。通过LAN/Internet传输文件时上传缓冲区大小?

using (var destFs = new NetworkStream(URI, FileMode.OpenOrCreate)) 
{ 
    var buffer = new byte[4*1024]; // <= better buffer size? 
    int bytesRead; 
    while ((bytesRead = fs.Read(buffer, 0, buffer.Length)) > 0) 
    { 
     destFs.Write(buffer, 0, bytesRead); 
    } 
} 
+0

4096通常是我所看到的,但我无法用科学来证明它。 – Romoku 2013-03-13 00:57:25

+0

在我的职业生涯中,我体验到最好的价值是8192,但我不知道。但似乎更快。 – sborfedor 2016-01-20 13:59:36

回答

0

这要看!

如果您使用的是TCP(您可以在这里intrested)

的TCP数据包大小的绝对限制是64K(65535个字节),但在实用性,这是远远超过任何尺寸数据包你会看到,因为较低层(例如以太网)具有较低的数据包大小。

以太网的MTU(最大传输单位)为1500字节。某些类型的网络(如令牌环)具有较大的MTU,并且某些类型具有较小的MTU,但这些值是针对每种物理技术固定的。

如果使用UDP

正确的最大UDP消息大小是65507,如由下式确定:0xFFFF的 - (的sizeof(IP报头)+的sizeof(UDP报头))= 65535 - (20 + 8)= 65507

+0

最大的TCP数据包大小,MTU等,都与应用程序缓冲区的大小无关,因为TCP会进行分组。 – EJP 2013-03-13 04:29:34

0

您应该使其成为2的幂,并且由于您给出的原因,您还应该使其成为4096的倍数,并且它应该是常见的磁盘簇大小。我个人在任何地方都使用8192,但是如果你对吞吐量感兴趣,你可能会发现使用像32k,128k等的大小更好:实验会显示好处开始变得边际的地方。

+1

@downvoter请解释你的问题与这个答案。无法解释的downvotes往往被视为纯粹的网站破坏行为。 – EJP 2013-03-13 06:54:17

+1

奇怪的downvoter,因为答案很有道理,虽然它不是'坚如磐石'。考虑到底层网络变量的数量,一行C#语句很难“坚如磐石”。无论如何,我投了票... – DeepSpace101 2013-03-13 21:41:36

+0

我同意8192.在我的测试是最好的价值。 – sborfedor 2016-01-20 14:00:26