データブロックの合計値を検査値として誤りを検出する方式
チェックサム(checksum)とは、データを一定のブロックに区切ってすべての値を足し合わせ、その合計(または合計から導いた値)を「検査値」としてデータに付加する誤り検出方式です。受信側で同じように合計を取り直し、付加された検査値と一致するかを確認します。
身近な例えで言うと、レジの合計金額の照合です。買い物リストの各商品の金額を全部足した「合計」をメモしておき、家に帰ってもう一度足して合計が合えば「途中で数え間違えていない」と分かります。途中の1つでも金額が変われば合計が変わるので、誤りに気づけるわけです。
チェックサムは計算が単純で高速なのが最大の利点です。上のツールではブロックの値をスライダーで変え、合計から検査値が作られる様子と、受信側で改ざんを注入したときに不一致が検出される様子を確認できます。
チェックサムの基本は、各ブロックの値をすべて足すことです。
チェックサム = Σ(各ブロック)
実際の通信では、桁あふれを防ぐため一定ビット幅(例: 8ビット=mod 256)で丸めることが多く、さらに「合計の補数(法から引いた値)」を検査値にする補数型チェックサムがよく使われます。補数型では「全ブロック + 検査値」の合計が法の倍数(=0)になるため、受信側は合計が0になるかを見るだけで判定できます。
計算例(mod 256, ブロック 60・90・75):
合計 = 60 + 90 + 75 = 225
225 mod 256 = 225
検査値 = 256 − 225 = 31
検算: 225 + 31 = 256 ≡ 0 (mod 256) ✓
注意点:
・順序の入れ替えは合計が変わらないため検出できない
・複数の誤りが相殺すると(+5 と −5 など)見逃すことがある
・確実性を高めるには CRC やハッシュなど、より強力な検査が使われる
結論:データが1ビットでも変われば合計も変わるので、誤りが分かります。
なぜ合計値で誤りが分かるのか? チェックサムの仕組みは「正しいデータの合計=決まった値」という約束に基づいています。送信側があらかじめ正しい合計から作った検査値を添付し、受信側が受け取ったデータを同じように合計したとき、値が一致すればデータは壊れていない、一致しなければどこかが変わった(誤りがある)と分かります。
上の図の例では、ブロック 60・90・75 の合計は 225 です。送信側はこれに合わせた検査値を付けて送ります。受信中に 90 が 97 に変わると、受信側の合計は 232 になり、元の 225 と一致しません。この不一致を見て「誤りが起きた」と判断します。
・数値が大きくなる方向の誤り(ノイズで1ビット反転など)は合計が増える
・数値が小さくなる方向の誤りは合計が減る
・どちらでも合計が変わるため、単純な1カ所の誤りはほぼ確実に検出できます
結論:チェックサムは「誤り検出」はできますが、「誤り訂正」はできません。また、誤りを見逃してしまうパターンも存在します。
なぜ見逃すことがあるのか? チェックサムは「合計」だけを見ています。そのため、2カ所の誤りがちょうど打ち消し合う(一方が +5、もう一方が −5)と、合計が変わらないまま誤りが通り抜けてしまいます。上の図がその例です。
チェックサムの主な限界をまとめると次のとおりです。
・相殺(打ち消し):複数の誤りが増減で相殺されると検出できない
・順序の入れ替え:60・90・75 を 75・60・90 の順に並べ替えても合計は同じなので、順序が入れ替わっても気づけない
・誤り訂正は不可:「どこが間違っているか」は分からないため、訂正するには再送を要求するしかない
より確実な誤り検出にはCRC(=データを特定の式で割った余りを検査値にする方式)やハッシュ(=データの内容から固有のデジタル指紋を作る方式)が使われます。チェックサムは「軽くて速い」分、完璧ではないという点を覚えておきましょう。
結論:チェックサムは「誤りを見つける役」で、見つけた後は「再送を要求する(ARQ)」という別の仕組みと組み合わせて使います。
なぜ再送が必要なのか? チェックサムは「誤りがある・ない」の判断しかできません。どこが壊れたかを特定して自力で直す能力はありません。そのため、誤りを検出したら受信側は送信側に「もう一度送って」とお願い(=NAK、再送要求)します。これがARQ(自動再送要求)です。
インターネットで使われる TCP(=データを確実に届けるための通信の決まりごと)でも、チェックサムで誤りを検出し、問題があれば同じように再送を要求しています。
・正しく届いた:受信側が「ACK(了解)」を返す
・誤りがあった:受信側が「NAK(再送してください)」を返す、または一定時間待っても返事がなければ送信側がタイムアウトで再送する
・誤りを検出して再送させることで、最終的に正しいデータが届きます
チェックサムは「軽くて速い誤り検出」が求められる場面で広く使われています。代表的な用途を見てみましょう。
| 分野 | 具体例 | 目的 |
|---|---|---|
| ネットワーク | TCP / UDP / IP ヘッダ | パケットの破損検出 |
| ファイル | ダウンロードの整合性確認 | 転送中の破損・改ざん検出 |
| 記憶装置 | メモリ・ストレージ | 書き込み/読み出しの検査 |
とくにTCP/IP の各ヘッダにはチェックサムフィールドがあり、ルータや受信ホストがパケットの破損を素早く検出して破棄します。ファイル配布では SHA-256 などのハッシュ値を「チェックサム」と呼ぶこともありますが、これは単純な和より遥かに強力で改ざん検出に向いています。
チェックサムの特徴:
・チェックサムは「誤り検出のみ」で訂正はできない(訂正はハミング符号など)
・単純で高速だが、相殺・順序入替の誤りは見逃すことがある
・誤りの検出力と計算コストは、パリティ<チェックサム<CRC<ハッシュの順に高くなる