ITの教科書検索
入門・発展ページ読了 約14分

パリティチェックとCRCとは ― 誤り検出の仕組み

パリティチェックとCRCは、送る側が付けた検査用の値でデータの誤りを見つける仕組みです。パリティが2ビットの誤りを見落とす理由と、CRCの割り算を手計算で確かめられます。

目次
  1. 検査用の値を計算して照合する仕組み
  2. なぜ誤りが起きるのか
  3. 誤り検出と誤り訂正の違い
  4. パリティチェックの仕組み
  5. 動かして確かめる:パリティビットを計算する
  6. 確かめる:検出できる誤り・できない誤り
  7. 垂直パリティと水平パリティ
  8. チェックサムの仕組み
  9. CRCの仕組み
  10. 手計算で確かめる:CRCの割り算
  11. ハミング符号の仕組み
  12. 誤りを検出したら、どうするか
  13. 4つの方式の比較
  14. 練習問題

パリティチェックとCRCは、検査用の値を計算して照合する仕組み

パリティチェックとCRCは、データの誤りを検出する仕組みです。送信側は検査用の値を計算して、データに付けます。受信側は同じ計算をやり直して、届いた値と比べます。パリティチェックは、1の個数の偶奇を使う単純な計算です。CRCは、生成多項式で割った余りを使う、より強力な計算です。

送信側① 計算する検査用の値② 付けて送るデータ+検査用の値受信側③ 再計算する計算した値④ 比較する一致不一致誤りなし誤りを検出
パリティ・チェックサム・CRCに共通する、誤り検出の流れです。送信側は検査用の値を計算し、データに付けて送ります。受信側は、届いたデータから同じ計算をやり直します。その値を、届いた検査用の値と比べます。方式ごとに違うのは、①③の計算方法だけです。一致すれば誤りなしと判定して、上の層へ渡します。一致しなければ誤りを検出して、データを捨てます。上位でTCPが再送を頼む場合もあります。

EthernetのフレームではCRCの値を末尾のFCSに入れ、誤りのあるフレームは捨てます。捨てたデータを再送するのは、上の層のTCPです。

なぜ誤りが起きるのか

通信では、データを電気信号・光・電波として送ります。信号は、本来の値と違う形で届くことがあります。原因は、ケーブル近くの電気ノイズや無線LANの電波干渉、光ファイバの劣化などです。

届いた信号は、0か1かに判定し直されます。このとき、本来1だったビットが0に化けてしまうことがあります。これをビット誤りと呼びます。

通信技術が発達しても、ビット誤りが起きる可能性をゼロにはできません。そこで通信では、誤りを起こさない工夫に加えて、誤りが起きたことに気づける仕組みを用意します。これが誤り検出です。

誤り検出と誤り訂正の違い

  1. 1

    誤り検出

    届いたデータに誤りがあるかないかだけを判定します。どのビットが間違っているかは分かりません。誤りが見つかったデータは、捨てるか、再送を頼みます。

  2. 2

    誤り訂正

    誤りがあるかないかに加えて、どのビットが間違っているかまで特定します。特定したビットは、その場で元に戻します。再送を待たずに済みますが、検出だけの方式より多くの検査ビットが必要です。

パリティチェック・チェックサム・CRCは、基本的に誤り検出の方式です。ハミング符号は、誤り訂正もできる代表的な方式です。メモリのECCなどに使われます。

パリティチェックの仕組み

パリティチェックは、データ中の1の個数が偶数か奇数かを利用する、最も単純な誤り検出の方式です。送信側は、データの末尾にパリティビットを1ビット付け足します。あらかじめ決めたルールに合わせて、その値を選びます。

方式ルール「1101001」(1が4個)の場合
偶数パリティデータとパリティビットを合わせた1の個数を偶数にする1がすでに4個なので、パリティビットは0
奇数パリティデータとパリティビットを合わせた1の個数を奇数にする1が4個なので、パリティビットは1にする

受信側は、届いたデータ部分だけを使って同じ計算をやり直します。計算し直した値と届いたパリティビットが一致すれば誤りなし、一致しなければ誤りありと判定します。

1ビットが反転すると、1の個数は必ず1個増減します。そのため偶奇が必ず変わり、1ビットの誤りは必ず検出できます。一方、偶数個のビットが反転すると、1の個数が偶数個ぶん増減するので、偶奇は変わりません。偶数個の誤りは必ず見逃されます。次の2つの図で、この動きを確かめられます。

動かして確かめる:パリティビットを計算する

7ビットのデータの各ビットを押すと0と1が切り替わり、右端のパリティビットが自動で計算されます。偶数パリティと奇数パリティの切り替えで、値がどう変わるか確かめられます。

データ(7ビット)。押すと0と1が切り替わります

1

左の7個がデータ、右端(色付き)が自動で付くパリティビットです。

パリティの方式
データの1の個数
3個
付けるパリティビット
1
送信する符号語(データ+パリティ)
10110001

確かめる:検出できる誤り・できない誤り

データにパリティビットを付けたものを、符号語と呼びます。下の図では、送信した符号語に通信中に起きることを、誤りなし・1ビット反転・2ビット反転の3つから選べます。選んだ内容によって、受信側の判定がどう変わるかを確かめられます。

例として、送信側が偶数パリティで符号語 11010010(データ1101001+パリティ0)を送ったとします。

通信中に誤りが起きなかった場合──

受信した符号語11010010

受信側がデータ部分から計算しなおしたパリティビットは0。受信したパリティビット0と一致するため、誤りなしと判定されます。

垂直パリティと水平パリティ

ここまでのパリティチェックは、垂直パリティとも呼ばれます。垂直パリティだけでは、誤り検出しかできません。データをブロックごとに並べて、各行のパリティと各列のパリティの両方を付ける方法もあります。こうすると、1ビットの誤りを訂正できるようになります。

次の例は、3×3のデータに、行ごとの偶数パリティと列ごとの偶数パリティを付けたものです。

列1列2列3行パリティ(偶数)
行11010
行20110
行31100
列パリティ(偶数)0000

行2・列3のビットが通信中に1から0へ化けたとします。受信側が行ごと・列ごとにパリティを計算し直すと、行2と列3のパリティが合わなくなります。誤りは、パリティが合わない行と列が交わるマスだと特定できます。そのビットを反転すれば、訂正できます。

行と列という2方向からそれぞれ独立にチェックすることで、誤りの位置まで絞り込めます。次のハミング符号も、検査ビットの組み合わせから位置を特定する、同じ発想を使います。

チェックサムの仕組み

チェックサムは、データを一定のビット数ごとに区切って足し合わせる方式です。その合計を、検査用の値にします。パリティチェックが使うのは、1の個数の偶奇だけです。チェックサムは合計値そのものを使うため、より多くの誤りを検出できます。

IPヘッダ・TCPヘッダ・UDPヘッダには、それぞれチェックサムの欄があります。ルーティングの記事で説明したとおり、ルータを1台通過するたびに、IPヘッダのTTLは1減ります。IPヘッダのチェックサムは、このとき同時に再計算されます。TCP・UDPのヘッダにも同じ欄があり、データ部分も含めた誤りを検出します。

CRCの仕組み

CRCは、データを2進数の値とみなして割り算をする方式です。割る数には、あらかじめ決めた定数を使います。この定数を生成多項式と呼びます。割ったときの余りが、検査用の値になります。

計算は複雑ですが、見逃す確率が低い方式です。特に、連続した複数ビットの誤りに強い特徴があります。このような誤りを、バースト誤りと呼びます。

CRCの割り算では、ふつうの引き算の代わりにXOR演算を使います。XOR演算は、桁ごとに同じなら0、違えば1になる演算です。生成多項式の次数がnのとき、検査用の値はnビットになります。

カプセル化の記事で説明した、Ethernetフレーム末尾のFCSは、32ビットのCRCであるCRC-32です。ネットワークで最も広く使われているCRCの実例です。CRC-32のほかにも、生成多項式の長さが違うCRC-8やCRC-16など、用途に応じたビット数のCRCがあります。

CRCは、通信中の偶発的な誤りを見つける仕組みです。意図的な改ざんの検知には使えません。攻撃者はデータを書き換えたうえで、合うCRCを計算し直して付け直せるからです。改ざんの検知には、秘密の鍵を使う別の仕組みが必要です。

手計算で確かめる:CRCの割り算

短い例で、実際にCRCを手計算します。データを1101、生成多項式を1011とします。1011は、x³+x+1を2進数で表したものです。生成多項式が4ビットなので、データの末尾に0を3個足してから割り算を始めます。

先頭が1の窓だけXOR1101+00011010001段目 位置0101101100002段目 位置1101100111003段目 位置2101100010104段目 位置310110000001余り(CRC)001
データ1101に、生成多項式の次数ぶんの0を3個足すと、1101000になります。これを、生成多項式1011でXOR演算を使って割っていきます。窓は、オレンジ色の点線で示しています。先頭ビットが1の段だけ、信号色の数字で示す生成多項式とXORします。XORでは、桁ごとに同じなら0、違えば1になります。4段終えると、末尾3ビットに余り001が残ります。これがCRCです。

4段のXOR演算を終えると、末尾3ビットに余り001が残ります。これがCRCです。送信するデータは、元のデータの末尾にこのCRCを付けた1101001になります。

受信側は、届いた1101001を同じ生成多項式で割り直します。誤りがなければ、余りは000になります。送信した7ビットのうちどこか1ビットだけを反転させて割り直すと、7通りのどの位置でも余りは000になりません。このCRCでは、すべての1ビット誤りが検出できます。

ハミング符号の仕組み

ハミング符号は、誤りが起きたビットの位置を特定できる方式です。そのために、複数の検査ビットを、それぞれ異なるビットの組み合わせから計算しておきます。位置が分かれば、そのビットを反転させるだけで元に戻せます。

よく使われる(7,4)ハミング符号は、4ビットのデータに3ビットの検査ビットを加えて、7ビットの符号にします。(7,4)ハミング符号は、1ビットの誤りを訂正できます。

たとえば、データ1011を符号化すると、符号0110011ができます。このうち5ビット目を反転させて受信したとします。検査ビットの照合結果から、5ビット目が誤りだと特定できます。そのビットを反転させれば、元のデータに戻せます。

(7,4)ハミング符号だけでは、1ビットの誤りの訂正と2ビットの誤りの検出を同時には行えません。2ビットの誤りが起きても、検査ビットの照合結果は1ビットの誤りと同じように見えます。そのため、元の2ビットとは別のビットを必ず直してしまいます。

1ビットの訂正と2ビットの検出を同時に行うには、符号全体に1ビットの全体パリティを付け加えます。この形を、拡張ハミング符号(8,4)と呼びます。メモリのECCなどで1ビット訂正・2ビット検出と説明される方式は、この拡張ハミング符号の形です。

検査ビットの照合結果と全体パリティの両方が一致しなければ、1ビットの誤りとして位置を特定し、訂正できます。全体パリティのビットだけが反転した場合も1ビットの誤りとして検出でき、そのビットを戻せば訂正できます。照合結果だけが一致せず、全体パリティは一致するときは、2ビットの誤りが起きていると分かります。ただし、位置は特定できません。

誤りを検出したら、どうするか

誤りを検出したあとの対応は、層によって違います。

  1. 1

    データリンク層:捨てるだけ

    OSI参照モデルの記事で説明したとおり、Ethernetは受信したフレームのFCSで誤りを検出すると、そのフレームを捨てるだけです。再送を頼む手続きは、Ethernet自身には含まれていません。

  2. 2

    トランスポート層:再送を頼む

    TCPハンドシェイクの記事で説明したとおり、TCPは一定時間内にACKが返らなければ、同じデータを再送します。確認応答と再送を組み合わせて信頼性を確保する方式をARQと呼びます。UDPにはこの仕組みがありません。

Ethernetが誤りのあるフレームを捨てても、上位でTCPを使っていれば再送されます。送信側が、ACKが返ってこないことをきっかけに再送するからです。下位層が誤りを検出し、上位層が再送します。この組み合わせで、データが届いたかどうかが確かめられます。

一方、HDLCやベーシック手順は、データリンク層の中で再送まで行う手順です。その手順は、伝送制御の記事で説明しています。

4つの方式の比較

方式検出できる誤り訂正できるか主な使われ方
パリティチェック1ビットの誤り(奇数個の誤り)基本は不可(垂直・水平を組み合わせると一部可)シリアル通信、メモリの簡易チェック
チェックサム多くの誤り(偶数個の誤りでも合計が変われば検出)不可IP・TCP・UDPのヘッダ
CRCバースト誤り(連続した誤り)に特に強い不可Ethernetのフレーム(FCS)、ZIP・PNGなど
ハミング符号(7,4)は1ビット訂正のみ。拡張形(8,4)で1ビット訂正・2ビット検出を同時に行える1ビットは可(位置を特定できる)メモリのECC。拡張形が多い

練習問題(全5問)

Q1パリティチェックの説明として正しいものは?
Q2偶数パリティで、データ「1100101」(1が4個)に付けるパリティビットは?
Q3CRCの仕組みとして正しいものは?
Q4ハミング符号の特徴として正しいものは?
Q5誤りを検出した後の対応について、正しい記述は?

選んでから「採点する」を押すと、解説つきで答え合わせができます。

関連記事

おすすめの本 PR

ネットワークを初めて学ぶ人向けの入門書です。

目的別の本の選び方を見る

ネットワークの記事を探す