2.2 符号化
ノードとリンクをネットワークの有用な構成要素にするための最初のステップは、ノード同士を接続してリンクを通じたビット転送を可能にする方法を理解することである。前節でも触れたように、信号は物理媒体を伝播する。そのため行うべきタスクは、送信側のノードが送信したバイナリデータをリンクが伝達できる信号に符号化し、受信側のノードでその信号を元のバイナリデータに復号する処理である。変調の詳細は無視することにして、「high」と「low」の二つの信号がリンクで利用できると仮定する。実際には、これら二つの信号は銅線ベースの回線における二つの異なる電圧、光ファイバー回線における二つの異なるパワーレベル、あるいは無線伝送における二つの異なる振幅などに対応する。
本章で議論する処理の多くはネットワークアダプター (network adaptor) で行われる。ネットワークアダプターはノードとリンクを接続するハードウェアであり、ノードから渡されたビットを信号に符号化して送信し、受信した信号をビットに復号してノードに渡す実際の処理を行う。つまり図 23 に示すように、二つの信号発生装置をつなぐリンクで信号が伝達され、それによってネットワークアダプター間でビットがやり取りされる。
ビットを信号に符号化する問題に戻ろう。まず明らかな解決策として、値 1 を high 信号に、値 0 を low 信号に対応付ける方法が考えられる。この符号化方式には NRZ (non-return to zero, 非ゼロ復帰) という奇妙な名前が付いている。図 24 には、上部に示されたビット列を NRZ で符号化した結果が下部に示されている。
NRZ には、1 が連続するとリンクを流れる信号がしばらくの間 high になり続ける問題がある。同様に 0 が連続するとリンクに low 信号だけが流れ続ける。連続する 1 または 0 が起こす重大な問題が二つある。第一に、基線動揺 (baseline wander) と呼ばれる現象が発生する。受信側は low 信号と high 信号の区別に今まで受け取った信号の平均値を利用し、その平均値より有意に低い信号は 0、有意に高い信号は 1 と判断する。問題は、分かるとは思うが、1 または 0 があまりにも長く連続すると信号の平均値が変化し、信号の有意な変化を検出するのが難しくなってしまう点にある。
第二に、クロック復元 (clock recovery) のために high 信号から low 信号への遷移 (あるいはその逆の遷移) が必要になる。簡単に説明すると、クロック復元問題は符号化と復号が同じクロックに従って進む必要がある事実から生じる ── クロックごとに送信側は一つのビットを送り、受信側は一つのビットを復元する。送信側のクロックと受信側のクロックが正確に同期していないと、送られた通りのビット列を復元できない。受信側のクロックが送信側のクロックより少しでも早かったり遅かったりすれば、信号の正しい復号は不可能になる。別のリンクを通してクロックを送ればいいと考えるかもしれないが、この方法はケーブルのコストが二倍になるので避けられる。そこで、受信側が受け取った信号からクロックを導出する方法が代わりに取られる ── この処理がクロック復元と呼ばれる。信号が変化するとき、つまりデータが 1 から 0 もしくは 0 から 1 に変わるとき、受信側はクロック周期の境界がそこだと認識してクロックを修正できる。しかし、そういった遷移が無い時間が長く続くと、少しずつクロックがずれていってしまう。つまり、クロック復元は送られるデータがどんなものであれ遷移を多く含むことを必要とする。
この問題を解決するアプローチの一つとして NRZI (non-return to zero inverted, 非ゼロ復帰反転) がある。NRZI は現在の信号からの遷移で 1 を表し、現在と同じ信号で 0 を表す。NRZI によって連続する 1 の問題は解決されるものの、連続する 0 の問題は明らかに解決されない。図 25 の下部に NRZI の例を示す。
もう一つのアプローチとしてマンチェスター符号 (Manchester encoding) がある。マンチェスター符号はこれまでのアプローチより明示的であり、NRZ で符号化したデータとクロックの排他的論理和 (XOR) を取ることでクロックと信号を混合する (ローカルなクロックは low と high を反転させる内部信号だと考えると理解しやすい。low と high の組が一つのクロック周期となる)。図 25 にマンチェスター符号を示す。マンチェスター符号では 1 が low から high への遷移として符号化され、0 が high から low への遷移として符号化されていることを確認してほしい。0 と 1 が両方とも信号の遷移に符号化されるので、受信側はクロックを正しく復元できる。なお、差分マンチェスター符号 (Differential Manchester encoding) と呼ばれる変種も存在する。差分マンチェスター符号では 1 は「前半は最後の信号の後半と同じ、後半は前半の逆」という信号に符号化され、0 は「前半は最後の信号の後半の逆、後半は前半の逆」という信号に符号化される。
マンチェスター符号の問題は、リンク上で起こる信号の遷移の頻度が二倍になることである。これは受信側で信号のパルスを検出する時間が通常の半分しか取れないことを意味する。リンク上で信号が変化する頻度をリンクのボーレート (baud rate) と呼ぶ。マンチェスター符号を使うときビットレートはボーレートの半分になるので、その効率はわずか 50% でしかない。図 25 において、もしマンチェスター符号で必要となる速いボーレートに受信側が対応できるなら、NRZ または NRZI を使えば同じ時間で二倍のビットを送信できることに注目してほしい。
なお、NRZ や NRZI ではビットレートがボーレートと等しく、マンチェスター符号ではビットレートがボーレートより小さかったものの、常にこの二つのいずれかだとは限らない。もし変調方式が二つ (high と low) ではなく四つの異なる信号を利用できるなら、クロック一周期分の信号に二つのビットを符号化できるので、ビットレートはボーレートの二倍になる。同様に、八つの信号の間で変調が行えるなら、クロック周期ごとに三つのビットを転送できる。つまり、ここまでの議論では変調が大幅に単純化されている事実を頭に入れておくことが重要である。変調は「high」信号と「low」信号のどちらかを送って終わりではない。信号の位相と振幅の組み合わせを変化させ、16 個あるいは 64 個もの異なるパターン (シンボルと呼ばれる) をクロック一周期分の信号に符号化することは珍しくない。そういった変調方式の広く使われる例として QAM (Quadrature Amplitude Modulation, 直角位相振幅変調) がある。
最後に考える 4B5B 符号 (4B5B encoding) は high 信号または low 信号が長い間続いてしまう問題を避けつつもマンチェスター符号の欠点を克服するように設計されている。4B5B 符号のアイデアは、ビット列に余分なビットを追加することで 0 または 1 が長く連続するのを避けるというものである。具体的に言うと、実際のデータが 4 ビットごとに 5 ビットのコードに符号化され、その 5 ビットが受信側に送られる。4B5B という名前もここから来ている。符号化に使われる 5 ビットは 0 が先頭に最大一つ、末尾に最大二つしか続かないように選ばれるので、どんなデータを送ったとしても 0 が 3 つ以上連続しないことが保証される。符号化結果の 5 ビットは NRZI 符号で転送される。4B5B 符号が連続する 0 しか気にしていない理由はここにある ── NRZI では連続する 1 の問題が発生しない。なお、4B5B 符号の効率は 80% である。
4 ビットの データシンボル |
5 ビットの符号 |
---|---|
0000 |
11110 |
0001 |
01001 |
0010 |
10100 |
0011 |
10101 |
0100 |
01010 |
0101 |
01011 |
0110 |
01110 |
0111 |
01111 |
1000 |
10010 |
1001 |
10011 |
1010 |
10110 |
1011 |
10111 |
1100 |
11010 |
1101 |
11011 |
1110 |
11100 |
1111 |
11101 |
表 3 に 16 個ある 4 ビットのデータシンボルのそれぞれに対応する 5 ビットの符号を示す。5 ビットあれば 32 個の異なる符号を表せるにもかかわらず、その中の 16 個だけがデータの符号化に利用される点に注意してほしい。残りの 16 個はデータの符号化には利用されないものの、11111
はリンクの待機状態、00000
は反応しないリンク、00100
はリンクの停止状態を表すのにそれぞれ用いられる。残りの符号 13 個のうち 7 個は「先頭に 0 は最大一つ、末尾に 0 は最大二つ」の規則を破るので利用されない。残りの 6 個は様々な制御用シンボルとして用いられ、次節で説明するフレーム化プロトコルの一部で利用される。