0

我正在实现一个可靠的数据传输协议。最大数据包长度为 1000 字节。我需要多少字节来存储最大数据包大小的校验和?我尝试使用一个字节来存储校验和,但是接收器无法获得与存储的校验和相同的校验和。

Checksum checksum = new CRC32();
checksum.update(out_data, 0, out_data.length-1);

Long checksumValue = checksum.getValue();
out_data[out_data.length-1] =  checksumValue.byteValue();

这是我的校验和实现代码。我使用字节数组的最后一个槽作为校验和。请注意,这不是数据包损坏的情况,因为可以使我正在运行的不可靠网络的模拟变得可靠。

4

2 回答 2

3

你可以校验任何大小的东西。以太网帧通常为 1500+ 字节,并且仅使用 4 个字节进行校验和。如果您想安全起见,请使用 sha1(但它占用 20 个字节并且计算速度可能很慢)。

要将 CRC32 的结果放入数组中,需要 4 个字节(每字节 32 位 / 8 位)。

于 2013-11-05T13:51:44.597 回答
1

字节数组长度1000的校验和多少字节

如果您要问检测腐败应该有多大,这是一个非常困难的问题......

首先,无论校验和有多大,无论它是如何计算的,都永远无法完全消除无法检测到的损坏的可能性。(即使校验和值与消息值一样多,您也无法消除传输会破坏消息和校验和的可能性......以完全相同的方式。)

如果我们对所有可能损坏的集合进行平均,那么我们可以希望的最好结果是 N 位校验和将无法在 2 N中检测到一次损坏。如果该概率太高,则需要增加 N。

要超越这个简单的分析,您必须考虑特定的校验和算法及其检测常见错误的能力;例如,单个位翻转、位转置等。我对此并不“了解数学”,但我想实际的校验和算法会变得非常复杂,并且经验方法将给出最好的答案。但我也认为推荐的算法接近理论上的“2 N一次”,并且它们对于常见的错误综合症没有任何特别的弱点。

所以,最好的建议可能是弄清楚你对多大的概率感到满意,并用它来选择一个N……和一个算法,给你那个大小(或更大)的校验和。


请注意,这不是数据包损坏的情况,因为可以使我正在运行的不可靠网络的模拟变得可靠。

在这种情况下,您可以使用任何您想要的校验和算法。甚至是一位校验和;即奇偶校验位。(甚至是零位。100% 可靠的网络不需要校验和。)


...接收方无法获得与存储的校验和相同的校验和。

您编写的代码使用CRC32。这是一个 32 位或 4 字节的校验和……与校验和的数据字节数无关。但是,它似乎只传递了data_out消息中 CRC32 的最低有效字节。除非接收者做同样的事情(只使用低字节),否则校验和将不匹配。

于 2013-11-05T14:27:35.670 回答