先日注文した「P2Pがわかる本」、本日到着しました!P2Pの基礎知識がどっさり載っています。まさにこのような本と出会いたかったの!(表紙の絵はなんかあれですが。)
参加処理の具体的な通信内容について考えます
前回はP2Pネットワークの参加方法について、概要を考えました。今回は、その具体的な通信方法について検討したいと思います。なお、4800bpsという限られた帯域を真の意味で有効活用するためには、通信内容をbit単位で考えるべきなのでしょうが、アプリ開発のしやすさ、他者が簡単にソースコードに手を加えられるように、キャラクタで通信内容を考えていきます。(このソフトはオープンソースにする予定です)
①ネットワーク参加時の各局に対する問合せ
トランシーバの電源を入れ、ソフトを立ち上げた状態では、まだどの局ともつながっておらず、ネットワークから孤立した状態です。
兎にも角にも、まずは近隣の局とコミュニケーションを取らなければいけません。そこで最初に行うのが問合せ。構文は次のような感じかな。
②「who」に対する各局の応答
(1)具体的な返答内容
ネットワーク参加者の「who」を受信した局は、自局とつながっている局の概要を参加者に向けて返します。例えば、数のようなネットワークを既に持つJA1BBBは、参加者であるJA1AAAに対して、次のように返答します。
「answho_(参加者のコールサイン)_(自局コールサイン)_(ネットワークの規模=つながっている局数)」
JA1BBBはJA1CCC〜JA1HHHまでの6局とつながっているので、以下のような返答になります。
「answho_JA1AAA_JA1BBB_6」
(2)返答にかかる時間
この返答では、22byte = 176bit の通信を必要とします。このデータ以外に、D-STARでデータを送ろうとすると、都度以下のようなヘッダーが準備され毎回送信されるようです。
つまり、176bitのデータを送るのに、939bitかかります。通信速度は4800bpsなので、0.196≒0.2秒かかります。
(3)輻輳を抑えるための乱数
ここで問題になるのは、例えば以下のようなトポロジーを持つネットワークだった場合。
上図の場合、JA1AAAがwhoを送信した直後、JA1BBB、JA1III、JA1JJJによる返答が一斉に行われ、通信が輻輳しデータを正しく受信できなくなります。
そこで、whoを送った後は一定時間待機の時間を設け、この時間の中で任意の時間に各局が返答するスタイルをとることで、輻輳の確立を減らします。
whoに対する返答は1局あたり0.2秒でできますので、2秒待機すれば10スロット返答のための時間を確保できます。図にすると以下のような感じ。
この10のスロットのうちのどれかを使って、whoを受信した各局が返答をするようにします。どのスロットを使うか決めるために乱数を使います。この10スロットが少ないか多いかは、ベータ版リリース後に検討します。(確率論が苦手です)
③取りこぼしの有無を確認するための通信
当然、この仕組みを作っても輻輳がなくなることはないので、2秒の待機後に取りこぼしがないか確認するための信号を参加者が送信し、取りこぼされた局がいれば再度応答し…を繰り返します。
確認は以下のように行います。
「else_(自局コールサイン)_(受信できた局①)_(受信できた局②)…」
「else_JA1AAA_JA1BBB_JA1III_JA1JJJ」
④ネットワーク詳細情報の送信要求
受信取りこぼしの局がいなくなったら、各局にネットワーク情報の詳細を送ってもらいます。
要求方法は次のように行います。
「detail_(要求する相手先コールサイン)_(自局コールサイン)」
「detail_JA1BBB_JA1AAA」
⑤ネットワーク詳細情報の送信
detailを受けた局は、自局の持つネットワーク情報の詳細を参加局に送信します。
送信方法は次のように行います。
「ansdetail_(送信先コールサイン)_(自局コールサイン)_(接続済コールサイン①)=(距離)_…」
距離とは、何局の中継局を経由しているかを示す数字です。直接波でつながっていれば1とします。また、複数の経路を持つ場合は、数字の少ない方を採用するようにします。
下図のようなトポロジにおいて、JA1BBBがJA1AAAに返す送信内容は、以下のようになります。
「ansdetail_JA1AAA_JA1BBB_JA1CCC=1_JA1DDD=1_JA1EEE=2_JA1FFF=2_JA1GGG=2_JA1HHH=3」
⑥ネットワーク詳細情報の復唱
ネットワークの詳細情報を受信した参加者は、受信した情報をそのまま復唱します。これは、情報の正確性を高めるための手続きの他に、参加局を通して初めて繋がりうる他局に対する配慮でもあります。例えば下図のような場合。
上図の場合、A局が参加処理を進める過程で、例えばB局のネットワークの詳細情報を復唱すると、C局やD局は初めてB局とその下位に存在するネットワークを認知し、同時に自身の持つネットワーク情報を更新できます。