如何确定IP数据报中的有效载荷/数据的大小

时间:2013-11-22 01:06:55

标签: java sockets networking tcp

我正在检查使用Wireshark捕获的数据包。

我理解IP数据报(数据包)中的总长度字段的值是数据报的总大小,包括标头和数据的大小。标头的大小固定为40个字节(封装的TCP标头为20个字节,IP标头为20个字节)。但是在我的每个数据包中,我注意到数据的大小是可变的,范围从1个字节到~1500个字节的范围。

我的Java应用程序发送包含header \ x0b和trailer \ x0c \ x0d的消息。所以我的邮件发送格式是:

  

0b消息0c0d

但是,如果我在Wireshark中检查发送的数据包,我可以看到一些数据包在数据中只包含0b。有些数据包包含0b +部分消息。

我很想知道为什么数据包的数据部分是可变的。

  1. 如何确定数据/有效负载的大小?
  2. 谁决定有效载荷的大小?
  3. 我可以在应用程序中控制有效负载的大小吗?

1 个答案:

答案 0 :(得分:1)

您的代码是以原子方式还是分段方式将字节发送到网络层?如果是碎片,有时网络堆栈将打开nagle算法以尝试将多个短TCP有效负载合并为一个大的有效负载,但这不能保证会发生。由于TCP是一种流协议,因此无法保证TCP数据包的数量等于调用TCP发送的次数。此外,您需要根据消息边界正确分割TCP输入流。