TCP数据包在网络级别合并

Cri*_*tiL 3 java networking tcp tcpdump

是否有人知道对方如何以及为什么会接收合并的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()
Run Code Online (Sandbox Code Playgroud)

Amb*_*jak 5

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

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

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