No282 データを正しく伝える技術
これを書いている2022年現在、ネットワークの回線速度は4G(4th Generation)のスマホで数百Mbps(1秒で数百メガビット)、5Gなら数Gbpsです。
家庭や事務所で使うような固定回線であれば、1Gbps~10Gbpsくらいでしょうか。
このメルマガがだいたい6KBから10KB程度ですから、今までのバックナンバー(281本)を全て送信しても1秒もかからない計算です。
このようにとてつもない速度のネットワーク回線ですが、裏側では様々な工夫をこらしてこの速度を実現しています。
今回は、ネットワークでのデータ送付のエラーを回避する仕組みについて解説します。
ネットワークのエラーにはいろいろある
エラーといってもいろいろあります。
例えば、インターネット上のサイトにアクセスした時に404エラー(ページが見つかりません)や500エラー(内部エラーが発生しました)というのを見たことがある方は多いと思います。
また、モバイル回線にパソコンをつなごうとしてもインターネット通信がうまくいかないといったパターンも経験した方は多いでしょう。
今回、説明しようとしているのは、そういったサービス利用時に出食わすようなエラーではありません。
皆さんが「できてあたり前」と思っていることが、ちっともあたり前でないことを解説したいと思います。
電気や電波は外界の影響を受ける
コンピュータネットワークでは通常は以下のいずれかを使って送信を行います。
1)光
2)電気
3)電波
このうち、光はその構造上で非常にエラーが起きにくい回線です。
ですので、長距離のデータ送信はほぼ光回線に集約されています。
一方で、電気や電波は外部の影響を受けやすい通信手段です。
特に電波はめちゃくちゃ外部の影響を受けやすく、通信エラーはしょっ中起きています。
例えば、宅内の無線LANを使っている時に、電子レンジを使うといきなり回線が切れたり極端に遅くなるといったトラブルを経験した方は多いと思います。
電気にしても電波にしても(実は光でも)こういった外界の影響を受けにくくするために様々な工夫をして、データを送信しているのです。
エラーが起きたことはどうすればわかるのか?
さて、ここでやっかいな問題があります。
「エラー」ってどうやってわかるんでしょう?
例えば、次のような5つのデータを送信したいとします。
1 2 3 4 5
当然ながら、受信側は何が来るのかは知りません。
仮に受信したデータが次のようになっていたとします。
1 2 5 4 5
もちろん、読者の皆さんは送信したデータと受信したデータの両方を見ていますから、違っていることは明らかですが、受信したデータだけから、エラーを検出することは可能でしょうか?
シンプルな方式としてチェックデジット方式というものがあります。
これは少ないデータ数の誤り検出にはよく使われている方法で、バーコード(JANコード)やクレジットカード番号などがチェックデジット方式としています。
チェックデジット方式では、送信したいデータの他に6ケタ目としてチェック用の値をデータに付加して送付します。
チェックデジットの計算方法はいろいろあるのですが、ここでは送りたいデータの合計値を10で割ったあまりとします。(実際のチェックデジットではもう少し複雑な計算が行われます)
この場合なら、1+2+3+4+5=15、15÷10=1...5 なのでチェックデジットは5とするわけです。
ですので、送信側が送るデータは次の6つとなります。
1 2 3 4 5 6
一方で受け取る側は次の6つのデータを受け取り、検算をします。
1 2 5 4 5 6
チェックデジットは1+2+5+4+5=17、15÷10=1...7。あれれ?チェックデジットが正しくないぞ、となります。
エラーが起きたらどうするの?
上記の手順でエラーがない場合は、受信側が「OK、じゃ次のデータを送って」と依頼をして次のデータ送信を待ちます。
一方、エラー発生が検出されると「ダメ。データおかしいから再送して」と依頼をします。
この場合は、送信側は同じ5つのデータとチェックデジットを再送する形を取ります。
なお、このようなエラー検出や再送信の仕組みは通信手順の最下層(物理層などと呼ばれます)に組み込まれています。利用者はもちろんネットワークを利用しているプログラムも知らないうちにリトライ(再試行)が行われる仕組みとなっています。
エラー検出は奥が深い
実際のネットワークでは上記のチェックデジットのようなシンプルな方法ではなく、もっと強いエラー検出方式が使われています。
というのは、チェックデジット方式では次のような問題があるためです。
まず「エラーが起きたことしかわからない」という点です。
どのデータがどう誤っているかわからないため、データ全体を再送せざるを得ません。
また、2つ以上のエラーが起きるとエラー検出をミスる可能性があります。
例えば、次のように3つ目と4つ目にエラーが発生した場合を考えてみます。
1 2 5 2 5
この場合、チェックデジットは1+2+5+2+5=15、15÷10=1...5。
OK。データはあってるよ、となってしまいます。
強いエラー検出方式では、複数のデータ誤りがあった場合も検出できたり、誤っているデータがどれで正しい値が何かまでわかるものがあります。
こういった強いエラー検出方式を使えば、データ再送は誤りが多すぎて修正できない場合だけとなり、通信の遅れが最少化できるのです。
余談
今回紹介したチェックデジット方式はかなり古い方式です。
ですが、少量データのチェックにはお手軽で優れた方式です。
バーコード(13ケタ)やクレジットカード番号(16ケタ)のようにデータ量が少なく、再試行が容易な場合に向いた方式と言えます。
まとめ
インターネットに限らず、ネットワークでは光、電気、電波を使って通信を行います。
特に電気や電波では、外界からの雑音(ノイズ)によってエラーが発生してしまいます。
通常、このようなエラーの検出と対応は物理層などと呼ばれるネットワークの下層で行われますので、利用者はそのようなエラーが発生していることを知ることはありません。
通信エラーの検出のため、本来送りたいデータの他に検証用のデータを付加して送信を行います。今回はチェックデジットというシンプルな方式を使ってその概要を解説しました。
ただ、チェックデジット方式では誤りの有無だけなので再送信が多発する、複数の誤りが発生した場合にエラーを見逃す可能性があるといった問題があります。
そのため、実際のネットワーク通信ではもっと強い方式が用いられます。
こういったエラー訂正方式は1950年代頃に盛んに研究が行われました。
当時はそれだけ通信を行う際のエラー発生率が高く、効率の良いエラー訂正方式が強く求められていたわけです。
では、現在はエラー発生率は低く、こういった技術は使われていないのか?というとそんなことはありません。
現代では、無線LANなどの電波を使った通信が多用されています。
正確なエラー率ではなく非常に感覚的な数字ですが、光回線のエラー率を1とすれば、電気を使った有線LANのエラー率がその100倍、無線LANのエラー率は光の10000倍くらいに感じます。
つまり、現代でもエラー訂正を必要とするシーンは多く、実際に無線LANでは様々なエラー訂正方式が組み込まれているのです。
私たちが「できてあたり前」と思っている通信も多くの先人の努力と汗を基礎としているのですね。
今回はネットワークでのエラー訂正方式について解説をしました。
次回もお楽しみに。
(本稿は 2022年11月に作成しました)