株式会社ジオデータ開発 ロゴ
株式会社ジオデータ開発GEO DATA DEVELOPMENT Inc.
DATA COMMUNICATIONS

伝送の誤り制御と同期方式を図解:パリティ・CRC・ハミング符号から調歩同期・HDLC・FCSまで

ネットワークでデータを送るときには、「届いたビットは正しいか」と「どこからどこまでが1文字・1フレームか」の2つを考える必要があります。この2つを混ぜずに説明します。

誤り制御

送った「1」が「0」に変わっていないか?

送信:1011
受信:1001 ← 誤り
同期制御

01011001... のどこが文字やフレームの境目?

[文字A] [文字B]
[フレームの先頭] ... [末尾]

1. 誤り制御:検出と訂正は違う

ノイズによってビットが反転しても、受信側は元データを知らないため、そのままでは気付けません。そこで余分な検査ビットを付けます。

送信データ
検査ビットを付加
通信中にビット化け
受信側で検査
方式誤り検出誤り訂正主な考え方
単純パリティ奇数個のビット反転を検出できない1 の数を偶数/奇数に
水平垂直パリティ多くの誤りパターンを検出1ビット訂正行と列の交点
CRC選んだ多項式に応じ強力に検出単体では訂正しない多項式の剰余
ハミング符号 (7,4)1ビット訂正・2ビット誤り検出1ビット訂正検査組の不一致位置
検出は「壊れていると分かる」、訂正は「どこが壊れたか分かって元に戻せる」。CRCに誤り訂正能力があると考えないことが大切です。

2. パリティチェック:1の個数を偶数にそろえる

偶数パリティなら、データ+パリティビットに含まれる1の個数が偶数になるよう末尾に1ビットを付けます。例えばデータ 1011 には1が3個あるため、パリティビットは 1。送信ビット列は 10111 です。

データ 1011(1が3個)
パリティ 1 を追加
10111(1が4個)

もし1ビットだけ反転すれば1の個数が奇数になり、異常を検出できます。ただし2ビット同時に反転すると偶数のままになることがあり、見逃します。奇数パリティは「1の個数を奇数にする」点が異なるだけです。

3. 水平・垂直パリティ:行と列の交差点から1ビットを直す

16個のデータビットを4×4に並べ、行ごとのパリティと列ごとのパリティを両方計算します。名称は教材によって行方向・列方向の呼び方が揺れることがあるため、「各行と各列を検査する」と覚えるのが確実です。

行\列1234行パリティ
110100
211000
300110
401100
列パリティ0011-
3行目・2列目で1ビット反転

3行目の検査が不一致、2列目の検査も不一致になります。

不一致の交点が誤り位置

(3行目, 2列目)を反転し直せば、1ビット誤りを訂正できます。

2ビット以上を必ず訂正できるわけではありません。たとえば長方形の4隅をすべて反転すると、どの行・列も偶数個の反転になり、検出すらできない場合があります。

4. CRC:割り算の『余り』を一緒に送る

CRC(巡回冗長検査)は、ビット列を多項式とみなし、送受信側が共通で決めた生成多項式で割ったときの余りを検査情報にします。二進数の割り算では引き算の代わりにXOR(排他的論理和)を使い、繰り上がり・借りはありません。

小さな架空の例
データ:1101
生成多項式:1011(次数3)
末尾にゼロ3個 → 1101000
1101000 ÷ 1011 → 余り 001
送信:1101 + 001 = 1101001

受信側が送信ビット列を同じ生成多項式で割り、剰余が0なら「このCRCでは誤りを検出しなかった」と判断します。0だから絶対に正しいわけではありません。CRCの種類によって検出できる誤りパターンは異なります。

CRCは通信のフレーム検査にもよく使われ、HDLCの FCS の中身にもつながります。後ほどフレームの構造と合わせて説明します。

5. ハミング符号:どの位置が壊れたかを計算する

代表例のハミング(7,4)符号は、4データビットに3検査ビットを追加し、合計7ビットを送る方式です。位置1・2・4に検査ビットを置き、位置3・5・6・7にデータを置きます。

1
P1
2
P2
3
D
4
P4
5
D
6
D
7
D

例えば位置3が反転したときは、位置1と位置2に対応する検査組で不一致が起き、位置4の検査組は一致します。不一致の位置番号を2進数で組み合わせると3となるので、位置3を反転し直して訂正できます。

基本のハミング(7,4)符号は1ビット訂正が可能ですが、2ビット誤りでは症状を区別できない場合があります。1ビット訂正+2ビット検出(SECDED)には全体パリティを追加する拡張ハミング符号などを使います。

6. 同期制御:受信側が『境目』を知るための方法

誤り検出とは別に、連続して届く 01001011... をどこで区切るかが必要です。通信の教材でよく登場するのが調歩同期・キャラクタ同期・フラグ同期の3つです。

方式区切りの手がかり主な対象
調歩同期スタートビットとストップビット文字単位:非同期シリアル通信
キャラクタ同期特定の同期用制御文字(例:SYN)文字の並びを同期
フラグ同期特定のビット列(例:01111110)ビット指向のフレーム(HDLC)

7. 調歩同期方式(ちょうほどうき):1文字ごとに開始と終了を知らせる

ここは「情報同期」ではなく「調歩同期」が正しい名称です。UARTなどの非同期シリアル通信で代表的な方式です。通信していない間は信号が通常1(アイドル)、スタートビット0を検出すると、受信側は事前に決めた通信速度に合わせてデータビットを読み取ります。最後にストップビット1を置きます。

待機
1
START
0
D0
0
D1
1
D2
0
D3
0
D4
0
D5
0
D6
0
D7
1
STOP
1

文字単位で同期し直せるので、文字と文字の間に不規則な待ち時間を置けます。一方、各文字に開始・停止ビットの分だけオーバーヘッドが付きます。例えば8データビット+開始1+停止1なら、10ビットで8ビットの情報を届けます。

8. キャラクタ同期方式:SYNなどの制御文字で文字境界を合わせる

キャラクタ同期は、文字の特別な符号(同期用キャラクタ)を送って、受信側に文字のまとまりを見つけてもらう方法です。古典的なBSCなどの文字指向プロトコルで使われます。調歩同期のように毎文字スタート・ストップビットを付ける方式とは区別します。

SYN
SYN
ヘッダ制御文字
本文
終了制御文字

文字の中に制御文字と同じ値が登場する場合は区別する処理が必要です。つまり意味のある制御文字を境目の目印にする方式です。

9. フラグ同期方式:ビット列そのものをフレーム境界にする

フラグ同期は特別なビットパターンでフレームの先頭と末尾を示します。HDLCでは8ビットの 01111110(16進数 0x7E)がフラグです。

01111110(開始)
フレームの中身
01111110(終了)

ここで疑問が生まれます。データの中に偶然 01111110 が含まれたら、終端と勘違いするのでは? この対策が次に説明するビットスタッフィングです。

10. HDLC:フレームの区切り・制御・誤り検出を組み合わせた方式

HDLC(High-Level Data Link Control)は、ビット指向のデータリンク層プロトコルです。フラグでフレームを区切り、アドレス/制御情報とデータを送り、FCSで誤りを調べます。

Flag
01111110
Address
宛先など
Control
制御情報
Information
データ
FCS
CRC検査値
Flag
01111110

Addressは通信相手を識別し、Controlはフレームの種類や順序番号などを扱います。Informationはデータ本体、FCS(Frame Check Sequence)は伝送途中のビット誤りを検出するための検査値です。HDLCのフレーム形式やアドレス/制御の長さは構成に応じ異なり、図は基本イメージです。

Iフレーム
情報データと順序制御
Sフレーム
監視・確認応答など
Uフレーム
リンクの設定・切断など

ビットスタッフィング:1が5個続いたら0を挿入

HDLCのビット同期リンクでは、フレームの中身に1が5個連続したら、送信側がその直後に0を追加します。これでデータ部分にフラグ 01111110 と同じ並びが現れにくくなります。受信側は、連続する1を5個見つけてその後の追加0を除去します。

元データ:01111110
伝送中:011111010
黄色の0は送信側が追加したスタッフィングビット
受信後:01111110(追加0を除去)

重要:フラグの前後そのものにはスタッフィングしません。HDLCのビットスタッフィングと、非同期PPPなどで使うバイト(オクテット)スタッフィングは別の方式です。RFC 1662では両者が区別されています。

11. FCS:HDLCの受信側が『壊れていないか』を調べる検査値

FCSは「CRCという計算方式を使って作るフレーム用の検査ビット列」です。名称の違いを押さえると混乱しません。

送信側:フレームの対象部分にCRC計算
余りをFCSにして付加
受信側:同じ規則で検査
不一致なら破損と判断

たとえばRFC 1662のHDLC-likeフレーミングではFCSに16ビットや32ビットを使います。FCSは暗号化や改ざん防止の認証ではなく、偶発的な伝送誤りの検出が目的です。誤りが見つかったときの再送や回復は、リンク制御や上位層の仕組みと組み合わせて行います。

整理:フラグは「どこからどこまでが1フレームか」を示す。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実装詳細は使用規格で異なります。