【问题标题】:UDP Incorrect checksum triggers repeat request instead of dropping packetUDP 不正确的校验和触发重复请求而不是丢弃数据包
【发布时间】:2021-09-26 11:46:19
【问题描述】:

希望你今天过得愉快。

我正在使用 UDP 将数据包从微控制器发送到我 PC 上的 python 服务器(我无法通过 TCP 获得所需的速度)。

如果数据包丢失,我想向微控制器发送重复请求(假设这是通过 UDP 进行纠错的最简单方法)?

我知道 UDP 使用校验和,如果这不正确,它将被接收器丢弃。 python socket中是否有标志或等效项,以便在丢弃数据包时,我可以要求微控制器再次发送数据包?

提前感谢您的宝贵时间, 会

【问题讨论】:

  • 正如答案所述,UDP 是不可靠的协议(即它只是发送数据包而不关心是否接收到它们)。所以,如果你真的需要使用 UDP,你必须自己做这个机制(即如果数据包在你的 python 服务器中被丢弃,你应该从服务器发送一个预定义的 UDP 数据包到微控制器。在微控制器方面,当你接收到这个预定义的UDP数据包,让它重新发送最后一个数据包)。
  • 另外一件事,您需要检查为什么校验和不正确,这在您的应用程序中是预期的吗?
  • @MohammedOsama 是的,这正是我需要做的!我的问题是如何检测到使用 python 套接字丢弃的数据包?
  • 校验和不正确的原因只是由于传输时发生错误的罕见情况(1 到 0 或 0 到 1)。预计不会返回错误的校验和
  • 我认为这是不可能的,因为失败的 UDP 校验和数据包在操作系统网络堆栈的低层被丢弃。无论如何,如果您可以禁用此功能,则 UDP 数据包中没有任何内容可以让对等方知道 哪个 数据包需要重新传输。例如,没有序列号。您要求 UDP 具有 TCP 的功能,但它不能。

标签: python sockets error-handling udp


【解决方案1】:

UDP 是一个不可靠的协议。如果数据包由于错误的校验和而被丢弃,它没有“要求再次发送”的机制。它也没有检测重复数据包、重新排序或丢失数据包的机制。没有任何一种标志可以打开来获得基于 UDP 的可靠传输。

如果您需要可靠的传输,请使用 TCP 或在 UDP 之上实现您自己的自定义可靠性层。

【讨论】:

  • 我知道它不可靠,但我只需要套接字告诉我:“嘿,我刚收到的数据包校验和错误”。然后我可以向微控制器发送一条 UDP 消息,告诉它重新发送最后一个缓冲区(存储在内存中)。
  • @WillPowell:有这种机制。数据包被简单地丢弃。除此之外,与意外修改相比,数据包完全丢失的可能性更大,因此此类功能的用途非常有限。
猜你喜欢
  • 2013-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-23
  • 1970-01-01
  • 1970-01-01
  • 2015-08-31
  • 1970-01-01
相关资源
最近更新 更多