【发布时间】:2013-08-06 22:19:34
【问题描述】:
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 帮助?
【问题讨论】:
-
"TCP_NODELAY .. 在速度很重要时很有用。" 否。当 响应性 很重要(发送一个字节以便尽快接收)时,它很有用。 TCP_NODELAY 可以通过发送聚合数据相对无效来降低整体吞吐量。缓冲很好:随时随地。恕我直言...
-
建议:获取wireshark 的副本并跟踪为几个测试套接字程序实际发送的数据包。
-
是的,我就是这个意思。 ;-) 我知道它效率低下,但就我而言,响应能力 比等待足够的数据更重要。但是,对于问题所在的情况,我想对其进行优化,因为发送单字节数组没有多大意义,重要的是它们的内容。
-
@AyCe:然后一次性发送所有数据。将它们组合起来需要额外的几微秒,这是假设缓冲区不小。与网络流量需要多长时间相比,这段时间微不足道。
-
@cHao 这将是我目前的方法,但我很好奇是否有更好的方法,搜索没有任何结果,所以我问了这个问题。
标签: java sockets networking tcp