【问题标题】:UDP payload length and packet transmissionUDP有效载荷长度和数据包传输
【发布时间】:2015-04-30 17:44:06
【问题描述】:

我有 1245 MB 的数据用于通过 IPv4 上的 UDP 传输。 为了计算从 A 到 B 然后 B 中继到 C 的预期数据包传输数,如果数据以 320 字节大小(即有效负载 = 320 字节)的块传输,并且包头是 20 字节,我们是从 320 中减去 20 还是加上?

For instance, 
1245MB = 1305477120 bytes
Total UDP Payload = 320 - 20 or 320 + 20?

【问题讨论】:

    标签: networking header udp packet payload


    【解决方案1】:

    数据包包括:

    • IP 标头(20 字节)
    • UDP 标头(8 个字节)
    • 您的有效负载(320 字节)。

    总计:348 字节。

    【讨论】:

    • 谢谢!您能否告知我对预期数据包数量的计算是否正确?
    • 如果假设 UDP IPv4 的协议开销为 42 字节,则数据包总数将为 IP 标头(42 字节)+ UDP 标头(8 字节)+ 有效负载(320 字节)= 370字节?
    • @user23 IPv4 UDP 的协议开销是 28 个字节,正如我上面已经说过的。不是 42. 我认为回答基于错误前提的问题没有任何意义。我也不打算检查你的算术。
    【解决方案2】:

    在计算数据包数量时,您无需考虑传输层或网络层标头的大小。您指定了 320 字节的有效负载大小,这完全在没有分段的 UDP 有效负载的最大大小范围内。

    每次调用 send() 或 sendto() 时,都会创建一个数据报(数据包),因此数学运算只是将总大小除以 320 字节块:

    1305477120 / 320 = 4079616 个数据包

    顺便说一句,如果您要使您的 UDP 有效负载更大,这将减少数据包的总数。在很多网络上,MTU 为 1500 字节,因此您可以发送:

    1500 字节 - IP 标头(20 字节)- UDP 标头(8)字节 = 1472 字节用于有效负载

    另一方面,如果您的 UDP 负载太大,即负载 + IP/UDP 标头超过 MTU,那么您对 ​​send() 的单次调用将导致多个 IP 分段数据包。

    【讨论】:

    • 感谢乔尔的解释。如果我将 1305477120 从 A 发送到 B,然后 B 中继到 C,我可以假设数据包的总数将为 4079616 * 2 = 8159232。TCP 数据包传输的计算会有所不同吗?
    • 你是正确的,当 B 收到发往它的数据报并创建发往 C 的新数据报时,将发送 4079616 个新数据报(假设相同的有效载荷大小为 320 字节用来)。现在,如果您要通过 TCP 发送相同数量的数据,情况将大不相同。 TCP 是一种基于流的协议,将通过 send() 提交的所有数据视为该流的一部分。它是如何将 IP 数据包中的流打包的,但通常 TCP 会尝试将流分割成 MTU(也称为最大分段)大小的数据包。
    猜你喜欢
    • 1970-01-01
    • 2021-06-22
    • 1970-01-01
    • 1970-01-01
    • 2011-01-19
    • 2019-03-22
    • 2020-10-11
    • 2017-03-26
    • 1970-01-01
    相关资源
    最近更新 更多