【问题标题】:How is the size of payload / data in an IP Datagram decidedIP数据报中有效载荷/数据的大小是如何决定的
【发布时间】:2013-12-06 18:07:55
【问题描述】:

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

我了解 IP 数据报(数据包)中的总长度字段的值是数据报的总大小,包括报头和数据的大小。报头的大小固定为 40 字节(封装的 TCP 报头 20 字节 + IP 报头 20 字节)。然而,在我的每个数据包中,我注意到数据的大小从 1 字节到 ~ 1500 字节不等。

我的 Java 应用程序发送的消息用标头 \x0b 和尾标 \x0c\x0d 包装。所以我的消息发送格式是:

0b 消息 0c0d

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

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

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

【问题讨论】:

    标签: java sockets networking tcp


    【解决方案1】:

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

    【讨论】:

    • 所以如果我以原子方式发送字节,我的第三个问题的答案是“是”?
    • 嗯,几个快速的原子发送,可以而且很可能会在 TCP 层中组装成一个 TCP 数据包。 TCP 是一种面向连接的流协议。它从不保证始终保持发送边界。这在发送端并不是什么大问题。但是接收端永远不应该依赖于在发送的确切有效负载中接收字节。所有 TCP 保证是每个字节都将按照它发送的确切顺序被接收。接收方中的消息分段必须通过检查自身接收到的字节来确定。
    猜你喜欢
    • 2011-05-12
    • 1970-01-01
    • 2011-01-19
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多