「ふうー。相手方があることは,なかなかうまくいかないわ」
「通信するプログラムは,どちらに問題があるか識別が難しいからね。まあ,シリアルでデータのやり取りができれば,ネットワーク使ったものも同じと言えば,同じだし」
「え?そうなんですか」
「そうだよ。簡単に言ってしまえば,シリアルの代わりにソケットを使うって考えればいいんじゃないかな」
「ソケットって,ポートとかいろいろあるじゃないですか」
「そこまで分かってれば,話は簡単だよ」

 ネットワークを利用するプログラムは,データを送る側とデータを受ける側の両方が同時に協調して通信する。いわば,データのキャッチボールをすることによって,ネットワークのプログラムは成立している(図1[拡大表示])。キャッチボールである以上,相手が捕れる範囲にボールを投げなければ成立しないし,相手がこちらが投げるのを待っている状態でなければ,うまく捕ってもらえない可能性が高い。

図1●通信の基本はキャッチボール
正しく通信するには,キャッチボールのように,データを送る側と受ける側で約束をして,協調して動作しなければならない。相手がよそ見をしているときにボールを投げたり(協調していない),とんでもない方向にボールを投げたり(プロトコル無視)すれば,キャッチボールにならないのと同じである。また,通信は基本的に1対1で成り立っていることもキャッチボールと同じだ。

 もう一つ,キャッチボールに似ているのは基本的に1対1で動作することだ注1)。サーバーは複数のクライアントに対してサービスを提供しているので,1対多で動作しているように思われるかもしれない。しかし,「クライアントからのリクエストとそれに対するサーバーからのレスポンス」という場面を切り出してみれば,1対1なのである。サーバーでは,それが役割上重なっているだけなのだ。つまり,1対1の通信が多重化していると考えればよい注2)。だからサーバーの処理は重たくなりがちであり,アクセスが集中するととても忙しくなる。忙しくなりすぎると,DoS(Denial of Services)状態になってしまう。

シリアルポートの通信が基本モデル

 ではまず1対1で通信するプログラムについて考えてみよう。今やイーサネットを標準で備えるパソコンがかなり増えてきたが,それでもまだ一番手軽な通信機構はRS-232Cを使ったシリアル通信だろう。いわゆるシリアルポートを使う。モデムを標準で内蔵していないパソコンだと,パソコン通信やダイアルアップ接続する場合にモデムをシリアルポートにつないでいた。クロスケーブルで2台のパソコンのシリアルポートを接続すれば,すぐにでもデータをやり取りできる注3)

 シリアルポートを通じた通信は,それ自体のレベルにおいては基本的に無手順通信である。無手順と言えば聞こえはいいが,要はデータの垂れ流しである。相手が正しく受け取ったかどうか,気にしない。

 無手順なので,データが入ってきたらシリアルポートからデータを受信するだけである。通信プログラムはキー入力か,シリアルポートからのデータ入力を待ち続ける。キー入力があったらそのデータを相手方に送信するのと,シリアルポートにデータが到着したらそのデータを読み出して表示するという二つの処理を実行するだけである(図2[拡大表示])。だからシリアルポートを使った簡単な通信プログラムは,ほんの十数行で記述できる(リスト1[拡大表示])。例えばBASICでは,シリアルポートからデータを受信したときにソフトウェア割り込みを発生させる。これを利用すれば,プログラム本体はキー入力待ちループにできる。キー入力があったら,相手方に送信する。そして,割り込みが発生したら,データを受信して表示する処理を記述するだけだ。

図2●通信プログラムの基本構造
大きく二つのイベントを待つループがある。キー入力などユーザーの操作に対応するイベントと,データの受信の二つである。受信したデータを単にテキスト画面に表示したり,あるいは一緒に送られてきたレイアウト情報に基づいてグラフィカルに表示したりする。
 
リスト1●BASICで記述した通信プログラム
BASICが備える割り込み機能を利用している。無限ループが事実上の本体である。シリアルポートがデータを受信すると割り込みを発生するので,ここで受信データを取得する。あとはキー入力があったら,相手に送る。

 ただ約束事はある。RS-232Cのレベルで定めているハードウェア制御に関することだ。そうしないと,データを正しくやり取りできない。具体的には転送速度,ビット長,パリティの有無と種類,ストップビットの長さ,である。また無手順とは言いつつRS-232Cのレベルでフロー制御も実施しているので,厳密に言えばまったく無手順ではないのだ。

 ここで出てくる「約束事」が,実はプロトコルである。例えばパソコン通信で画面制御に使われてきた,エスケープ・シーケンスに基づく端末エミュレーションもその一つである注4)。エスケープ・コードとそれに続く文字列によって,カーソル位置や色を指定するという「約束事」だからだ。もちろん,バイナリ転送のための「XMODEM」もプロトコルである。XMODEMは単なるデータの順番だけでなく,タイムアウトなどを加味することによってデータを確実に転送できるようにしたものである。

(北郷 達郎、八木 玲子)