当前位置: 首页 > 面试题库 >

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

麻学博
2023-03-14
问题内容

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

我试图找到冲洗实际上对起作用SocketOutputStream,但据我所知,它什么也没做。我曾希望它能告诉套接字“立即发送所有缓冲的数据”,但是不幸的是,没有。

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


问题答案:

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

禁用Nagle算法后,几乎可以肯定不会,但是不能100%确定。

我知道您对TCP如何构造网络数据包没有太多控制权,但是有什么方法可以告诉套接字(至少尝试)打包这些字节数组

是。 不要 禁用Nagle算法

这样可以避免网络开销?是否可以手动打包字节数组并在一次调用中将其发送以编写帮助?

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



 类似资料:
  • 问题内容: 可以在连续流上使用吗? 我的意思是说是一条命令,但在输出中仅保留我感兴趣的行。 我已经尝试过了,但是似乎只能在完成后才能执行,也就是说永远不会执行。 问题答案: 使用BSD grep(FreeBSD,Mac OS X等)时,打开的行缓冲模式。 您无需为GNU grep(几乎在任何Linux上使用)执行此操作,因为它会默认刷新(对于其他类似Unix的版本,如SmartOS,AIX或QNX

  • 我在Go中有以下代码。Go使用超文本传输协议保持连接。因此,根据我的理解,不会创建新连接,因为Go语言使用默认的持久连接。 > 据我所知,HTTP持久连接一次只能发出一个请求,即第二个请求只能在第一次响应之后发出。然而,如果多个线程调用会发生什么?将在前一个请求得到响应之前是否发送另一个请求? 我假设服务器超时了客户端建立的任何保持活动的连接。如果服务器超时,那么下一次,它会建立新的连接吗?

  • 问题内容: 我正在使用Sprite Kit制作游戏,并且当您按住向左/向右移动按钮时,我希望角色在屏幕上移动。问题在于他仅在轻按按钮时才移动,而没有保持住。我到处都在寻找解决方案,但似乎无济于事! 这是我的代码; 在我的游戏场景中… 问题答案: 您知道什么时候触摸了按钮,因为它被调用了。然后,您必须设置一个标志以指示按钮被按下。 在中,调用标记为true的函数: 您可以在调用该按钮时将标志设置为f

  • 问题内容: 以下两个查询有什么区别? 问题答案: 在SQL方面,绝对没有区别:这两个查询完全相同。 (您可以通过回显它们进行检查) 是的更完整的语法,允许使用: 有关更多信息,您应该阅读手册的 变量解析/复杂(curly)语法 部分 (引用几句话) : 之所以称其为“复杂”,是因为语法复杂,而是因为它允许使用复杂的表达式。 可以通过此语法包括具有字符串表示形式的任何标量变量,数组元素或对象属性。

  • 为了让远程服务器获得回购,我将sources.list改写为: 我已经放入了ansible.cfg文件: 为了完整起见,这里是我的yml文件: ssh:EXEC sftp-b--r 88:127.0.0.1:80-o kbdinteractiveauthentication=no-o preferredauthentications=gssapi-with-mic,gssapi-keyex,基于h

  • 问题内容: 我正在使用Ubuntu 14.04 64位。这是我的C ++代码,以了解如何使用内存。 这是我的输出: 我希望操作系统会连续分配内存。因此,ptr [0] [0]将位于0x1195020而不是0x1195030!OS在0x1195020-0x119502F,0x1195038-0x0x119504F上做什么用? 问题答案: 因为: 在分配的内存的每个块的开始和结尾处都有一些空间通常用于