web-dev-qa-db-ja.com

1の補数チェックサムはエラー検出にどのように役立ちますか?

チェックサムは、ビットを追加するだけで生成できます。 1の補数を取るという追加の手順はどのように役立ちますか?

私はその理論を理解しています。私は1の補数を計算する方法を知っており、補数を追加すると結果がすべて1になる方法を知っています。

エラーの検出方法の簡単な例を見てみたいと思います。

19
node ninja

あなたが探している例が見つかると思います ここ

1の補数を行う理由は、1の補数がすべての値の合計に加算され、結果がマシンのビット長(上記の例では16ビット)にトリミングされると、すべて1になるためです。 CPUには、1の補数をとる機能があり、すべての1の補数をとる-1はすべて0です。

理由:CPUは、通常使用するチャンクを除いて、ビットを処理することを嫌います。したがって、2つの64ビット数値を追加するには1サイクルかかる場合がありますが、その数値のすべてのビットを個別にチェックするには、さらに多くの時間がかかります(単純なループでは、おそらく8x64サイクルにもなります)。 CPUには、1の補数を簡単に取得し、それに基づいて個々のビットと分岐を検査せずに、最後の計算の結果がゼロであることを検出する機能もあります。つまり、基本的には、チェックサムを非常に高速にチェックできる最適化です。ほとんどのパケットは問題ないので、これによりチェックサムをその場でチェックし、データを宛先にはるかに速く取得できます。

20
Sajid

例:UDPパケットに3つの単語を送信する必要があります。

0110011001100000
0101010101010101
1000111100001100

送信側のUDPは、すべての16ビットワードの合計の1の補数を実行します。これらの16ビットワードの最初の2つの合計は次のとおりです。

0110011001100000
+
0101010101010101
--> 1011101110110101 

上記の合計に3番目の単語を追加すると、次のようになります。この最後の追加にはオーバーフローがあり、ラップアラウンドされていることに注意してください。

--> 0100101011000010

1の補数は、すべての0を1に変換し、すべての1を0に変換することによって取得されます。

したがって、合計0100101011000010の1の補数は1011010100111101であり、これがチェックサムになります。受信側では、チェックサムを含む4つの16ビットワードすべてが追加されます。パケットにエラーが導入されていない場合、受信者での合計は明らかに1111111111111111になります。ビットの1つが0の場合、エラーがパケットに導入されていることがわかります。

3
Y Hoang

「ビットを加算する」とは、パリティビットを計算することを意味すると思います。 チェックサムに関するこのWikipediaエントリ によると、パリティチェックサムの場合、「2ビットエラーが検出されない確率は1/nです」が、モジュラー合計(1の補数など)の場合は、 2ビットエラーが検出されなくなるのは1/nより少し少ないです。」

この「AskDr。Math」列 1の補数を計算する方法について説明します(最も一般的にはTCP/IPの場合)。

1
patrickmdnet