0

信頼できるデータ転送プロトコルを実装しています。最大パケット長は 1000 バイトです。最大パケット サイズのチェックサムを保存するには、何バイト必要ですか? チェックサムを格納するために 1 バイトを使用しようとしましたが、受信側は格納されているものと同じチェックサムを取得できません。

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 ビット / 1 バイトあたり 8 ビット) が必要です。

于 2013-11-05T13:51:44.597 に答える
1

バイト配列長 1000 のチェックサムのバイト数

破損を検出するにはどのくらいの大きさが必要かを尋ねる場合、それは非常に難しい質問です...

まず、チェックサムがどれほど大きくても、どのように計算されても、検出できない破損の可能性を完全に排除することはできません。(チェックサム値がメッセージ値と同じ数であっても、送信がメッセージとチェックサムの両方を破損する可能性を排除することはできません...まったく同じ方法です。)

考えられるすべての破損のセットを平均すると、N ビットのチェックサムが 2 Nに 1 回破損を検出できないことが期待できます。その確率が高すぎる場合は、N を増やす必要があります。

その単純な分析を超えるには、特定のチェックサム アルゴリズムと、一般的な種類のエラーを検出する能力を考慮する必要があります。たとえば、単一のビット フリップ、ビットの転置などです。私はこれについて「数学を知っている」わけではありませんが、実際のチェックサムアルゴリズムでは非常に複雑になり、経験的なアプローチが最良の答えをもたらすと思います。しかし、推奨されるアルゴリズムは理論上の「2 Nに 1 回」に近づき、一般的なエラー シンドロームに対する特定の弱点はないと思います。

したがって、おそらく最善のアドバイスは、自分が満足できる確率を把握し、それを使用してN... と、そのサイズ (またはそれ以上) のチェックサムを提供するアルゴリズムを選択することです。


私が実行している信頼できないネットワークのシミュレーションは信頼できるようにすることができるため、これはパケットの破損の場合ではないことに注意してください。

その場合、任意のチェックサム アルゴリズムを使用できます。1 ビットのチェックサムでも。すなわちパリティビット。(またはゼロビットでも。100% 信頼できるネットワークにはチェックサムは必要ありません。)


...受信者は、保存されているものと同じチェックサムを取得できません。

書かれたコードはCRC32を使用しています。それは 32 ビットまたは 4 バイトのチェックサムです ... チェックサムされるデータのバイト数に関係なく。data_outただし、メッセージ内の CRC32 の最下位バイトのみを渡しているようです。受信者が同じことを (下位バイトのみを使用して) 行っていない限り、チェックサムは一致しません。

于 2013-11-05T14:27:35.670 に答える