gpt4 book ai didi

c - 通过 UDP 实现 ack?

转载 作者:可可西里 更新时间:2023-11-01 02:30:47 25 4
gpt4 key购买 nike

我们有一个系统(用 C 语言构建)可以通过 UDP 进行通信。最近我们发现有必要保证数据包的传递。我的问题是:要确保使用 ack 数据包进行交付,对基于 UDP 的系统的最少添加是什么?此外,理想情况下无需操作数据包 header 。我们对数据包进行应用程序级别的控制,包括序列号和 ack/nack 标志。我想知道这是否是一个失败的原因,我们尝试做的任何事情基本上都是有缺陷和损坏的 TCP 版本。基本上,我们是否可以进行最低限度的改进来实现有保证的交付(我们不需要 TCP 的许多功能,例如拥塞控制等)。谢谢!

最佳答案

TCP 交织了 3 个可能相关的服务(好吧,TCP 做的更多,但我只讨论 3 个。)

  1. 按顺序交货
  2. 可靠的交付
  3. 流量控制

你刚才说你不需要流量控制,所以我什至不会解决这个问题(你会如何宣传窗口大小等。好吧,除了你可能需要一个窗口。我会得到到它。)

您确实说过您需要可靠的交付。这并不难——您使用 ACK 来表明发送方已收到数据包。基本的可靠交付如下所示:

  1. 发送方发送数据包
  2. Receiver收到数据包,然后发送一个ack
  3. 如果发送方没有收到确认(通过计时器),他将重新发送数据包。

这三个步骤没有解决这些问题:

  1. 如果 ACK 丢失怎么办?
  2. 如果数据包乱序到达怎么办?

因此对于您的应用程序,您说您只需要可靠的交付 - 但没有说明需要按顺序交付。这将影响您实现协议(protocol)的方式。

(顺序无关紧要的示例:您正在将员工记录从一台计算机复制到另一台计算机。Alice 的记录是否先于 Bob 的收到并不重要,只要两者都到达那里即可。)

因此假设您只需要可靠(因为这就是您在帖子中所说的),您可以通过多种方式实现这一目标。

您的发件人可以跟踪未确认的数据包。因此,如果它发送#3、4、5 和 6,但没有收到 3 和 4 的 ACK,则发送方知道它需要重传。 (尽管发送方不知道数据包 3 和 4 是否很多,或者它们的 ACK 是否丢失。无论哪种方式,我们都必须重传。)

但随后您的发送方可以执行累积 ACK - 因此在上面的示例中,它只会在收到 3、4 和 5 时确认 #6。这意味着接收方将丢弃数据包6 如果之前没有收到。如果您的网络非常可靠,那么这可能是个不错的选择。

然而,上述协议(protocol)确实有一个窗口 - 即发送方一次发送多少个数据包?这意味着您确实需要某种窗口,但不是为了流量控制。您将如何传输窗口大小?

您可以在没有窗口的情况下执行此操作,方法是让窗口大小保持不变,或者通过执行类似停止等待的操作。前者可能是更好的选择。

无论如何,我还没有直接回答你的问题,但我希望我已经指出了一些在构建这个问题时值得考虑的事情。在没有部分流量控制(如窗口)且不考虑顺序的情况下进行“可靠传输”的任务很难! (让我知道我是否应该提供有关其中一些内容的更多详细信息!)

祝你好运!

关于c - 通过 UDP 实现 ack?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1514839/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com