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

标签 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();

我试图找出 flush 在 SocketOutputStream 上的实际作用,但据我所知,它什么也没做。我曾希望它会告诉套接字“现在发送所有缓冲数据”,但不幸的是,不,它没有。

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

最佳答案

My question is: are these 3 byte arrays sent in one packet?

由于您已禁用 Nagle 算法,几乎可以肯定不会,但您不能 100% 确定。

I know you don't have much control over how TCP constructs a network packet, but is there any way to tell the socket to (at least try to) pack these byte arrays

是的。 不要禁用 Nagle 算法。

so network overhead is avoided? Could manually packing the byte arrays and sending them in one call to write help?

是的,或者更简单的只是将套接字输出流包装在 BufferedOutputStream 中,并在您希望发送数据时调用 flush(),按照您当前的代码. flush() 对套接字输出流不执行任何操作是正确的,但它会刷新 BufferedOutputStream。

关于java - TCP_NODELAY 如何影响连续的 write() 调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18091523/

相关文章:

JAVA同步块(synchronized block)在多线程环境中不起作用

python - 有没有办法检查Python Socket中是否有传入消息

java - Java中通过UDP传输文件。如何检测服务器上的文件结尾?

android -/proc/net/tcp和/proc/pid/net/tcp有什么区别

C# WPF 无法获取 HTTPS 请求的互联网

java - Xstream 和枚举解码 : No enum constant

Java 文件句柄不会关闭

JavaParser如何获取CompilationUnit中的类名

java - 如何复制 JCheckBox 的禁用外观?

c# - 如何使用套接字欺骗 IP 地址?