通过LAN / Internet传输文件时上传缓冲区大小?

时间:2013-03-13 00:55:24

标签: c# network-programming buffer

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

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);
    }
}

2 个答案:

答案 0 :(得分:0)

取决于!

  

如果您正在使用TCP(您可能会对此感兴趣)

TCP数据包大小的绝对限制是64K(65535字节),但实际上这远远大于您将看到的任何数据包的大小,因为较低层(例如以太网)具有较低的数据包大小。

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

  

如果您使用的是UDP

正确的最大UDP消息大小为65507,由以下公式确定:0xffff - (sizeof(IP标头)+ sizeof(UDP标头))= 65535-(20 + 8)= 65507

答案 1 :(得分:0)

你应该使它成为2的幂,你也应该把它作为4096的倍数,因为它给你的原因,它也是一个常见的磁盘簇大小。我个人在任何地方都使用8192,但如果你对吞吐量感兴趣,你可能会发现使用32k,128k等大小更好:实验将显示效益开始变得微不足道。