是否有人知道对方将如何以及为什么会接收合并的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是基于流的协议。它不会保留有关send
/ recv
调用的边界。唯一可以保证的是send
的串联与recv
的串联相同(在正常情况下)。
如果要实现自定义协议,并且需要某种方式将数据拆分为多个逻辑消息,则需要对此进行编码。
一种简单的编码是将每个消息编码为32位无符号整数,表示消息有效负载的长度,然后是实际消息有效负载。然后,在接收端,根据此编码对输入进行正确解码。为此,您将需要一个缓冲区来存储部分接收到的消息。如果操作原始整数有问题,则可以使用其他方式对长度进行编码,例如作为十进制数字,后跟换行符。