gpt4 book ai didi

java - 在网络级别合并的 TCP 数据包

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

有谁知道对方如何以及为什么会收到合并的 TCP 数据包而不是单独的数据包?我已经在套接字级别将 TCP Nodelay 设置为 true,但 tcpdump 仍然看到一些数据包已合并。在成功发送 4 个大小为 310 字节的数据包后,我得到了 3 x 1400 字节而不是 15 x 310 字节。这导致了一些重要的延迟。谢谢。

http://www.2shared.com/photo/_bN9UEqR/tcpdump2.html

s = new Socket(host, port);
s.setTcpNoDelay(true);
s.getOutputStream().write(byteMsg);
s.getOutputStream().flush()

最佳答案

TCP 是一种基于流的协议(protocol)。它不会保留关于 send/recv 调用的边界。唯一可以保证的是 send 的串联将与 recv 的串联相同(在正常情况下)。

如果您正在实现自定义协议(protocol)并且需要某种方法将数据拆分为多个逻辑消息,则您需要为此进行编码。

一个简单的编码是将每条消息编码为一个 32 位无符号整数,表示消息负载的长度,后跟实际的消息负载。然后,在接收端,根据这个编码对输入进行适当的解码。为此,您需要一个缓冲区来存储部分接收到的消息。如果操作原始整数是一个问题,您可以通过其他方式对长度进行编码,例如作为一个十进制数字后跟一个换行符。

关于java - 在网络级别合并的 TCP 数据包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11241430/

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