【问题标题】:Does UDP allow repacketization?UDP 是否允许重新打包?
【发布时间】:2019-12-10 19:19:43
【问题描述】:

我知道对于 TCP,您可以启用例如 Nagle's Algorithm。但是,您可以为 UDP 提供类似的东西吗?

实用问题(假设 UDP 套接字):

如果我在短时间内调用 send() 两次,每个 send() 调用中的数据为 1 字节。传输层是否有可能决定只发送 1 个带有 1 byte + 1 byte = 2 bytes 数据的 UPD 数据包?

提前致谢!

【问题讨论】:

    标签: sockets network-programming udp


    【解决方案1】:

    没有。 UDP 数据报完全按照发送的方式发送,或者根本不发送。

    【讨论】:

      【解决方案2】:

      不符合 RFC (RFC 768)。在 IP 设施本身之上,UDP 实际上只提供了额外的基于端口的路由和一点点额外的损坏或路由错误检测。

      这意味着无法组合数据报。事实上,由于它是面向事务的,我会说将两个事务合并为一个可能是一个的想法,因为这会使这些事务保持不同。

      否则,您将需要在 UDP 之上的一个层来计算如何从数据报中提取这些事务。目前,这没有必要,因为数据报事务。

      作为对这一争论的额外支持(当然不是确定的),请参阅UDP wikipedia page

      数据报——数据包是单独发送的,只有在它们到达时才检查完整性。 数据包有明确的边界,在接收时遵守,这意味着接收方套接字上的读取操作将产生原始发送的完整消息。

      但是,对它的最佳支持来自它的一位客户。 UDP 是专门为 TFTP(除其他外)设计的,如果您无法区分事务,该协议就会崩溃。

      具体来说,TFTP 交易类型之一是data 交易,它由操作码、块号和最多 512 字节的数据组成。如果在开始时没有长度指示或在结束时没有标记值,则没有方法可以确定下一个事务将从哪里开始,除非事务和数据报之间存在一对一的映射。

      顺便说一句,其他四种 TFTP 事务类型具有固定长度或字符串结尾标记值,但 data 事务是这里的决定者。

      【讨论】:

      • 调用 UDP“面向事务”有点牵强。但是 UDP 层绝对不允许拆分或合并 UDP 数据报。这不会阻止 IP 层这样做,但 UDP 层应该在将拆分的数据报呈现给应用层之前重新组合它们。
      • @Ross,这不是我说的,是 RFC。它可能是我们习惯的不同交易定义,给定的数据报要么已交付,要么未交付。
      猜你喜欢
      • 1970-01-01
      • 2022-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-08
      • 2013-08-22
      • 2019-05-15
      相关资源
      最近更新 更多