伝送技術

このページでは、パリティ・CRC・ハミング符号による誤りの検出と訂正、キャラクタ同期・フラグ同期・調歩同期、HDLCの手順がわかります。

  • 一言で言うと:
    • データを正しく送り届けるための、昔からの基本技術の話
    • 送られてきたデータの誤りを見つけて直す(誤り制御)、送る側と受ける側のタイミングを合わせる(同期制御)、相手の様子を見ながら送る手順を決める(伝送制御、HDLC)の3つ

誤りを見つける・直す(パリティ、CRC、ハミング符号、水平垂直パリティ)→ タイミングを合わせる(キャラクタ同期、フラグ同期、調歩同期)→ 送る手順(HDLC)

覚え方の軸

  • 誤り制御は「見つけて再送か、その場で直すか」
    • 見つけるだけ(再送してもらう)のが、パリティチェックとCRC
    • その場で直せるのが、ハミング符号と水平垂直パリティチェック(1ビットの誤りを訂正)
  • 見つける力は「パリティ<CRC」
    • パリティは1ビットの誤りしか見つけられない。バースト誤り(連続した誤り)は苦手
    • CRCはバースト誤りも見つけられる(HDLCが使う)
  • ハミング符号は「2ビットまで見つけて、1ビットは直す」
    • 誤りのあるビットは、値が1になった検査式に共通に含まれるビット
  • 同期方式は「何を目印にするか」
    • キャラクタ同期はSYNコード、フラグ同期はフラグ(01111110)、調歩同期はスタートビット(0)とストップビット(1)
  • HDLCは「フラグで挟み、CRC(FCS)で確かめ、返事を待たずに続けて送る」
    • フラグと同じ並びがデータに出ないよう、1が5つ続いたら0を入れる(ゼロインサーション)

誤り制御:誤りを見つける、直す(★)

  • 誤り制御:
    • ネットワークで送ったデータの誤りを検出したり、誤ったデータをその場で回復したりすること
  • 誤り制御の方法:
    • ①誤り検出で再送する方法 → パリティチェック、CRC
    • ②誤り訂正で自己修復する方法 → ハミング符号

① パリティチェック

  • パリティチェック:
    • 最もシンプルな検査方法
    • 例えば、7ビットのデータを送るとき、8ビット目に誤り検出用のパリティビットを付けて、データの整合性を調べる
  • 偶数パリティ:
    • 8ビット全体で「1」の数が偶数になるように、パリティビットを入れる
  • 奇数パリティ:
    • 全体で「1」の数が奇数になるように調節する
  • パリティチェックの長所と短所:
    • 構造がシンプルで、機器を対応させやすく、オーバヘッドも少ない
    • でも、1ビットの誤りしか検出できない
    • だから、バースト誤り(データが連続して誤りを起こすこと)には対応できない
  • パリティチェックの例え:
    • 「クラスの出席者は偶数人のはず」と決めておく。1人増えたり減ったりすれば気付くが、2人同時に入れ替わると気付かない

例題(パリティビット)

  • 問題:
    • 7ビットのデータ「1011001」に、偶数パリティと奇数パリティのパリティビットを付けると、それぞれ何になるか
  • 答え:
    • 「1」の数は、1・0・1・1・0・0・1 で4個(偶数)
    • 偶数パリティなら、全体を偶数のままにするので、パリティビットは0
    • 奇数パリティなら、全体を奇数にするので、パリティビットは1
  • 検算:
    • 偶数パリティ:1の数は4 + 0 = 4(偶数)。奇数パリティ:4 + 1 = 5(奇数)
  • 2ビット誤りに弱い理由:
    • 例えば、偶数パリティの「10110010」の2ビットが反転して「01110010」になっても、1の数は4のままで偶数なので、誤りに気付けない

② CRC

  • CRC(Cyclic Redundancy Check:巡回冗長検査):
    • 送るデータに生成多項式を適用して、誤り検出用の冗長データを作り、それを付けて送る
    • 受信側は、送信側と同じ生成多項式で受信データを割り算し、同じ結果ならデータ誤りがないと判断する
  • CRCの特徴:
    • パリティビットも冗長データだが、CRCはさらに複雑な演算をするので、バースト誤りも検出できる
    • HDLC手順が採用している(HDLCは後述)
  • CRCの例え:
    • 長い数字の列を、決まった数(生成多項式)で割った「余り」を一緒に送る。受け取った側も同じ数で割り、余りが合わなければ、どこかが書き換わったとわかる

③ ハミング符号

  • ハミング符号:
    • 情報ビットに検査ビットを付けることで、2ビットまでの誤り検出と、1ビットの誤り自動訂正ができる誤り制御方式
  • 検査ビットの数:
    • 誤りビットを訂正できるように、4ビットの情報に3ビットの検査ビットを持たせる
    • 8ビットの情報には4ビット、16ビットの情報には5ビットの検査ビットが必要

ハミング符号の例

  • 検査ビットの決め方:
    • 4ビットの情報 X1X2X3X4 に、3ビットの検査ビット(冗長ビット)P1、P2、P3 を付ける
    • 次の3つの式の値が0になるように、P1、P2、P3を決める(⊕は排他的論理和)
  • 3つの検査式:
    • X1 ⊕ X3 ⊕ X4 ⊕ P1 = 0
    • X1 ⊕ X2 ⊕ X4 ⊕ P2 = 0
    • X1 ⊕ X2 ⊕ X3 ⊕ P3 = 0
  • 送りたいデータが「1001」のとき:
    • P1 = X1 ⊕ X3 ⊕ X4 = 1 ⊕ 0 ⊕ 1 = 0、P2 = X1 ⊕ X2 ⊕ X4 = 1 ⊕ 0 ⊕ 1 = 0、P3 = X1 ⊕ X2 ⊕ X3 = 1 ⊕ 0 ⊕ 0 = 1
    • 送信するハミング符号は、X1X2X3P3X4P2P1 の順で「1001100」
  • 誤りの見つけ方:
    • 受け取ったデータを3つの式に当てはめる
    • すべての式の値が0なら、誤りビットなし
    • 1ビットの誤りがあれば、そのビットを含む式の値が1になる
  • 受信例:
    • 「1101100」が届いた(X2が1になっている)
    • 1つ目の式は 1 ⊕ 0 ⊕ 1 ⊕ 0 = 0、2つ目の式は 1 ⊕ 1 ⊕ 1 ⊕ 0 = 1、3つ目の式は 1 ⊕ 1 ⊕ 0 ⊕ 1 = 1
    • 1になった2つ目と3つ目の式に共通に含まれ、1つ目の式には含まれないビットはX2なので、X2が誤り
    • X2の「1」を「0」にすれば訂正できる
  • mod関数を使う方法:
    • 排他的論理和の代わりに、関数mod( )を使って検査ビットの値を決める方法もある(2で割った余りを使う)
  • ハミング符号の例え:
    • 3人の見張り(検査式)が、それぞれ決まった数人を見張っている。誰か1人がおかしくなると、その人を見張っている見張りだけが手を挙げる。手を挙げた見張りの組合せから、犯人が1人に決まる

例題(ハミング符号で誤りを直す)

  • 問題:
    • 上と同じ検査式を使う。データ「1011」(X1=1、X2=0、X3=1、X4=1)を送るときの検査ビットを求めよ。また、X3が反転して届いたとき、どう見つけるか
  • 検査ビット:
    • P1 = X1 ⊕ X3 ⊕ X4 = 1 ⊕ 1 ⊕ 1 = 1
    • P2 = X1 ⊕ X2 ⊕ X4 = 1 ⊕ 0 ⊕ 1 = 0
    • P3 = X1 ⊕ X2 ⊕ X3 = 1 ⊕ 0 ⊕ 1 = 0
  • X3が0になって届いたとき:
    • 1つ目の式:1 ⊕ 0 ⊕ 1 ⊕ 1 = 1
    • 2つ目の式:1 ⊕ 0 ⊕ 1 ⊕ 0 = 0
    • 3つ目の式:1 ⊕ 0 ⊕ 0 ⊕ 0 = 1
  • 答え:
    • 1になったのは1つ目と3つ目の式。この2つに共通に含まれ、2つ目の式には含まれないビットはX3
    • だから、X3を0から1に戻せば訂正できる
  • 検算:
    • X3を1に戻すと、1つ目は 1 ⊕ 1 ⊕ 1 ⊕ 1 = 0、3つ目は 1 ⊕ 0 ⊕ 1 ⊕ 0 = 0 で、すべて0になる

④ 水平垂直パリティチェック

  • 水平垂直パリティチェック:
    • ハミング符号と似ているが、パリティチェックを水平方向と垂直方向で同時に行うことで、1ビットの誤りを訂正できる
  • 例:
    • 2行のデータを送るとき、水平方向パリティ(行ごと)と垂直方向パリティ(列ごと)を作る
    • 受信側でも同じ計算をすると、A列のパリティと2行目のパリティが合わない
    • だから、A列2行目のデータが誤りで、本当は0だとわかる
  • 水平垂直パリティの例え:
    • 表の縦の合計と横の合計を両方メモしておく。縦も横も合わない行と列が交わるマスが、書き間違えたマス
  • 冗長化の注意:
    • ハミング符号も水平垂直パリティチェックも、誤り検出や訂正の精度を上げようとすると、それだけチェック情報が冗長になる(送るデータが増える)

同期制御:送る側と受ける側のタイミングを合わせる(★)

  • 同期制御:
    • 通信するとき、送信側と受信側でタイミングを合わせるために行うこと
  • 同期:
    • 互いのタイミングを合わせる作業
    • 同期の取り方には、3種類の方法がある

同期方式

方式 やり方 長所・短所
キャラクタ同期方式 送信側が、送信データの最初に、SYNコードという同期をとるための特別なコードを2個以上続けて送る 8ビットのテキストデータの送信に便利でよく使われた。でも、SYNコードと同じパターンのデータは送れない、8ビット長のデータにしか対応していない
フラグ同期方式(フレーム同期方式) 送りたいデータの前後に、フラグという特別なビット列を入れて同期をとる。フラグはふつう「01111110」 フラグと同じパターンが出なければよいので、データは何ビット単位でもよい。柔軟に運用でき、使いやすい。HDLC手順が採用
調歩同期方式(非同期方式) 7ビットか8ビットの固定長ブロックの前後に、スタートビット「0」とストップビット「1」を付けて送る 1文字ごとに2ビットを付ける必要があるので、大きなデータを送るとオーバヘッドが大きい。今はあまり使われていない
  • キャラクタ同期方式の制約:
    • 16ビットでできている日本語や、可変長のマルチメディアデータは送れない
  • ゼロインサーション:
    • フラグ同期方式で、フラグ「01111110」と同じ並びがデータの中に出ないようにする処理
    • 送信側は、データ中に1が5つ続いたら、強制的に0を挿入する
    • 受信側は、データ中で1が5つ続いたら、次に続く0を強制的に取り除く
    • こうして、フラグの固有性(フラグにしか「1が6つ連続」が現れないこと)を保つ
  • 調歩同期方式の待機中:
    • データを送っていないときは、常にストップビット「1」を送り続けている
    • だから、「1」から「0」(スタートビット)に変わった瞬間に、データの始まりがわかる
  • 3つの方式の例え:
    • キャラクタ同期は、「せーの、せーの」(SYNコード)と声をかけてから話し始める
    • フラグ同期は、話の前後を決まったチャイム(フラグ)で挟む
    • 調歩同期は、1文字ごとに「よーい(スタート)」「おわり(ストップ)」と言う。丁寧だが時間がかかる

例題(ゼロインサーション)

  • 問題:
    • データ「0111111011」を送るとき、ゼロインサーション後のビット列はどうなるか
  • 答え:
    • 先頭の0の後、1が5つ続いたところ(011111)で0を入れる
    • 「01111101011」になる
  • 確かめ:
    • 元のデータには「1が6つ連続」(0111111)があり、そのままだとフラグ(01111110)と区別できない
    • 0を入れた後は、どこにも1が6つ続かない
    • 受信側は、「11111」の次の0を取り除いて、元の「0111111011」に戻す

伝送制御:相手の様子を見ながら送る

  • 伝送制御:
    • データを送るときに、伝送する相手の状態を確かめながら行うこと
    • 代表的な方式にHDLCがある

① HDLC

  • HDLC(High-level Data Link Control):
    • 高い効率と信頼性を追求した、フラグ同期方式を採用した伝送制御手順
  • HDLCのメリット:
    • 任意のビットパターンを伝送できる
    • データを連続して転送できる
  • 任意のビットパターンを送れる理由:
    • HDLCでは、伝送するデータがキャラクタ(文字)にしばられないので、任意のビット列を送れる
  • 連続して転送できる理由:
    • HDLCでは、データをフレーム単位で送るが、受信確認を待たずにフレームを送れる
    • だから、伝送能力が大幅に上がる
  • ベーシック手順:
    • 伝送制御手順の1つ
    • データがキャラクタとして伝送されるのが特徴
    • そのため、テキスト以外のデータを大量に送る用途には向かない
    • SYNキャラクタを使って同期をとる
  • HDLCとベーシック手順の例え:
    • ベーシック手順は、1通送るたびに「届いた?」と確認してから次を送る。しかも文字しか送れない
    • HDLCは、確認を待たずにどんどん送り、何でも(画像でも)送れる

HDLCフレーム構成(★)

記号 名前 中身
F フラグシーケンス(01111110) フレームの開始と終了の区切りの記号(前後に付く)
A アドレス部 送信または受信先のアドレス
C 制御部 コマンドまたはレスポンスの種類
DATA 情報部 転送するデータ
FCS フレームチェックシーケンス 誤り検出用のCRC符号
  • 並び順:
    • F → A → C → DATA → FCS → F
  • FCSの検査対象の範囲:
    • A(アドレス部)、C(制御部)、DATA(情報部)
    • フラグ(F)は対象外
  • ゼロインサーションとHDLC:
    • 情報部(DATA)などに、フラグシーケンス「01111110」と同じビット列が出たときは、ゼロインサーションを行う

② フレームチェックシーケンス(FCS)

  • FCSの作り方:
    • アドレス部(A)、制御部(C)、情報部(DATA)に対して、CRC方式で誤りチェック情報を計算し、FCSとしてフレームに付ける
  • 計算の例:
    • ビット列が「1001010」なら、これを多項式「X⁶+X³+X¹」と見なす
    • あらかじめ決めた生成多項式(X¹⁶+X¹²+X⁵+1)で割り算し、その余りをFCSに入れる
  • ビット列を多項式にする読み方:
    • 右端を X⁰ として、左へ X¹、X²…と番号を付け、「1」が立っている位置だけを足す
    • 「1001010」は、右から X⁰(0)、X¹(1)、X²(0)、X³(1)、X⁴(0)、X⁵(0)、X⁶(1)なので、X⁶+X³+X¹
  • CRCの強さ:
    • CRCは強力な誤り検出方式で、パリティチェックではできない複数ビットの誤りを見つけられる
    • 生成多項式がn次なら、長さn以下のバースト誤りをすべて検出できる
    • だから、HDLC手順の信頼性はとても高い

混同しやすいペア

  • 誤り検出 / 誤り訂正
    • 誤り検出は、誤りを見つけて再送してもらう(パリティチェック、CRC)
    • 誤り訂正は、その場で自分で直す(ハミング符号、水平垂直パリティチェック)
  • 偶数パリティ / 奇数パリティ
    • 偶数パリティは、全体の「1」の数を偶数にする
    • 奇数パリティは、全体の「1」の数を奇数にする
  • パリティチェック / CRC
    • パリティチェックは、シンプルでオーバヘッドが少ないが、1ビットの誤りしか見つけられない
    • CRCは、生成多項式で割り算をし、バースト誤りも見つけられる(HDLCが採用)
  • ハミング符号 / 水平垂直パリティチェック
    • ハミング符号は、検査式(排他的論理和)で、2ビットまで検出し、1ビットを訂正する
    • 水平垂直パリティチェックは、縦と横のパリティで、1ビットの誤りを訂正する
  • 情報ビット / 検査ビット(冗長ビット)
    • 情報ビットは、本来送りたいデータ
    • 検査ビットは、誤りを見つけたり直したりするために付け足すビット
  • バースト誤り / 1ビットの誤り
    • バースト誤りは、データが連続して誤ること(CRCで検出できる)
    • 1ビットの誤りは、1か所だけの誤り(パリティで検出、ハミング符号で訂正できる)
  • キャラクタ同期方式 / フラグ同期方式
    • キャラクタ同期方式は、SYNコードを2個以上送る。8ビットのデータしか送れない
    • フラグ同期方式は、データの前後にフラグ(01111110)を入れる。何ビット単位でもよい(HDLC)
  • フラグ同期方式 / 調歩同期方式
    • フラグ同期方式は、データのかたまりの前後をフラグで挟む
    • 調歩同期方式は、1文字(7か8ビット)ごとにスタートビット0とストップビット1を付ける(非同期方式)
  • スタートビット / ストップビット
    • スタートビットは、「0」。データの始まり
    • ストップビットは、「1」。データの終わり。送るものがないときも送り続ける
  • ゼロインサーション(送信側) / ゼロの除去(受信側)
    • 送信側は、1が5つ続いたら0を入れる
    • 受信側は、1が5つ続いたら、次の0を取り除く
  • SYNコード(同期) / SYNパケット(TCP)
    • 同期のSYNコードは、キャラクタ同期で、タイミングを合わせるための特別なコード
    • TCPのSYNは、3ウェイハンドシェイクのコネクション確立要求
  • HDLC / ベーシック手順
    • HDLCは、フラグ同期。任意のビットパターンを、受信確認を待たずに連続して送れる
    • ベーシック手順は、キャラクタ単位でSYNキャラクタを使う。テキスト以外の大量データには向かない
  • アドレス部 / 制御部
    • アドレス部は、送信または受信先のアドレス
    • 制御部は、コマンドまたはレスポンスの種類
  • FCS / フラグシーケンス
    • FCSは、誤り検出用のCRC符号(A、C、DATAが対象)
    • フラグシーケンスは、フレームの開始と終了の区切り(01111110)

← 07 ネットワークの目次に戻る

タイトルとURLをコピーしました