在实现低级 HTTP 和 FTP 传输时,如何选择缓冲区的大小(我从套接字读取或写入套接字的字节数)以获得最大吞吐量?我的应用程序应该使用 HTTP 或 FTP 在 130 Kbps 到 3 Mbps 的连接上传输数据(我事先知道预期的速度)。有时是单向传输,有时是双向传输。我应该坚持一些平均缓冲区大小还是必须根据连接速度改变它?
谢谢。
在实现低级 HTTP 和 FTP 传输时,如何选择缓冲区的大小(我从套接字读取或写入套接字的字节数)以获得最大吞吐量?我的应用程序应该使用 HTTP 或 FTP 在 130 Kbps 到 3 Mbps 的连接上传输数据(我事先知道预期的速度)。有时是单向传输,有时是双向传输。我应该坚持一些平均缓冲区大小还是必须根据连接速度改变它?
谢谢。
选择超过 8KB 的缓冲区大小。9000 通常是即使在最快的网络中使用的最大 MTU(最大传输单元)大小。
当您使用大于连接的 MTU 的缓冲区时,操作系统会根据需要将其分解为 MTU 大小的片段,因此您在 MTU 上使用的任何内容对网络性能几乎没有影响。
但是,使用大缓冲区可能会对性能产生其他影响,如果您正在传输文件,那么使用大缓冲区可能会提高读取性能,从而提高应用程序的速度。
所以,通常选择一个像 16KB 这样的好整数是个好主意。绝对不要低于 1500,因为这会对网络性能产生负面影响(导致操作系统有时会发送小数据包,从而降低网络性能)。
首先,进行一些测量。
然后,在进行可靠的性能测量后,更改缓冲区大小并绘制速度与缓冲区大小的关系图。
由于您事先知道连接速度,因此您应该能够获得不同实际缓冲区大小的实际速度的一些测量值。
操作系统、协议栈和网络过于复杂,无法从第一原理中得出答案。你需要在做任何事情之前进行测量。
您可以获得缓冲区大小:httpSocket.getReceiveBufferSize(); 我强烈建议在读取过程中将此缓冲区写入 RAM。例如:ByteArrayOutputStream 内存文件。并且只有在填充缓冲区后才将其写入磁盘。