首页 > 解决方案 > 如何使用 CRC32 校验和查找 UDP 数据包的错误位?

问题描述

我有一个接收 UDP 数据包的服务器。我想验证数据包的完整性。

我感到困惑的是,我被告知数据包包含“可变数量的校验和”。我不太明白这是什么意思。发送方发送要在数据包中执行的校验和的数量,我知道如何提取它,但是,我不知道如何使用它。

数据包还包含一个数据包序列号,该序列号表示已处理的校验和总数(AKA 迭代,其正文中的第一个校验和正在运行)。

我不确定这到底是什么意思,但我需要用它来确定我发送的校验和以及我期望收到的校验和。

过去,我接触过校验和的概念。例如,假设我收到了这些数据

100100001

而这把钥匙

1101

然后我通常会像这样进行CRC检查

     _______________
1101 ) 100100001
     + 1101,,,,,
       ----,,,,,
       01000,,,,
      + 1101,,,,
        ----,,,,
        01010,,,
       + 1101,,,
         ----,,,
         01110,,
        + 1101,,
          ----,,
          001101
          + 1101
            ----
               0 <-- Remainder of 0, no error found!

余数为 0 意味着(很可能)数据没有问题。

就我而言,我需要计算我期望的 CRC32 和我实际收到的 CRC32。可能有一个图书馆可以帮助我做到这一点,这将非常有帮助。

希望我已经提供了足够的细节并提供了清晰的解释。如果有什么需要澄清的,请现在告诉我。

标签: udpchecksumpacketcrc32integrity

解决方案


不,您没有提供足够的信息。您需要提供或链接到这些包的确切格式以及它们用于完整性检查的内容。没有“那个”CRC-32。有许多可能的 CRC-32。您可以在 UDP 数据包中发送的内容没有一种格式。

您的标题问题的答案是:您找不到不正确的位。至少在使用 CRC 时不会。CRC 不是纠错码。这是一个错误检测代码。您能做的最好的事情是发现至少有一个错误,但不知道哪些位有错误。

我认为您在问题文本中提出的基本答案是:您计算消息的完整性检查(无论是什么),并将其与随消息发送的完整性检查进行比较。

根据使用的 CRC-32,可能有很多库可以计算它。一种常用的 CRC-32 是由zlib 库计算的,它可能已经安装在您的机器上。那里有代码可以为任何给定的 CRC 生成代码。

更正:你称之为“钥匙”的东西不是钥匙。它是 CRC 多项式。


推荐阅读