0

現在、A から B にデータを送信する必要があるプロジェクトに取り組んでいます。B がデータを受信したら、送信中にエラーが発生したかどうかを判断できる必要があります。

私は CRC について読み、CRC16 が私のニーズに適していると判断しました。データをチャンクに切り刻んで、一度にチャンクを送信できます。

しかし、エラーが発生したかどうかを B がどのように判断できるかについて、私は混乱しています。最初に考えたのは、A が CRC を生成してから B にデータを送信することでした。B がデータを受信したら、CRC を生成して A に送り返します。CRC が一致すれば、送信は成功です。BUT - B から A への CRC の送信にエラーが発生した場合はどうなるでしょうか。データと同じように破損する可能性があるため、CRC を送り返すのは冗長に思えます。

何かが欠けているか、シナリオを過度に複雑にしていますか?

任意の考えをいただければ幸いです。

ありがとう、P

4

2 に答える 2

1

CRC はエラー検出であり、コードは有限数のエラーしか検出できないことに注意してください。ただし、CRC16 衝突の確率を計算することはできます (これは、ほとんどの実用的な目的では比較的小さい値です)。

CRC がどのように機能するかは、多項式除算を使用することです。あなたのCRC値は多項式です(CRC16の場合、おそらく(x ^ 15)のオーダーです)。つまり、多項式は係数としてバイナリで表されます。たとえば、x^3 + [(0)*x^2] + x + 1 = 1011 は x^3 次の多項式です。ここで、データ チャンクを CRC 多項式で割ります。残りは CRC 値です。したがって、この除算操作を B の受信チャンク (剰余を含む) に対して再度実行すると、多項式除算は 0 になるはずです。これが発生しない場合は、伝送エラーが発生しています。

ここで、これは (CRC 値の破損を含めて) n ビットが破損している場合、CRC チェックが失敗を検出することを前提としています (衝突がないことを前提としています)。CRC チェックに合格しない場合は、単純に再送信要求を A に送信します。それ以外の場合は、通常どおり処理を続行します。衝突が発生した場合、受信したデータを手動で確認するまで (または、できればエラーのないコピーをいくつか送信するまで)、データが破損していることを確認する方法はありません。この方法では多くのオーバーヘッドが発生し、冗長性は有限の精度でしか機能しないことに注意してください。また)。

于 2012-12-31T15:33:52.730 に答える
1

通常、データと一緒にチェックサムを送信します。次に、受信側でデータからチェックサムを計算し、それに付随するチェックサムと比較します。それらが一致しない場合は、データまたはチェックサムのいずれかが破損しています (衝突が発生するほど不運でない限り) - この場合、再送信を要求する必要があります。

于 2012-12-31T15:27:32.923 に答える