我正在检查使用Wireshark捕获的数据包。
我理解IP数据报(数据包)中的总长度字段的值是数据报的总大小,包括标头和数据的大小。标头的大小固定为40个字节(封装的TCP标头为20个字节,IP标头为20个字节)。但是在我的每个数据包中,我注意到数据的大小是可变的,范围从1个字节到~1500个字节的范围。
我的Java应用程序发送包含header \ x0b和trailer \ x0c \ x0d的消息。所以我的邮件发送格式是:
0b消息0c0d
但是,如果我在Wireshark中检查发送的数据包,我可以看到一些数据包在数据中只包含0b。有些数据包包含0b +部分消息。
我很想知道为什么数据包的数据部分是可变的。
答案 0 :(得分:1)
您的代码是以原子方式还是分段方式将字节发送到网络层?如果是碎片,有时网络堆栈将打开nagle算法以尝试将多个短TCP有效负载合并为一个大的有效负载,但这不能保证会发生。由于TCP是一种流协议,因此无法保证TCP数据包的数量等于调用TCP发送的次数。此外,您需要根据消息边界正确分割TCP输入流。