先日Hontoで注文したP2Pの本について、なんと昨日「在庫がありませんのでキャンセルさせていただきました」というメールがありました。
在庫僅少って書いてあったじゃん!ないのならないって書いてよ〜〜
Amazonに同じのが中古で出てたので注文しました。
今日は参加処理について考えます
前回は、通信プロトコルの全体像について考えたので、今日はその第1段階であるP2Pネットワークへの参加処理について考えたいと思います。
今回実現しようとしているD-STAR P2Pネットワークは、通信にD-STARを用いるネットワークで、D-STARは受信と送信が同時にできない半二重通信です。しかも厄介なのは、送信と受信が同時にできないだけでなく、同時に1局しか送信できません。このため、いかに各局がタイミングをずらしつつ、最短の時間で求める情報を共有できるかが最大のポイントになりそうです。
送信のタイミングをずらすために乱数を使う
P2Pネットワークに参加する局(新規参加局)は、はじめに近隣の電波が届く範囲にいるすべての局に向けて、ネットワークに参加したいので各局のネットワーク状況を教えてくれという趣旨の要求をします。
これを受けた近隣各局は、自局とつながっているネットワークの情報を通報しますが、一気に返すと混信して通報ができなくなります。そこで、要求を受信した局は、乱数に基づく任意のタイミングで通知させるようにします。これにより混信する確率が下がります。
とは言っても、混信する可能性がゼロになったわけではありません。そこで、通知を受けたネットワーク参加者は、通知を受けることができた局のコールサインを各局宛に送信し、その一覧に自局が含まれていない近隣局がいた場合、改めて通知を行うようにします。この作業を、近隣局の取りこぼしがなくなるまで繰り返します。
また、この最初のステップでは、各局が返す通報に、各局が持つネットワーク情報をすべて(つながっている他局コールサインをすべて)通知するのではなく、何局と繋がっているのかだけを返答させるようにします。こうすることで、最初の通報にかかる時間を節約できます。
詳細のネットワーク情報の通知
近隣局をすべて把握した新規参加者は、近隣局がどの規模のネットワークを持っているのか既に把握できているので、その情報を通知するのにかかる時間も正確に把握できます。混信を防ぐために、近隣各局に対し、どのタイミングで近隣各局のネットワーク情報を通報するのかを指定した上で、近隣各局の詳細なネットワーク情報を通報するように要求します。
要求を受けた近隣各局は、指定されたタイミングで、自局のネットワークに関する詳細を新規参加者に向けて通報します。通報する内容は、自局のネットワークに既に参加している局のコールサインと、その距離です。
距離というのは、物理的な距離ではなく、何局の中継局を介してつながっているかという値のことで、将来ダイレクトにメッセージを送る際、経路を決定する上で重要な値です。
以上をフローにまとめると、以下のような感じになります。
新規参加局に対する応答フローは、以下のようになります。