TCP_NODELAY如何影响连续的write()调用?

AyC*_*yCe 5 java sockets networking tcp

TCP_NODELAY是一个允许快速发送TCP数据包的选项,无论其大小如何.当速度很重要时,这是非常有用的选项,但是,我很好奇它会对此做些什么:

Socket socket = [some socket];
socket.setTcpNoDelay(true);
OutputStream out = socket.getOutputStream();
out.write(byteArray1);
out.write(byteArray2);
out.write(byteArray3);
out.flush();
Run Code Online (Sandbox Code Playgroud)

我试图找到什么冲洗实际上做了什么SocketOutputStream,但据我所知,它没有做任何事情.我曾希望它会告诉套接字"现在发送所有缓冲的数据",但不幸的是,不,它没有.

我的问题是:这些3字节数组是在一个数据包中发送的吗?我知道你对TCP构造网络数据包的方式没有多少控制权,但有没有办法告诉套接字(至少尝试)打包这些字节数组,这样可以避免网络开销?可以手动打包字节数组并在一次调用中发送它们以write帮助吗?

use*_*421 6

我的问题是:这些3字节数组是在一个数据包中发送的吗?

由于你已经禁用了Nagle算法,几乎可以肯定没有,但你不能100%肯定.

我知道你对TCP构造网络数据包的方式没有多少控制权,但有没有办法告诉套接字(至少尝试)打包这些字节数组

是.不要禁用Nagle算法.

所以避免网络开销?可以手动打包字节数组并在一次调用中发送它们来写帮助吗?

是,或者更简单,只需将套接字输出流包装在一个BufferedOutputStreamflush()在您希望发送数据时调用,按照您现有的代码.你是正确的,flush()在套接字输出流上什么都不做,但它刷新了BufferedOutputStream.