TCP数据包合并在网络层面(TCP packets merged at network level)

2019-07-30 03:25发布

有谁知道如何和为什么对方会收到的TCP数据包合并而不是单独的包? 我已经设置TCP无延迟到真正在插座的水平,但仍tcpdump的一些看到的数据包合并。 后4个的310个字节的尺寸发送成功的数据包,我得到3×1400字节,而不是15×310个字节。 这造成了一些重要的延迟。 谢谢。

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

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

Answer 1:

TCP是一个面向流的协议。 它不保留边界相对于send / recv调用。 保证的唯一的事情是,串联send的将是相同的级联recv的(正常情况下)。

如果您正在实现一个自定义的协议,需要一些方法将数据分割成多个逻辑消息 ,您需要为一个编码。

一个简单的编码是对每个消息编码为32位无符号整数,表示该消息有效载荷的长度,其次是实际消息有效载荷。 然后,在接收侧,根据该编码正确地解码所述输入。 要做到这一点,你需要将存储部分接收到的消息的缓冲区。 如果操作原始整数是一个问题,你可以编码长度一些其他的方式,例如,作为一个十进制数后跟一个换行符。



Answer 2:

合并可以发生在很多地方

  • 发送方应用程序缓冲
  • 发件人OS缓冲
  • 发送方网络适配器缓冲区
  • 路由器缓冲区
  • 接收器网络适配器缓冲区
  • 接收器OS缓冲
  • 接收器应用缓冲器/队列

这似乎从你所说的有发送者的网络适配器和接收器的操作系统之间的合并。 (如TCP-没有延迟指示OS不以缓冲和应用程序之前tcpdump的读取)



Answer 3:

你可以尝试启用所使用的插座(TCP_NODELAY选项setTcpNoDelay()方法)。

这是默认为禁用,这意味着所发送的数据是用于发送包的最小数目优化(见Nagle算法 )。



Answer 4:

有谁知道如何和为什么对方会收到TCP包合并而不是单独的包?

因为这是TCP是专门设计用来做。



文章来源: TCP packets merged at network level