【问题标题】:Why UDP header has 'length field'?为什么 UDP 标头有“长度字段”?
【发布时间】:2017-05-14 15:20:41
【问题描述】:

我不明白为什么 UDP 标头有“长度”字段,为什么需要它?

如果原因是要知道“应用程序消息(L5 数据)”在该段中的开始位置,则可以从“UDP 数据 - UDP 标头长度(它是已知值)”中获取。

【问题讨论】:

  • @Steffen 这与我的问题不同
  • 我看不出这有什么不同,因为其他问题询问为什么 IP 标头和 UDP 标头中也有一个长度字段,我认为这与您的要求相同,只是用不同的话来说。如果您认为这不是重复的,请描述您的问题的不同之处。

标签: networking udp protocols


【解决方案1】:

UDP 报头长度字段是 UDP 报头加上 UDP 数据的长度。这确实是多余的,因为这个长度可以从 IP 报头总长度字段中计算出来,其中 UDP 数据报长度是 IP 总长度减去 IP 报头长度。

【讨论】:

  • 我们为什么需要它?
  • 显然需要一个长度字段来指定有效负载字节的数量。该协议嵌入在另一个协议 (IP) 中,该协议也具有有关其有效负载的长度信息(可用于计算 UDP 有效负载长度)的事实使得 UDP 长度变得多余。但是,如果您要在没有此信息的另一个(非 IP)协议中使用 UDP 协议,则需要一个 UDP 长度字段。因此,作为一个独立的协议定义,它不需要始终嵌入到另一个包含长度信息的协议中。
  • ip头长度是4字节的倍数,udp头长度是1字节的倍数
【解决方案2】:

因为 UDP 可以通过 IP 以外的其他协议传输。

还因为 UDP 传输具有一定长度(udp 长度)的数据报消息,该长度可以通过多个 IP 分段数据包发送。

来源:https://notes.shichao.io/tcpv1/ch10/

【讨论】:

  • IP 数据包分片和重组发生在第 3 层 (IP),对第 4 层 (UDP) 是透明的。 UDP 永远不会知道 IP 数据包是否被分段,因为 IP 在将数据包有效负载传递给 UDP 之前会重新组装数据包片段。
  • 当您在(分段)IP 上通过 UDP 管理自己的协议并且您正在接收分离的 IPv4 数据报并需要自己重新组装时,这很有帮助。
  • IP 处理数据包分段和重组。 UDP 内部的一个协议被删除了两次。 UDP 本身永远不知道碎片,UDP 内部的协议永远不会知道 UDP 不知道什么。 UDP会收到一个完整的数据报,不管IP分片如何,这与第4层或更高层的协议无关。
  • 在高级编程中是正确的,但在实际的低级编程中,它有助于缓冲区大小的分配,例如当 IP 层想要将 UDP 数据报返回给 UDP 层时。
  • 在创建自己的协议和接收 IP 数据报时很有用。有用,但不是绝对必要……
【解决方案3】:

UDP 使用消息流 NON FIFO 作为发送方和接收方之间的通信模型。如果未提及大小,则无法在 rxr 处破译消息。 假设发送了 m1m2m3,然后通知每条消息,以便您可以追溯消息。 问候

【讨论】:

    猜你喜欢
    • 2020-04-18
    • 2010-09-21
    • 2020-07-23
    • 2013-04-17
    • 2012-09-08
    • 2020-07-05
    • 1970-01-01
    • 1970-01-01
    • 2020-03-09
    相关资源
    最近更新 更多