2011-02-09 43 views
3

比方说,你在块通过TCP/IP传输任意长度的文件:使用send()时是否存在“最佳”缓冲区大小?

looping... 
    read(buffer, LENGTH) 
    send(mysocket, buffer, LENGTH, flags) 

我的问题是,什么是长度的最佳值?或者根本不重要?我已经看到从256字节到8192字节被使用的一切。

+0

注意,这个循环已经不正确。提供给send()调用的长度应该是read()调用返回的长度。你不能假设它填满了缓冲区。 – EJP

回答

2

取决于您最佳的意思。为了优化带宽使用,您希望最大化数据包大小,以便至少发送网络数据包大小(在以太网上通常大约为1500字节)。如果您从磁盘读取4096或8192字节将是一个很好的价值。

+0

大小通常选择为系统页面大小的倍数以优化内存处理。 http://en.wikipedia.org/wiki/Page_(computer_memory) –

0

如果你的缓冲区的大小转换成数据包的大小,再短一点缓冲更好 - 少一个数据包错误的情况下重发。

ATM告到了极致与54字节的数据包。

但是这取决于你的图书馆,它可能会做一些自身的缓冲和independantly设置它的数据包大小。因人而异。

+0

还有一些固定大小的东西附加到每个数据包上,所以使数据包的大小减少了实际数据使用的带宽量。 –