伝送の誤り制御と同期方式を図解:パリティ・CRC・ハミング符号から調歩同期・HDLC・FCSまで
ネットワークでデータを送るときには、「届いたビットは正しいか」と「どこからどこまでが1文字・1フレームか」の2つを考える必要があります。この2つを混ぜずに説明します。
送った「1」が「0」に変わっていないか?
受信:1001 ← 誤り
01011001... のどこが文字やフレームの境目?
[フレームの先頭] ... [末尾]
1. 誤り制御:検出と訂正は違う
ノイズによってビットが反転しても、受信側は元データを知らないため、そのままでは気付けません。そこで余分な検査ビットを付けます。
| 方式 | 誤り検出 | 誤り訂正 | 主な考え方 |
|---|---|---|---|
| 単純パリティ | 奇数個のビット反転を検出 | できない | 1 の数を偶数/奇数に |
| 水平垂直パリティ | 多くの誤りパターンを検出 | 1ビット訂正 | 行と列の交点 |
| CRC | 選んだ多項式に応じ強力に検出 | 単体では訂正しない | 多項式の剰余 |
| ハミング符号 (7,4) | 1ビット訂正・2ビット誤り検出 | 1ビット訂正 | 検査組の不一致位置 |
2. パリティチェック:1の個数を偶数にそろえる
偶数パリティなら、データ+パリティビットに含まれる1の個数が偶数になるよう末尾に1ビットを付けます。例えばデータ 1011 には1が3個あるため、パリティビットは 1。送信ビット列は 10111 です。
もし1ビットだけ反転すれば1の個数が奇数になり、異常を検出できます。ただし2ビット同時に反転すると偶数のままになることがあり、見逃します。奇数パリティは「1の個数を奇数にする」点が異なるだけです。
3. 水平・垂直パリティ:行と列の交差点から1ビットを直す
16個のデータビットを4×4に並べ、行ごとのパリティと列ごとのパリティを両方計算します。名称は教材によって行方向・列方向の呼び方が揺れることがあるため、「各行と各列を検査する」と覚えるのが確実です。
| 行\列 | 1 | 2 | 3 | 4 | 行パリティ |
|---|---|---|---|---|---|
| 1 | 1 | 0 | 1 | 0 | 0 |
| 2 | 1 | 1 | 0 | 0 | 0 |
| 3 | 0 | 0 | 1 | 1 | 0 |
| 4 | 0 | 1 | 1 | 0 | 0 |
| 列パリティ | 0 | 0 | 1 | 1 | - |
3行目の検査が不一致、2列目の検査も不一致になります。
(3行目, 2列目)を反転し直せば、1ビット誤りを訂正できます。
2ビット以上を必ず訂正できるわけではありません。たとえば長方形の4隅をすべて反転すると、どの行・列も偶数個の反転になり、検出すらできない場合があります。
4. CRC:割り算の『余り』を一緒に送る
CRC(巡回冗長検査)は、ビット列を多項式とみなし、送受信側が共通で決めた生成多項式で割ったときの余りを検査情報にします。二進数の割り算では引き算の代わりにXOR(排他的論理和)を使い、繰り上がり・借りはありません。
受信側が送信ビット列を同じ生成多項式で割り、剰余が0なら「このCRCでは誤りを検出しなかった」と判断します。0だから絶対に正しいわけではありません。CRCの種類によって検出できる誤りパターンは異なります。
CRCは通信のフレーム検査にもよく使われ、HDLCの FCS の中身にもつながります。後ほどフレームの構造と合わせて説明します。
5. ハミング符号:どの位置が壊れたかを計算する
代表例のハミング(7,4)符号は、4データビットに3検査ビットを追加し、合計7ビットを送る方式です。位置1・2・4に検査ビットを置き、位置3・5・6・7にデータを置きます。
例えば位置3が反転したときは、位置1と位置2に対応する検査組で不一致が起き、位置4の検査組は一致します。不一致の位置番号を2進数で組み合わせると3となるので、位置3を反転し直して訂正できます。
6. 同期制御:受信側が『境目』を知るための方法
誤り検出とは別に、連続して届く 01001011... をどこで区切るかが必要です。通信の教材でよく登場するのが調歩同期・キャラクタ同期・フラグ同期の3つです。
| 方式 | 区切りの手がかり | 主な対象 |
|---|---|---|
| 調歩同期 | スタートビットとストップビット | 文字単位:非同期シリアル通信 |
| キャラクタ同期 | 特定の同期用制御文字(例:SYN) | 文字の並びを同期 |
| フラグ同期 | 特定のビット列(例:01111110) | ビット指向のフレーム(HDLC) |
7. 調歩同期方式(ちょうほどうき):1文字ごとに開始と終了を知らせる
ここは「情報同期」ではなく「調歩同期」が正しい名称です。UARTなどの非同期シリアル通信で代表的な方式です。通信していない間は信号が通常1(アイドル)、スタートビット0を検出すると、受信側は事前に決めた通信速度に合わせてデータビットを読み取ります。最後にストップビット1を置きます。
文字単位で同期し直せるので、文字と文字の間に不規則な待ち時間を置けます。一方、各文字に開始・停止ビットの分だけオーバーヘッドが付きます。例えば8データビット+開始1+停止1なら、10ビットで8ビットの情報を届けます。
8. キャラクタ同期方式:SYNなどの制御文字で文字境界を合わせる
キャラクタ同期は、文字の特別な符号(同期用キャラクタ)を送って、受信側に文字のまとまりを見つけてもらう方法です。古典的なBSCなどの文字指向プロトコルで使われます。調歩同期のように毎文字スタート・ストップビットを付ける方式とは区別します。
文字の中に制御文字と同じ値が登場する場合は区別する処理が必要です。つまり意味のある制御文字を境目の目印にする方式です。
9. フラグ同期方式:ビット列そのものをフレーム境界にする
フラグ同期は特別なビットパターンでフレームの先頭と末尾を示します。HDLCでは8ビットの 01111110(16進数 0x7E)がフラグです。
ここで疑問が生まれます。データの中に偶然 01111110 が含まれたら、終端と勘違いするのでは? この対策が次に説明するビットスタッフィングです。
10. HDLC:フレームの区切り・制御・誤り検出を組み合わせた方式
HDLC(High-Level Data Link Control)は、ビット指向のデータリンク層プロトコルです。フラグでフレームを区切り、アドレス/制御情報とデータを送り、FCSで誤りを調べます。
Addressは通信相手を識別し、Controlはフレームの種類や順序番号などを扱います。Informationはデータ本体、FCS(Frame Check Sequence)は伝送途中のビット誤りを検出するための検査値です。HDLCのフレーム形式やアドレス/制御の長さは構成に応じ異なり、図は基本イメージです。
ビットスタッフィング:1が5個続いたら0を挿入
HDLCのビット同期リンクでは、フレームの中身に1が5個連続したら、送信側がその直後に0を追加します。これでデータ部分にフラグ 01111110 と同じ並びが現れにくくなります。受信側は、連続する1を5個見つけてその後の追加0を除去します。
重要:フラグの前後そのものにはスタッフィングしません。HDLCのビットスタッフィングと、非同期PPPなどで使うバイト(オクテット)スタッフィングは別の方式です。RFC 1662では両者が区別されています。
11. FCS:HDLCの受信側が『壊れていないか』を調べる検査値
FCSは「CRCという計算方式を使って作るフレーム用の検査ビット列」です。名称の違いを押さえると混乱しません。
たとえばRFC 1662のHDLC-likeフレーミングではFCSに16ビットや32ビットを使います。FCSは暗号化や改ざん防止の認証ではなく、偶発的な伝送誤りの検出が目的です。誤りが見つかったときの再送や回復は、リンク制御や上位層の仕組みと組み合わせて行います。
12. 操作ラボ:ビットを反転して誤り検出と同期を体験
以下のラボでは、4×4ビット表をクリックして意図的にビットを反転できます。行・列の不一致が交差すれば1ビット誤りの位置を特定できることを確かめられます。CRCの割り算、ハミング符号、HDLCのフラグ/スタッフィングも切り替えて確認できます。
送受信を実験するラボ
4×4のビットをクリックして反転
表の右端が行検査、下端が列検査です。不一致(赤)が1行・1列なら交点を特定できます。
| 行 | 列1 | 列2 | 列3 | 列4 | 行検査 |
|---|---|---|---|---|---|
| 1 | 一致 | ||||
| 2 | 一致 | ||||
| 3 | 一致 | ||||
| 4 | 一致 | ||||
| 列検査 | ○ | ○ | ○ | ○ | ー |
反転したビット:0個 / すべての検査が一致しています。
本ラボはブラウザ内のビット演算だけで動く学習用シミュレーションです。実ネットワークへの送信や外部サービスへの通信は行いません。
13. まとめ:『誤り』と『区切り』を混ぜない
誤り制御のパリティ・CRC・ハミング符号は「正しく届いたか」を調べる仕組みです。同期制御の調歩同期・キャラクタ同期・フラグ同期は「どこから読めばよいか」を知らせます。HDLCはフラグ同期とFCSなどを組み合わせて、フレーム単位の通信を扱います。
注:本文・ラボは学習用に単純化したモデルです。CRC多項式の選択・初期値・反転規則、実際のHDLC実装詳細は使用規格で異なります。