gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 02:31:58 24 4
gpt4 key购买 nike

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com