関連記事が何個になるか分からないので、とりあえずこの記事を(1)としてシリーズ物にしちゃう。笑
D-STAR P2Pネットを思いつき、マイルストーンをとりあえず設定したので、今日から具体的にプロトコルを考えていきます。
P2Pについて先日ざっと調べてみたところ、P2Pノードには①参加処理、②脱退処理、③冗長化、④データ転送の機能を最低限実装する必要があるみたいです。(wikipedia、当社調べ)
やはりこういう勉強は本でしょ、ということで調べたらいいのがあります。
もちろんポチりましたが、なんとコロナの影響で配送まで最低10日かかるとおっしゃいます。勘弁してよ。本が届くまで、ネットで頑張って勉強します。
①参加処理
P2Pネットワークに接続するための通信方法を決めないといけません。この段階のプロトコルを理解するために、IPにおけるP2Pを理解したいと思います。長くなりそうなので適当に読み飛ばしてくださいね笑
IPにおけるP2Pネットワークでは、そのネットワークに接続するとき、既にP2Pに参加している誰かに接続しないといけません。そのためには、そのノードのIPアドレスを知っている必要があります。
コンタクトノードに問い合わせてIPアドレスを知る(ピュアP2P)
コンタクトノードとは、いつも電源が入っているノードのことだそうです。コンタクトノードはいつもP2Pに参加していることがわかってるので、接続者はまずコンタクトノードにアクセスしてネットワークに参加します。
D-STARはVHF帯を使っているので、見通し距離が通信距離の限界です。この方式を採用するとコンタクトノードを全国に無数に配置しなくちゃいけないのでナンセンスです。
手当たり次第に聞く(IPでは実現できないが無線ならできる!)
IPはパケットの送信先を厳密に指定する必要があります。だから、IPにおけるP2P通信は、ネットワークに参加するために、既に参加しているノードのIPを知るための方法が複数編み出されています。(上述のコンタクトノードや、スーパーノード、インデックスサーバーなど)
そこでふと思ったのですが、無線って相手が決まっていなくても送信できますよね。CQです。つまり、D-STAR P2Pネットワークに参加したいノードは、まさにCQを出す要領で近くの通信できそうなノードを呼びかけ、それを聞いた近くのノードは自動で応答できるような仕組みを作れば、コンタクトノードやインデックスサーバーの代わりとなる物を作らなくても容易にP2Pネットワークに参加することができそうです。意外と相性がいいのかも。
②脱退処理
P2Pネットワークに参加しているノードは、今ネットワークに参加しているノードすべてが、どのような形でお互いにつながっているのかを知っている必要があります。これを把握していないと、データの伝送経路を決定することができないからです。
適当な名前がないので、マップと勝手に呼ぶことにします。網目のようにつながったP2Pネットワークの中で、特定の相手にメッセージを送るとき、このマップを見ながらどの経路で伝送しようか考えないといけません。そして、このマップは常に変化し続けます。参加者は増えたり減ったりするからです。
参加者がネットワークから脱退(=切断)するとき、もういなくなるよといってから脱退すれば、残っている参加者は彼がいなくなった後のマップを作り直すことができます。どうやって脱退の情報を伝達するのかというプロトコルも考えないといけません。
③冗長化
そうは言っても、アプリの不具合や無線機の電池切れなど、予期せぬ脱退は起こりえます。脱退宣言なしにある参加者が急に脱退したとしても、それをカバーできるようなシステムを作り上げる必要があります。
常に、「もしこの伝送経路が使えなくなっても、代わりにこの経路を使おう」と備えておけば、突然特定のノードが脱退しても通信を継続でき、ネットワークの安定性が向上します。
そのメソッドの一つに、フラッディング方式と呼ばれる方法があり、これは自分の知っているノード全てにメッセージを送り、どこかで通信エラーが起きても他の経路でカバーできるようにした仕組みのことです。
このフラッディング方式は一見良さそうですが、D-STAR P2Pに採用するのは微妙です。一度に複数のノードに送信できるのが無線のいいところですが、2つのノードから同時に受信はできないからです。このあたりのプロトコルは、頭を使わないといけないかも。
④データ転送
上記の冗長化にも通じる話ですが、無線の欠点は同時に1つのノードしか送信できないことです。1つから複数はOKなのですが、D-STARはGMSK変調であり、GMSKはFSKの一種なので、複数の同時送信は混信してどちらのデータも使えなくなります。ネットワーク参加者が多くなると、ここの問題が顕著に出てきそうです。
今日はこれくらいにしておきます。。