ネゴサーバの連携
さて、ネゴサーバの連携だがいかがしたものか。
例えば各領地に電話ネゴシエーションサーバを設置する。
各サーバは自分が管理すべきユーザーとそれに紐づくパスワードを管理。
スマホから接続要求が来たら、まず自サーバのユーザーか確認して、自サーバでなければサーバチャンネルでそのユーザーの管理サーバを問い合わせする。
「この問い合わせはブロードキャストでいいか」
一台一台問い合わせると五〇サーバあれば五〇回のリクエストが発生する。
ブロードキャストなら一回で済む。
その代わり、受信されたかどうかの確認はできないけど。
この辺は、ユーザー情報が返ってこなかったら再問い合わせすればいいだろう。
何回かリトライして駄目ならつながらなかったを返せばいい。
で、自分のところのユーザーならそのユーザーに接続要求パケットを送る。
接続要求が通ると、指定のチャンネルに移って会話を始める。
「基本はこんなもんか」
ん?
これって管理サーバが携帯の基地局みたいになってないか?
携帯は近くの基地局を見つけたらそこと通信し始める。
その情報は中央サーバに送られ、電話の要求があったら、その基地局に向けて発信する。
「電話サーバは基本的に近距離通信を行い、サーバ間は長距離通信でユーザー情報をやり取りする。こうすれば、向こうの携帯と同じようなことができるんじゃね?」
ちょっと考えてみよう。
各サーバは近距離用チャンネルでSSIDを発信。
スマホはこれを確認し、一番状態のいいサーバの近距離チャンネルに移行しサーバへ接続要求を出す。
接続されたら一秒に一回とか定期的につないでるよ信号を送る。
スマホから電話を掛けると、このつないでるサーバに相手先への接続要求パケットが飛び、相手が自サーバに接続されていたら、そのままつなぐ。
この場合は近距離用の通信チャンネルに移行してつないでもいいだろう。
自サーバにつながっていなかったら、他のサーバに長距離用チャンネルで問い合わせを行う。
つながったら長距離用チャンネルでつないで会話する。
「うん、行けそうな気がする」
念の為もう少し推考するか。
例えば領内に複数の電話サーバを設置したとしたらどうなるだろうか?
各サーバはSSIDを近距離用SSIDチャンネルで発信している。
各スマホはこのSSIDを見て入力レベルが高くエラー無しで送られてくるところのサーバチャンネルに移動し接続。
電話サーバはユーザーIDとパスワードを知らないと接続できないから、複数電話サーバがある場合、どこかでデータを共有する必要が出てくる。
メールサーバのユーザー名とパスワードを流用するわけだけど、パスワードはユーザーが修正できるから、今つなげようとしているサーバにその情報がなければいけない。
とはいえ全部のサーバにユーザーとパスワードを入れておくのはイケていない。
全部を僕が管理するのはナンセンスだ。
ユーザー管理とかできればその領地に管理者を置いてその人にやってもらいたい。
ゆくゆくは現地生産とかも考えたいし。
そうすると管理サーバにはそれぞれが管理するユーザーとパスワードを保存。
必要に応じて問い合わせてユーザーとパスワードを入手するか?
いやいや、簡単にパスワードを入手できちゃ駄目でしょ。
ならどうするかといえば、最初に管理サーバにユーザー名パスワードを登録してこれを元に暗号キー作成し保存。
スマホでも同様の処理をして暗号キーを保存しておく。
双方に暗号キーがあるのでユーザー名がわかれば、保存してある暗号キーを送受信しないでやり取りできるはずだ。
暗号キーからパスワードを可逆変換できないようにしておけば、パスワードを入手することは理論上不可能になる。
もちろん暗号キーを入手し直接暗号キーで認証するようなアプリを作れば、クラッキング可能であるが、ここまでは暗号キーのやり取りはないので、それも難しいだろう。
流れを整理しよう。
まずSSIDを確認しスマホから接続要求を出す。
この接続要求パケットは平文でユーザーIDなどを電話サーバに送る。
電話サーバはユーザー認証サーバに問い合わせて、そのユーザーの暗号キーを入手する。
電話サーバとユーザー認証サーバ間はあらかじめ暗号化通信するように設定しておけば、ユーザーの暗号キーが漏れる心配は少ない。
暗号キーを入手できれば後はそのスマホとは暗号通信が行えるようになり、これで電話をかけたり受けたりできるようになる。
スマホから電話を掛ける場合、通話要求パケットを送る。
この通話要求パケットは暗号化され、相手先のユーザー名や接続チャンネルなどを送る。
この時複数相手ならスマホ側に複数ユーザー分のパケットを送るのがいいだろう。
どうせ切れちゃったり、つながらないユーザーがいたりすると再接続要求が飛ぶのだ。
必要分だけ通話要求パケットを飛ばしてもらおう。
次に電話サーバが通話要求をもらったら、相手が自サーバ内にユーザーが居る場合は暗号キーを入手済みなので、通話要求パケットを暗号化して送る。
いなかった場合は全電話サーバーに宛先のユーザーが接続しているかを問い合わせ、いるよと答えたサーバへ接続要求パケットに転送されたよデータをくっつけてサーバ間の暗号キーで暗号して送る。
パケットを受け取ったサーバは接続している宛先ユーザーにそれを転送。
受信側のスマホは着信or拒否パケットを送る。
発信側と同じ手順でこのパケットを転送し、発信側のスマホがこれを受けると接続チャンネルに移動して通話を開始する。
この時問題になるのは複数ユーザーの接続だ。
複数ユーザーのうち応答しないやつが出てくると面倒なことになる。
呼び出し続けるには電話サーバに接続し続けなければならない。
通話要求はスマホ側の責任だからね。
かといってサーバ側の責任にするとサーバの負担が大きいし。
いっそのこと二チャンネル同時にチェックするか?
電話だけなら二チャンネル同時ウォッチでも処理能力的には問題ないだろう。
その方がユーザー追加とかも簡単にできるし。
うん、何とかなりそうだ。
「そうなるとメールサーバも同じようにしないとまずいよね」
メールはローカル。電話はグローバルじゃそのうち電話でメールを送るってことになりかねない。
FAXかよ。
「さて、仕組みは電話とたいして変わらない」
認証サーバに問い合わせ、暗号キーをもらったら次はユーザーが登録されているメールサーバへデータを送るだけだ。
認証サーバへの問い合わせは電話サーバと共通でいいか。
電話サーバと言うと語弊があるから、基地局としておくか。
まずは基地局とつないで、そこから認証サーバに問い合わせて暗号キーを入手する。
メール送信の場合、メールサーバへの接続要求を基地局に送り、各基地局へ宛先サーバが接続されているか問い合わせる。
返答があった基地局へ接続要求を送りそこからさらにメールサーバへ要求を転送する。
後は電話と同じように着信or拒否信号返して、指定のチャンネルに移動し、通信を開始。
必要なドメイン分それを繰り返す。
本来なら自分のメールサーバに送信してそこから配布するのが筋だろうが、そうするにはサーバの能力が足りない気がする。
「いやまてよ。メールサーバがチャンネル移動してデータ送受信するのはまずい気がする」
よく考えてみよう。
メールは受信するだけじゃなく送信もするのだから、適当なチャンネルに移動するのはまずいよね。
固定チャンネルにするか?
すると基地局との接続と二チャンネル必要?
「サーバグループが増えれば増えるほど送受信に掛かる負荷が増えるのは何とかならんかなぁ」
起動キーを設定している為、パケットが飛んでくる限り自分への通信でなくとも反応してしまう。
これを回避するとすれば、もう一つ魔石を使って送受信専用インターフェイスを作るのが一番簡単な回避方法かな。
「しかしなぁ。魔石は下級でも結構高い。騎士が狩ってくるものしか手に入らないし、かといって養殖するわけにはいかないから大量生産には向かない」
できればこれは最後の手段にしたい。
今必要なサーバ群はまず基地局サーバ。
これは近距離チャンネルで各スマホとつなぎ、長距離チャンネルで認証サーバや他の基地局サーバと繋ぐ必要がある。
「まてよ。基地局サーバにメールサーバや認証サーバをつないだらどうだろうか?」
基地局サーバの下に近距離チャンネルでスマホと認証サーバ、メールサーバをつなぐ感じにする。
長距離は基地局サーバ同士をつなぐ。
メールサーバからのデータは基地局サーバが転送するしか無いが、能力的に足りるだろうか。
問題は自分の宛でないパケットに反応することで、自分宛てのパケットだけを受信できれば処理能力的に問題ないはずだ。
「そんな事ができるか?」
送信側はどんな周波数でも送信が可能だ。
ならば端末ごとに固有のチャンネルを割り当てたらどうだろうか?
スマホはネゴった後は適当なチャンネルに移動するから基地局サーバに負担をかけない。
基本的に電話しているときは他の機能は停止してもいいからだ。
だが、メールサーバは多数の端末と並行して送受信を行う必要がある。
ダイナミックには変えられない。
基地局サーバとスマホの両方とのチャンネル接続が必要だ。
「ネゴだけ基地局サーバと行って、その後はメールサーバのチャンネルに移行すれば、そのチャンネルに流れるデータは、メールデータだけになる。この程度なら四倍早いサーバなら行けるか?」
どうせ処理がパンクしたら送信停止命令出せばいいわけだし。
「うん、なんか行けそうな気がしてきた」
メールサーバは基地局とつなぐ近距離チャンネルとスマホをつなぐ長距離チャンネルをサポート。
「あれ、電話なら同じ基地局に宛先がある場合近距離チャンネルでつなぐわけだけど、それはこの場合使えないよね」
基地局一つにメールサーバ一つをぶら下げている場合、自分のメールボックスがあるメールサーバにアクセスする必要がある。
スマホとメールサーバをつなぐとき常に長距離チャンネルを使用するとなると、チャンネルが枯渇しないであろうか?
まあ、長距離チャンネルに空きはあるから当分はこれでいいか。
有線だと問題にならないことが無線だと結構問題になります。
青歯とかWi-Fiとかと家電が干渉したり、障害物のせいでうまくつながらなかったりなどなど。
ゲームなんかもFPSとかやってるとWi-Fiの遅延が致命的になったり、音ゲーで青歯のイヤフォンとか使ってると音ずれしたり等、線がない分取り回しとか便利なんですが。
うちではキーボードもマウスも未だに有線。
無線のを何回か使ったことありますがなんか接続が不安定で、突然反応がなくなったりするので、結局使わなくなりました。
電池節約のためにスリープモードに入るのはいいのですが、復帰するのにワンクリック必要だったり微妙に復帰が遅かったりと、これが意外にストレスに。
仕組み上仕方がないかもしれませんが、ガッツリ使っているときって0.1秒でも反応遅れるとイラっとするので、今後も無線マウスとかは使わない気がします。