誤り制御方式とは?パリティ・ハミング符号・CRCの仕組みを図解
応用情報技術者試験では、誤り制御方式として「パリティチェック」「ハミング符号」「CRC」がセットで問われることが多く、それぞれが「誤り検出のみ」なのか「誤り訂正まで可能」なのかを混同すると失点しやすい分野です。仕組みの違いを図で整理しながら押さえていきましょう。
誤り制御方式とは何か
誤り制御方式(Error Control)とは、データを通信・記憶する際にノイズや障害によって生じるビット誤りを検出、あるいは訂正するための仕組みの総称です。大きく分けると次の2種類があります。
- 誤り検出(Error Detection): データに誤りが発生したことを検知できるが、どのビットが誤っているかは分からない方式
- 誤り訂正(Error Correction): 誤りを検知した上で、どのビットが誤っているかを特定し自動的に修復できる方式
検出だけであれば「再送してもらう」という対応で済みますが、訂正まで行うにはより多くの冗長ビットが必要になります。この冗長ビットの量とできることのトレードオフが、各方式を理解するポイントです。
パリティチェック:最小コストの誤り検出
パリティチェックは、データビット列に対して1ビットの検査ビット(パリティビット)を付加し、1の個数の偶奇を一定に保つことで誤りを検出する方式です。
- 偶数パリティ: 1の個数が偶数になるようパリティビットを設定
- 奇数パリティ: 1の個数が奇数になるようパリティビットを設定
例えば 1011 というデータに偶数パリティを付ける場合、1の個数は3個(奇数)なので、パリティビットに 1 を付加して 10111 とし、1の個数を4個(偶数)に揃えます。受信側で1の個数を数え、想定した偶奇と一致しなければ誤りありと判定します。
パリティチェックの弱点は、2ビット同時に誤ると検出できないことです。2ビットが反転すると偶奇が元に戻ってしまうため、誤りなしと誤判定してしまいます。また、誤りを検出できても「どのビットが誤ったか」は分からないため、訂正はできません。
ハミング符号:誤り訂正を実現する仕組み
ハミング符号(Hamming Code)は、複数のパリティビットを異なる位置・異なる組み合わせのビットに対して計算することで、1ビットの誤りであれば「どのビットが誤ったか」まで特定し、自動的に訂正できる方式です。
仕組みを簡単に言うと、データビットに対して複数のパリティビットを重ね掛けするようなイメージです。それぞれのパリティビットが「担当するビットの範囲」を少しずつずらして設定することで、どのパリティが不一致になったかの組み合わせから、誤りビットの位置を二進数として特定できます。
- 1ビット誤り: 検出・訂正が可能
- 2ビット誤り: 検出は可能だが、訂正すると誤った位置を訂正してしまう(誤り位置を特定できない)
ECCメモリ(Error Correcting Code memory)で使われているのがまさにこのハミング符号(の拡張版)です。サーバー用メモリでECC対応が重視されるのは、宇宙線などによる稀な1ビット反転(ソフトエラー)を自動訂正し、システムをクラッシュさせないためです。
CRC:通信で使われる高精度な誤り検出
CRC(Cyclic Redundancy Check、巡回冗長検査)は、データを多項式とみなし、特定の生成多項式で割った余りを検査符号として付加する方式です。パリティチェックより多くのビットを検査に使う分、**連続した複数ビットの誤り(バースト誤り)**を高い確率で検出できるのが特徴です。
- Ethernet(イーサネットフレーム)
- ZIPなどのファイル圧縮形式
- ストレージ(HDD/SSDのセクタ検査)
といった通信・保存の現場で広く使われています。ただし、CRCは基本的に誤り検出のみで、訂正機能は持ちません。誤りを検出した場合は再送要求(ARQ: Automatic Repeat reQuest)によって対処するのが一般的です。
3方式の比較
| 方式 | 検出できる誤り | 訂正 | 主な用途 |
|---|---|---|---|
| パリティチェック | 1ビット誤り(2ビット誤りは検出不可) | 不可 | シリアル通信、簡易チェック |
| ハミング符号 | 1ビット誤り(2ビット誤りは検出のみ) | 1ビットまで可能 | ECCメモリ |
| CRC | バースト誤りを含む複数ビット誤り | 不可(再送で対応) | ネットワーク通信、ストレージ |
試験では「パリティは2ビット誤りを検出できない」「CRCは訂正でなく検出」「ハミング符号は1ビットなら訂正できる」という各方式のできる範囲の違いが、選択肢の入れ替えでよく狙われます。表の形で整理して覚えておくと、選択肢を読んだ瞬間に判別しやすくなります。
実務での活用場面
誤り制御は低レイヤの技術に見えますが、実務でも判断材料になる場面があります。
- サーバー選定時のECCメモリ: データ基盤やDBサーバーを構築する際、ECC対応メモリかどうかは可用性に直結します。長時間稼働するバッチ処理やSparkクラスタでは、まれなソフトエラーによるジョブ異常終了を避けるためにECCメモリを選定するのが定石です
- ネットワーク層でのCRC: Ethernetフレームには標準でCRCによる誤り検出(FCS: Frame Check Sequence)が組み込まれています。ネットワーク経路のどこかでパケット破損が起きても、上位層まで壊れたデータが渡らない仕組みを支えているのがCRCです
- ストレージの信頼性: SSDやHDDのファームウェアは内部でECC相当の誤り訂正符号を使い、記録メディア上の微小なビット化けを補正しています。ストレージの信頼性を語る上で前提となる技術です
自分もセキュリティをpicoCTFで学び直している中で、通信プロトコルの解析時にCRCの計算過程を追う場面があり、「検出のための仕組みであって暗号ではない」という誤り制御方式本来の目的を改めて意識させられました。
試験対策のポイント
応用情報技術者試験で誤り制御方式が問われる際は、以下の観点が狙われやすいです。
- 誤り検出と誤り訂正の違い(検出のみか、訂正まで可能か)
- パリティチェックの限界(2ビット同時誤りを検出できない)
- ハミング符号が訂正できるビット数(1ビットまで)
- CRCが得意とする誤りの種類(バースト誤り)と、訂正機能を持たない点
- 各方式が実際に使われる場面(ECCメモリ、Ethernet、ストレージ)
「何ビットまで検出・訂正できるか」を数字で押さえ、方式と用途をセットで覚えておくと、応用的な出題にも対応しやすくなります。
まとめ
誤り制御方式は、パリティチェック(簡易な1ビット検出)、ハミング符号(1ビット訂正まで可能)、CRC(バースト誤りに強い高精度検出)という、目的とコストの異なる3つの方式に整理できます。「検出だけか、訂正までできるか」という軸で比較すると、試験問題の選択肢も実務でのメモリ・通信技術の選定理由も理解しやすくなります。ECCメモリやEthernetのCRCなど、私たちが日常的に使っているシステムの信頼性を裏で支えている技術なので、原理を押さえておくと構成判断の助けになります。