Earthquake Peer-to-peer Sharing Protocol (EPSP) 0.36 プロトコル仕様

目次

基本概要
1.バージョン
2.基本仕様 (Ver0.28,0.35 一部変更)
3.公開鍵暗号への対応
4.「プロトコル時刻」 (Ver0.30r 一部変更)
5.「3桁の数字(コード)」一覧表 (Ver0.24,0.26,0.28,0.29 一部変更、0.30 一部追加・変更・廃止、0.34r2,0.35,0.36 一部変更)
6.「地域コード」 (Ver0.30r,0.34r 変更)
P2Pネットワークへの参加
1.サーバーへの接続 (Ver0.33,0.35 一部変更)
2.プロトコルバージョン等の通知
3.ピアIDの暫定割り当て・ポート開放のチェック
4.ピアデータの取得・ピアとの接続 (Ver0.30 一部追加・変更)
5.ピアIDの本割り当て・鍵の取得 (Ver0.29 一部変更、0.34r2 表記変更)
6.各地域ピア数の取得 (Ver0.21 新規)
7.プロトコル時刻の取得
8.サーバーとの接続終了
サーバーへの定期エコー
1.サーバーへの接続
2.プロトコルバージョン等の通知
3.エコー (Ver0.26 一部変更)
4.鍵の再割り当て要求
5.ピアとの接続数増加 (Ver0.30 変更)
6.プロトコル時刻の再取得 (Ver0.28 新規)
7.サーバーとの接続終了
P2Pネットワークへの参加終了
1.ピアとの接続終了
2.サーバーへの接続
3.プロトコルバージョン等の通知
4.参加終了
5.サーバーとの接続終了
ピアとのシステム通信
1.接続の受け付け
2.接続時の初期通信 (Ver0.30 名称変更、一部追加)
3.ピア同士のエコー
4.ピアネットワークの調査 (Ver0.28 新規、0.34r2 一部変更)
5.予約データの伝達 (Ver0.35 新規)
ピアとのデータ通信
1.重複判定・各ピアへの伝達 (Ver0.35 一部変更)
2.署名 (Ver0.27r 表記変更)
3.地震情報 (Ver0.23,0.25,0.27 一部変更)
4.津波予報 (Ver0.36 一部変更)
5.各地域ピア数/緊急地震速報 配信試験/緊急地震速報(警報) 部分配信 (Ver0.34,0.36 一部変更)
6.ユーザー署名の扱い - 署名 (Ver0.27r,0.30,0.30r2 一部変更)
7.ユーザー署名の扱い - 検証 (Ver0.27r,0.30 一部変更)
8.「多重発信」の識別
9.地震感知情報 (Ver0.30 変更、0.34r2 表記変更)
10.伝言板 (Ver0.30 変更、0.33 廃止)

基本概要

 当プロトコルは、地震情報・津波予報・地震感知情報メッセージの3つを、P2Pネットワークで速やかに伝達・共有することを目的としたものです。Ver0.20より、地震情報の署名・発信元ピアの保証を追加し、安全性が格段に向上しました。

目次へ

1.バージョン

Ver0.36(2022/08/14改定)
・コード561 (各地域ピア数) を拡張し、緊急地震速報(警報)の簡易的な伝達に対応しました。
・地震情報・津波予報の取得方法の変更に伴い、コード552 (津波予報) の取りこぼしの可能性についての記述を削除しました。
Ver0.35(2022/03/03改定)
・「3桁の数字(コード)」一覧表の誤りを修正しました(津波予報(コード552)のデータ「津波予報全文」を削除)。
・予約コードを追加し、その伝達について定義しました。
・サーバーの一覧を更新しました。
・IPv4であることを明記しました。
・通信の経由数の上限を変更しました。
Ver0.34r2(2019/12/31改定)
・3桁の数字(コード)一覧表の誤りを修正しました(232→212)。
・ピアIDの本割り当てと地震感知情報の発信に補足を追記しました。
・調査エコーリプライのデータ形式の誤りを修正しました(接続中のピアID: コロン区切り→カンマ区切り)。
Ver0.34r(2018/12/23改定)
・地域コード 定義ファイルに緯度・経度情報を追加しました。
Ver0.34(2018/03/04改定、2008/06/15運用開始済)
・コード561 (各地域ピア数) を拡張し、緊急地震速報 配信試験の伝達に対応しました。
Ver0.33(2018/02/18改定)
・伝言板(コード556)を廃止しました。
・サーバー情報を更新しました。
Ver0.30r2(2006/04/16改定)
・プロトコル時刻で許容される誤差を、60秒未満から1秒未満に変更しました。
・ユーザー署名における有効期限の設定を、3分から1分に変更しました。
Ver0.30r(2006/03/14改定)
・地域コード区分を変更しました(6.地域コード)。
Ver0.30(2006/03/12改定、互換性なし)
感知情報・伝言板フォーマットと、ピアデータのフォーマットを変更したため、過去バージョンとの互換性がありません。
・Ver0.30以降、変更点の前後に紺太字でバージョン番号を付記します。
・ピアデータ取得について、ネットワーク参加時・エコー時で同じコード(115/235)を使用するようにしました。
・ピアデータにピアのIDを追加しました。
・ピアデータ取得後に、接続したピアのIDを通知するコード155を追加しました。
(→P2Pネットワークへの参加 - 4.ピアデータの取得・ピアとの接続 及び サーバーへの定期エコー - 5.ピアとの接続数増加
・ピアとの接続時、ピア間で対応プロトコルバージョンの通知・拒否を行うようにしました(ピアとのシステム通信 - 2.接続時の初期通信)。
・感知情報・伝言板のフォーマットを、拡張性のある形に変更しました。
・伝言板データに、地域コード、ID・ID署名を追加しました。
(→ピアとのデータ通信 - 6.ユーザー署名の扱い - 署名/7.ユーザー署名の扱い - 検証/9.地震感知情報/10.伝言板
Ver0.29(2006/03/06改定)
・受け入れ可能なピア数を通知するようにしました(P2Pネットワークへの参加 - 5.ピアIDの本割り当て・鍵の取得)。
Ver0.28(2006/02/27改定)
・プロトコル仕様への準拠の厳格さについてを追記しました(2.基本仕様)。
・ピアネットワークの調査に関してを追加しました(ピアとのシステム通信 - 4.ピアネットワークの調査)。対応は必須です(※データのスルーだけで可)。
・サーバーへのエコー時、プロトコル時刻を再取得出来ます(サーバーへの定期エコー - 6.プロトコル時刻の再取得)。ソフトウェア起動中におけるコンピュータ時刻の変更などに対応します。対応は必須ではありません。
Ver0.27r(2006/01/21改定、サーバー側変更点無し)
・「ピアとのデータ通信 - 7.ユーザー署名の扱い - 検証」に、オフィシャルP2PQ_Clientにおける準拠ミスについて追記しました。当面の間、準拠ミスの署名についても対応することを推奨します。(Ver0.30リリースにより、この対応は不要となりました)
・同「6.ユーザー署名の扱い - 署名」で定められているユーザーデータの有効期限について、「3〜4分程度」から「3分」に変更しました。
・上記2項目と、同「2.署名」において、説明不足と思われる点などを追記・変更しました。
Ver0.27(2005/11/15改定)
・地震情報に「発表管区」を追加しました(ピアとのデータ通信 - 3.地震情報)。対応は必須ではありませんが、実装によってはプログラムの修正が必要となります。
Ver0.26(2005/10/30改定)
・サーバーへのエコー時、ピア接続数を報告するようにしました(サーバーへの定期エコー - 3.エコー)。EPSPネットワークの正常な構築を行うため、対応することを強く推奨します。
Ver0.25(2005/10/09改定)
・新たに「緯度」「経度」を追加しました(ピアとのデータ通信 - 3.地震情報)。対応は必須ではありませんが、実装によってはプログラムの修正が必要となります。
Ver0.24(2005/10/01改定)
・コード298を追加しました(「3桁の数字(コード)」一覧表)。これは、プロトコル仕様に準拠しない不正なプログラムを拒否するためのものです。
Ver0.23(2005/07/23改定)
・「震度訂正」フラグを付加しました。対応は必須ではありませんが、実装によってはプログラムの修正が必要となる場合があります。
Ver0.22(2005/07/03改定)
・サーバーの分散化に対応し、「P2Pネットワークへの参加」の「1.サーバーへの接続」を大幅修正しました。安定性向上のため対応することを強く推奨します。
・プロトコル上対応が必須でないものについて、その点を追記しました。(追記箇所:基本仕様-3.公開鍵暗号への対応、P2Pネットワークへの参加-1.サーバーへの接続[分散化])。
Ver0.21(2005/05/05改定)
・「P2Pネットワークへの参加」に、「6.各地域ピア数の取得」を追加しました。参加した時点で各地域ピア数を把握することが可能となっています。この機能への対応は必須ではありません。
Ver0.20(2005/03/14、03/20、03/24、04/16ほか改定)
・全面的な見直しを行いました。
 →コードの3桁化
 →ステップの厳格化
 →地震情報・津波予報における署名、地震感知情報・伝言板におけるユーザー署名
 →伝言板における「:(半角コロン)」「&(半角アンパサンド)」「改行」取り扱いの定義
Ver0.13(2005/01/27改定)
コード11(ピア情報要求)の仕様が変更されました。
コード22(エラーメッセージ)を追加しました。
Ver0.12(2005/01/20改定)
コード86(ピアエコー)を追加しました。
Ver0.11(2005/01/10)
コード15(ピア参加通知)の仕様が変更されました。「他ピアから接続を受け付けるかどうか」の指定が可能となっています(ネットワークへの参加→3.サーバーへの参加通知 に追記)。
「サーバーへのエコー」にエコー間隔(頻度)についてを追加しました。
Ver0.10(2004/12/16)
プロトコル仕様を公開しました。

目次へ

2.基本仕様 (Ver0.28,0.35 一部変更)

 TCP/IPを使用します(IPv4のみをサポートします)。「サーバー」との通信は6910ポート、「ピア」との通信は6911〜6915ポート等(特に制限はない)を使用します。

 通信は、すべて「3桁の数字(コード) + 半角スペース + 経由数 + 半角スペース + データ + 改行(CRLF)」の形で行われます。データはShift-JISエンコードで、複数ある場合は原則として「:(半角コロン)」で区切ります。

 「経由数」は、発信元からデータを受信するまでに経由したピアの数です。サーバーとの通信では常に「1」です。ピアとの通信では、データを他のピアへ伝達する際に1増やさなくてはいけません。また、無限ループを防ぐため、経由数が総参加ピア数の平方根もしくは10のいずれか大きいほうを超える場合、データをそれ以上他のピアに伝達してはいけません。

 (Ver0.28 重要追記)
 また、Ver0.24から、コード298(プロトコル仕様への非準拠エラー)が追加されました。このプロトコル仕様とは少しでも異なる手順を取ると、サーバーからコード298が返され、それ以降の処理を一切行わないようになっています。

[サーバーとの通信データ例]
↑ 116 1 25:6911:901:2
↓ 236

[ピア同士の通信データ例]
↓ 551 12 ABCDEFG:23時56分,3,0,1,4,東海道沖,10km,3.2,1:-奈良県,+震度1,下北山村
↑(他ピアに) 551 13 ABCDEFG:23時56分,3,0,1,4,東海道沖,10km,3.2,1:-奈良県,+震度1,下北山村

目次へ

3.公開鍵暗号への対応

 注:公開鍵暗号への対応は必須ではありません。ただし、対応しない場合「データの正当性を検証できない」「地震感知情報メッセージを発信できない」という制限があります。

 当プロトコルでは、地震情報・津波予報の偽装防止、地震感知情報メッセージの連続発信の制限を目的として、公開鍵暗号を使用しています。

地震情報・津波予報(署名)
PKCS #1 v1.5に準拠したRSASSA(1024bit)を使用しています。ハッシュアルゴリズムはSHA-1です。
地震感知情報(署名)
PKCS #1 v1.5に準拠したRSASSA(384bit)を使用しています。ハッシュアルゴリズムはSHA-1です。鍵は、有効期限付きでサーバーから各ピアに発行されるため、384bitの強度でも(現在のところ)安全です。
サーバー保証用公開鍵 (1024bit)
サーバーが発信する地震情報・津波予報・各地域ピア数の署名検証に使用する公開鍵です。

PKCS #8 (DER)形式
MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQC8p/vth2yb/k9x2/PcXKdb6oI3gAbhvr
/HPTOwla5tQHB83LXNF4Y+Sv/Mu4Uu0tKWz02FrLgA5cuJZfba9QNULTZLTNUgUXIB0m/d
q5Rx17IyCfLQ2XngmfFkfnRdRSK7kGnIXvO2/LOKD50JsTf2vz0RQIdw6cEmdl+Aga7i8Q
IBEQ==

ピア保証用公開鍵 (1024bit)
ピアが発信する地震感知情報の署名に用いられる公開鍵の署名検証に使用する公開鍵です。

PKCS #8 (DER)形式
MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQDTJKLLO7wjCHz80kpnisqcPDQvA9voNY
5QuAA+bOWeqvl4gmPSiylzQZzldS+n/M5p4o1PRS24WAO+kPBHCf4ETAns8M02MFwxH/Fl
QnbvMfi9zutJkQAu3Hq4293rHz+iCQW/MWYB5IfzFBnWtEdjkhqHsGy6sZMMe+qx/F1rcQ
IBEQ==

目次へ

4.「プロトコル時刻」 (Ver0.30r 一部変更)

 当プロトコルでは、鍵やデータの有効期限は、すべて「プロトコル時刻」を基準にしています。コンピュータの時計のズレ、あるいは時差の影響を受けることのないようにするためです。「プロトコル時刻」において許容される時刻誤差は、プラスマイナス1秒未満です。

 プロトコル時刻は、P2Pネットワークへの参加時にサーバーから供給されます。「コンピュータの時計」と「プロトコル時刻」との差がプラスマイナス1秒未満であれば、コンピュータの時計をそのままプロトコル時刻として使っても構いません。

 差がプラスマイナス1秒以上であれば、コンピュータの時計とプロトコル時刻との差を記憶しておくといった方法で、必要な時に「プロトコル時刻」を算出する必要があります。

目次へ

5.「3桁の数字(コード)」一覧表 (Ver0.24,0.26,0.28,0.29 一部変更、Ver0.30 一部追加・変更・廃止、Ver0.34r2,0.35 一部変更)

 「x1x」「x2x」は「要求」、「x3x」「x4x」は「返答」、「x5x」「x6x」は「伝達・発信」、「x9x」は「エラー」となっています。

 注意:下記で「データ:不要」「データ:なし」と記されているのは、プロトコルにおける「データ」部分で何も指定(解析)する必要がないという意味です。逆に言えば、データに何を指定しても構いません。

ピアからサーバーへ(100番台)
112 (※通信ステップの簡略化により使用していません)
サーバーの対応プロトコルバージョン、ソフトウェア名・ソフトウェアバージョンを要求します。
 データ:不要
113 ピアIDの暫定割り当てを要求します。
 データ:不要
114 ポート開放のチェックを要求します。
 データ:ピアID、ポート番号
115 参加中のピアデータを要求します。
 データ:ピアID
116 ピアIDの本割り当てを要求します。
 データ:ピアID、ポート番号、地域コード、接続数、最大接続数
117 鍵の割り当てを要求します。
 データ:ピアID
118 基準となるプロトコル時刻を要求します。
 データ:なし
119 通信の終了を要求します。
 データ:不要
123 エコー日時更新を要求します。
 データ:ピアID、接続数
124 鍵の再割り当てを要求します。
 データ:ピアID、以前割り当てた秘密鍵
126 Ver0.30 廃止(115に統合)参加中のピアデータを要求します(接続維持用)。
 データ:ピアID
127 (Ver0.21新規)各地域ピア数を要求します。
 データ:なし
128 参加終了を要求します。
 データ:ピアID、以前割り当てた秘密鍵
131 ([211]に対し)対応プロトコルバージョン、ソフトウェア名・ソフトウェアバージョンを返します。
 データ:プロトコルバージョン、ソフトウェア名、バージョン
155 Ver0.30 追加
([235]受信後)新たに接続出来たピアのIDを通知します。
 データ:ピアID
192 サーバーの対応プロトコルバージョンが古く、互換性がありません。
 データ:不要
サーバーからピアへ(200番台)
211 ピアの対応プロトコルバージョン、ソフトウェア名・ソフトウェアバージョンを要求します。
 データ:なし
212 (※本来は[112]に対するものですが、通信ステップの簡略化により変更しています)
([131]に対し)対応プロトコルバージョン、ソフトウェア名・ソフトウェアバージョンを返します。
 データ:プロトコルバージョン、ソフトウェア名、バージョン
233 ([113]に対し)ピアIDを暫定的に割り当てます。割り当てたピアIDを返します。
 データ:割り当てたピアID
234 ([114]に対し)ポート開放のチェック結果を返します。
 データ:結果(成功:1、失敗:0)
235 Ver0.30 変更
([115]に対し)参加中のピアデータを返します。
 データ:「IPアドレス,ポート,ピアID:IPアドレス,ポート,ピアID...」
236 ([116]に対し)ピアIDの本割り当てを行います。
 データ:現在の参加ピア総数
237 ([117]に対し)鍵の割り当てを行います。
 データ:秘密鍵、公開鍵、有効期限、鍵の署名
238 ([118]に対し)基準となるプロトコル時刻を返します。
 データ:プロトコル時刻
239 ([119]に対し)通信の終了を受け入れます。
 データ:なし
243 ([123]に対し)エコー日時更新を受け入れます。
 データ:なし
244 ([124]に対し)鍵の再割り当てを行います。
 データ:秘密鍵、公開鍵、有効期限、鍵の署名
246 Ver0.30 廃止(235に統合)([126]に対し)参加中のピアデータを返します(接続維持用)。
 データ:「IPアドレス,ポート:IPアドレス,ポート...」
247 各地域のピア数を伝達します。
 データ:地域コード,ピア数;地域コード,ピア数...
248 ([128]に対し)参加終了を受け入れます。
 データ:なし
291 原因不明のエラーが発生しました。
 データ:なし 対処:処理を中止します。
292 ([131]に対し)ピアの対応プロトコルバージョンが古く、互換性がありません。
 データ:なし 対処:ユーザーにその旨を伝え、P2Pネットワークへの参加を中止します。
293 要求が正しくありません。
 データ:なし 対処:処理を中止します。
295 ([117][124]に対し)鍵は既に割り当て済みです。
 データ:なし 対処:(鍵がない・期限が切れている場合)次回サーバーへのエコー時に再割り当てを要求します。
298 処理の流れがプロトコル仕様に準拠していません。
 データ:なし 対処:プログラムがプロトコル仕様に準拠するよう修正します。
299 IPアドレスが違います。
 データ:なし 対処:一旦ネットワークから切断し、参加しなおします。
ピアからピアへ(データ伝達は500番台、システム通信は600番台)
550 予約コード。
551 地震情報を伝達します。
 データ:データ署名、有効期限、地震情報概要、地震情報詳細
552 津波予報を伝達します。
 データ:データ署名、有効期限、津波予報詳細
553
~
554
予約コード。
555 地震感知情報を伝達します。
 データ:データ署名、有効期限、公開鍵、鍵署名、鍵期限、感知情報データ
556 Ver0.33 廃止伝言板を伝達します。
 データ:データ署名、有効期限、公開鍵、鍵署名、鍵期限、伝言板データ
557
~
560
予約コード。
561 Ver0.34,0.36 変更
各地域のピア数を伝達します。緊急地震速報 配信試験の伝達、緊急地震速報(警報)の簡易的な伝達にも使用します。
 データ:データ署名、有効期限、「地域コード,ピア数;地域コード,ピア数...」
562
~
589
予約コード。
611 ピアエコーを要求します。
 データ:不要
612 ピアIDを要求します。
 データ:不要
614 Ver0.30 追加
ピア対応プロトコルバージョン、ソフトウェア名・ソフトウェアバージョンを要求します。
 データ:プロトコルバージョン、ソフトウェア名、バージョン
615 調査エコーを要求します。
 データ:発信者ピアID、一意な数値
620
~
629
予約コード。
631 ([611]に対し)ピアエコーを返します。
 データ:不要
632 ([612]に対し)ピアIDを返します。
 データ:ピアID
634 Ver0.30 追加
([614]に対し)ピア対応プロトコルバージョン、ソフトウェア名・ソフトウェアバージョンを返します。
 データ:プロトコルバージョン、ソフトウェア名、バージョン
635 ([615]に対し)調査エコーを返します。
 データ:発信者ピアID、一意な数値、自ピアID、接続中(隣接)ピアID、到達経路(hop)数
640
~
649
予約コード。
694 Ver0.30 追加
([614][634]に対し)相手ピアの対応プロトコルバージョンが低く、互換性がありません。
 データ:なし 対応:いくつかのピアから同様のエラーが返る場合、最新バージョンを確認します。

目次へ

6.「地域コード」 (Ver0.30r,0.34r 変更)

 「地域コード」は3ケタの数値で、「地震感知情報」の送受信や、「ピア分布」の作成に必要となるものです。地域の区切りに深い意味はありません。なお、今後変更される可能性がありますので、変更に対応しやすい実装を行うことを推奨します。

 (Ver0.30r重要)Ver0.30rより、地域コード区分が変更されました。新しい地域区分は、震度速報で用いられる地域区分(計186)を、少しおおまかにしたものです(計138、未設定など含め計141)。

epsp-area.csv - 地域コード 定義ファイル(2018/12/23)
 「地域コード」「地域名」「都道府県名」「地方名」「緯度」「経度」をカンマ区切り(CSV方式)で定義しています。「地域名」及び「都道府県名」は必須ではないため、実装で不要な場合は省いても構いません。緯度経度は世界測地系で、地域内のある点を指します(中心点ではありません)。

目次へ

P2Pネットワークへの参加

目次へ

1.サーバーへの接続 (Ver0.33,0.35 一部変更)

 注1:分散化への対応は必須ではありません。が、安定性や信頼性向上のために、対応することを強く推奨します。対応しない場合、接続先はclient.p2pquake.netとしてください。
 注2:Ver0.20時点で分散化しているとの表記を行っておりましたが、これは誤りです。分散化はVer0.22より対応しています

 当プロトコルに準拠するサーバーは、全国各地で複数稼動しています。これは、大規模地震(または軽微なメンテナンス)等で一部のサーバーがダウンした場合や、地震発生時に集中するアクセスの分散などを想定したものです。プロトコル仕様書リリースの時点で稼動しているサーバーは、次の通りです。

サーバーアドレス 地方
p2pquake.info 北海道
www.p2pquake.net 関東
p2pquake.xyz
p2pquake.ddo.jp

 各サーバーは常にデータを同期しているため、アクセスを分散する意味でも接続するサーバーは毎回ランダムで決定してください。

 決定したら、サーバーへの接続を開始します(ポートは6910)。タイムアウト等で接続出来なかった場合は、再びサーバーを選びなおして作業を繰り返してください。なお、タイムアウトまでの時間は2〜3秒と短くても構いません。

 注意:同一IPアドレスから2セッション目の接続を確立しようとした場合や、接続から60秒が経過した場合、サーバーから接続が切断されることがあります。

目次へ

2.プロトコルバージョン等の通知

 サーバーへの接続が完了した後、サーバーからコード211(対応プロトコルバージョン等の要求)が送られてきます。これに対しては、コード131(対応プロトコルバージョン等の返答)にて応答します。

 データは「対応プロトコルバージョン」「ソフトウェア名」「ソフトウェアバージョン」の3つです。プロトコルバージョンは「x.xx(例:0.20)」の形式である必要がありますが、ソフトウェア名・ソフトウェアバージョンの表記は自由です。

↓ 211 1
↑ 131 1 0.20:P2PQ_Client:Beta2_Rev1000
↓ 212 1 0.20:P2PQ_Server:Beta2_Rev1000
(↓ 292 1 Protocol_version_incompatible)
(↑ 192 1)

 問題がなければ、サーバーからコード212(対応プロトコルバージョン等の返答)が返ります。データ形式はコード131で送ったものと同じです。

 対応するプロトコルバージョンが古く互換性がない場合は、サーバーからコード292(エラー:バージョンが古い)が返されます。その場合は、その旨をユーザーに伝えてP2Pネットワークへの接続を中止する必要があります。逆に、もしサーバーの対応するプロトコルバージョンが古く互換性がない場合は、コード192(エラー:バージョンが古い)を送信し、別のサーバーとの接続を試みてください。

目次へ

3.ピアIDの暫定割り当て・ポート開放のチェック

 ピアIDとは、P2Pネットワークにおいてピアを識別するために使われるIDのことです。まず、サーバーから暫定的にピアIDを割り当ててもらう必要があります。コード113(ピアID暫定割り当て要求)を送信します。これに対しては、コード233(ピアID暫定割り当て)が返ります。データはピアIDです。

↑ 113 1
↓ 233 1 25

 次に、他ピアからの接続を受け付ける場合は、正しくポートが開放されているかチェックするために、受け付け用のポート(6911〜6915等、制限なし)でListenしてから、コード114(ポート開放チェック要求)を送信します。データはピアID、ポート番号です。

↑ 114 1 25:6911
↓ 234 1 1

 チェック結果は、コード234(ポート開放チェック返答)で返されます。データが1であれば成功、それ以外(0)であれば失敗です。

目次へ

4.ピアデータの取得・ピアとの接続 (Ver0.30 一部追加・変更)

 次に、ピアとの接続を行うために、ピアデータを取得します。コード115(ピアデータの取得)を送信します。データはピアIDです。サーバーからは、コード235(ピアデータ)が返ります。

↑ 115 1 25
↓ 235 1 192.168.0.1,6911,15:192.168.0.2,6915,81:192.168.0.3,6913,66
↑ 155 1 15:66

 データは、ピアごとに「コロン区切り」です。さらに、ピアごとのIPアドレス・ポート番号・ピアID(Ver0.30新規)が「カンマ区切り」となっています。これを元に、ピアに接続を試みます。

 3〜5ピアと接続したか、ピアデータを使い果たしたら、(Ver0.30新規)コード155(接続ピアID通知)を送信します。データは、接続したピアのIDです。

目次へ

5.ピアIDの本割り当て・鍵の取得 (Ver0.29 一部変更、Ver0.34r2 表記変更)

 ピアとの接続が完了した場合、暫定的に割り当てられていたピアIDの本割り当てを要求します。コード116(ピアIDの本割り当て要求)を送信します。データは、ピアID、ポート番号、地域コード、接続数、受け入れ可能な最大接続数です。

↑ 116 1 25:6911:901:2:6:5,8,3
↓ 236 1 29

 本割り当てが完了した場合、サーバーからコード236(ピアIDの本割り当て)が返ります。データは、現在の参加ピア総数です。ピアIDは暫定的に割り当てられていたものをそのまま使用します。

 この後、自らがP2Pネットワークへデータを発信する際に必要なRSA鍵を取得します(地震感知情報メッセージを発信しない場合、取得する必要はありません)。コード117(鍵割り当ての要求)を送信します。データはピアIDです。鍵の割り当てが成功した場合、コード237(鍵割り当て)が返ります。データは、秘密鍵、公開鍵、有効期限、鍵の署名です。秘密鍵・公開鍵・鍵署名はBASE64エンコードされています。有効期限は「YYYY/MM/DD HH-MM-SS」フォーマットです。

↑ 117 1 25
↓ 237 1 ABCDEFGHIJKLMNOPQRSTU:ABCDEFGHIJKLMN:2005/03/14 12-34-56:ABCDEFGHIJKLMN
(↓ 295 1 Key_has_allocated)

 同一IPアドレスから一定時間内に複数の鍵を取得しようとした場合などでは、コード295(エラー:鍵割り当て済み)が返ります。この場合、P2Pネットワーク参加中の「サーバーへのエコー」時に鍵の再割り当てを試み、割り当てが行われるまでは、「鍵がない(未署名)」状態で地震感知情報メッセージを送信することになります。

目次へ

6.各地域ピア数の取得 (Ver0.21新規)

 各地域のピア数を取得します。コードは127です。サーバーからは、コード247が返ります。

↑127 1
↓247 1 001,0;002,2;003,5;004,3

 地域ピア数は、地域ごとに「セミコロン区切り」です。さらに、地域コードとその地域のピア数が「カンマ区切り」となっています。なお、地域ピア数が0である地域のデータは含まれません。

目次へ

7.プロトコル時刻の取得

 鍵やデータの有効期限をチェックする際に必要な「プロトコル時刻」を取得します。コードは118です。サーバーからは、コード238が返ります。

↑ 118 1
↓ 238 1 2005/03/19 12-34-56

 時刻フォーマットは「YYYY/MM/DD HH-MM-SS」です。原則として、日本標準時とほぼ同じです。

目次へ

8.サーバーとの接続終了

 ここまでの処理が正常に行われた場合、P2Pネットワークへの参加処理は完了しました。コード119(通信終了要求)を送信し、サーバーからコード239(通信終了)が返れば、サーバーとの接続を切断してください。

↑ 119 1
↓ 239 1

目次へ

サーバーへの定期エコー

 ピアは、正常に動作していることを通知するため、サーバーに「エコー」する必要があります。エコーは、10分間隔で行ってください。30分以上行われないと、サーバーは「ピアがダウンした」と判断します。

目次へ

1.サーバーへの接続

 「P2Pネットワークへの参加 - 1.サーバーへの接続」と同様

目次へ

2.プロトコルバージョン等の通知

 「P2Pネットワークへの参加 - 2.プロトコルバージョン等の通知」と同様

目次へ

3.エコー (Ver0.26 一部変更)

 エコーは、コード123です。データには、ピアIDと現在のピアとの接続数をを指定します。成功すると、コード243(エコーOK)が返ります。

↑ 123 1 25:3
↓ 243 1
(↓ 299 1 IP_Address_has_been_changed)

 エコー時のIPアドレスが参加時と変わっている場合、コード299が返されることがあります。この場合、一旦ネットワークから切断し、参加しなおしてください。

目次へ

4.鍵の再割り当て要求

 鍵の有効期限が切れる30分前から、必要に応じてコード124(鍵の再割り当て要求)を行うことが出来ます。データには、ピアID、以前割り当てられた秘密鍵(のBASE64エンコード)を指定します。もし、参加時にコード295が返された等で以前割り当てられた秘密鍵がない場合、「Unknown」を指定します。

↑ 124 1 25:ABCDEFG
↓ 244 1 ABCDEFGHIJKLMNOPQRSTU:ABCDEFGHIJKLMN:2005/03/14 12-34-56:ABCDEFGHIJKLMN
(↓ 295 1 Key_has_allocated)

 鍵の再割り当てが成功すると、コード244が返ります。データは、秘密鍵、公開鍵、有効期限、鍵の署名です。詳細なフォーマットは「P2Pネットワークへの参加 - 5.ピアIDの本割り当て・鍵の取得」と同様です。同一IPアドレスから一定時間内に複数の鍵を取得しようとした場合などでは、コード295が返ります。この場合、次回エコー時に再び割り当てを試みてください。

目次へ

5.ピアとの接続数増加 (Ver0.30 変更)

 Ver0.30で、コードが統合されました。P2Pネットワークへの参加 - 4.ピアデータの取得・ピアとの接続」と同様

 ただし、既に接続済みのピアと複数のセッションを確立することのないよう、ID・IPアドレスが重複していないかチェックする必要があります。

 また、コード155による接続ピアID通知には、新たに接続したピアのIDのみを通知します。

目次へ

6.プロトコル時刻の再取得 (Ver0.28新規)

 「P2Pネットワークへの参加 - 7.プロトコル時刻の取得」と同様

目次へ

7.サーバーとの接続終了

 「P2Pネットワークへの参加 - 8.サーバーとの接続終了」と同様に、コード119を送信し、コード239が返れば接続を切断します。

目次へ

P2Pネットワークへの参加終了

目次へ

1.ピアとの接続終了

 全てのピアとの接続を切断してください。

目次へ

2.サーバーへの接続

 「P2Pネットワークへの参加 - 1.サーバーへの接続」と同様

目次へ

3.プロトコルバージョン等の通知

 「P2Pネットワークへの参加 - 2.プロトコルバージョン等の通知」と同様

目次へ

4.参加終了

 参加終了は、コード128で行います。データは、ピアID、以前割り当てた秘密鍵(のBASE64エンコード)です(鍵が割り当てられていない場合は「Unknown」)。正常に完了すれば、コード248が返ります。

↑ 128 1 25:ABCDEFG
↓ 248 1

 鍵が正しくない場合はコード293(要求が正しくない)、IPアドレスが参加時と異なっている場合はコード299(IPアドレスが一致しない)が返ります。この場合、どうすることも出来ないので、そのまま次のステップに進んでください。

目次へ

5.サーバーとの接続終了

 「P2Pネットワークへの参加 - 8.サーバーとの接続終了」と同様に、コード119を送信し、コード239が返れば接続を切断します。

目次へ

ピアとのシステム通信

目次へ

1.接続の受け付け

 ポートを開放している場合、他ピアからの接続を受け付けることがあります。接続数が限界ではない限り、速やかに接続を受け入れてください。

 受け入れた後、接続先のIPアドレスを調べた上で、他に接続しているピアとIPアドレスが重複していないか確認してください。重複していた場合、受け入れた接続を切断してください。これは、同一ピアと2セッション接続してしまうことを防ぐためです。

目次へ

2.接続時の初期通信 (Ver0.30 名称変更、一部追加)

 他ピアからの接続を受け付けた場合、プロトコルバージョンとピアIDをやり取りします。

 まず、コード614(バージョン要求)でプロトコルバージョンを要求します。コード634(バージョン返答)が返ります。

↑ 614 1 0.30:P2PQ_Client:Beta2.1_Rev1000
↓ 634 1 0.30:P2PQ_Client:Beta2.1_Rev1002
(↓ 694 1 Protocol_version_incompatible)

 相手プロトコルバージョンが古い場合、コード694を返し、接続を切断します。

 次に、ピアIDを把握するために、コード612(ピアID要求)でピアIDを要求します。ピアからは、コード632(ピアID返答)が返ります。データはピアIDです。

↑ 612 1
↓ 632 1 26

 コード632が返りピアIDが判明した場合、接続中のピアとピアIDが重複していないか確認してください。重複していた場合、新たに接続してきたピアとの接続を切断します。これは、同一ピアと2セッション接続してしまうことを防ぐためです。

 注意:2セッション接続しているかどうかの判定がIPアドレス・ピアIDと二重ですが、問題はありません。

目次へ

3.ピア同士のエコー

 ピアとの接続が切断していないかチェックするために、2〜5分程度の間隔で接続中のピアにコード611(ピアエコー要求)を送信します。接続が正常であれば、相手からはコード631(ピアエコー返答)が返ります。

↑ 611 1
↓ 631 1

 10〜30秒以内に相手から応答が返らない場合や、ソケット状態が「エラー」となっている場合は、ピアとの接続を切断してください。

目次へ

4.ピアネットワークの調査 (Ver0.28 新規、Ver0.34r2 一部変更)

 ピアとピアとの繋がりを視覚化します。いわばEPSP上のtracerouteですが、仕組みは若干異なります。

  1. 調査したいピアは、「調査エコー(コード615)」を発信します。データには、発信元ピアIDと、調査エコーを識別するための一意な数を指定します。

    ↑ 615 1 35:35196742

  2. 「調査エコー(コード615)」を受信したピアは、過去の調査エコーバッファと比較し、新規エコーだった場合のみ処理を続けます。
    1. 「一意な数」と「送信元(ソケット番号など、後で送り返しするために必要な値)」を新たにバッファに追加します。
    2. 調査エコーを、接続している他のピアにもリレーします。
    3. 送信元に対し、「調査エコーリプライ(コード635)」を送信します。データには、調査エコーで指定されていた発信元ピアID・一意な数と、自らのピアID・接続中のピアID(カンマ区切り)・調査エコーが届いた経由数を指定します。

      ↓ 615 7 35:35196742
      ↑ 635 1 35:35196742:38:12,67:7

  3. 「調査エコーリプライ(コード635)」を受信したピアは、受信したデータの「一意な数」と、過去の調査エコーバッファの「一意な数」と比較します。一致するバッファがあった場合のみ処理を続けます。
    1. 過去の調査エコーバッファで記憶されている「送信元」に対し、調査エコーリプライをリレーします。
      送信元との接続が切断されている場合は、接続中の全てのピアに対してリレーします。
  4. 調査したいピアに対して、調査エコーリプライが続々と届きます。各ピアがどのように繋がりを持っているかを知ることが出来ます。

 なお、このネットワーク調査については、完全な対応を必須としません。ただし、受信した「調査エコー」または「調査エコーリプライ」を接続中の全てのピアにリレーすることは必須です。

目次へ

5.予約コードの伝達 (Ver0.35 新規)

 将来の拡張のために予約されている予約コードについては、「ピアとのデータ通信 - 1.重複判定・各ピアへの伝達」に従って処理してください。

目次へ

ピアとのデータ通信

目次へ

1.重複判定・各ピアへの伝達 (Ver0.35 一部変更)

 当プロトコルでは、複数のピアと接続していることから、複数のピアから同一の通信データを受信することが当たり前のようにあります。そのため、同一の通信データかどうかを判断し、同一「ではない」場合にのみ処理を行う必要があります。

 同一の通信データかどうかは、通信のデータ部分で判断してください。「データ署名」のある通信は、これを用いることもできます。

 そして、同一「ではない」と判断された場合、署名やその他を検証する前に、速やかにデータを送ってきたピア「以外」の他ピアへ情報を伝達する必要があります(※その際、「基本概要 - 2.基本仕様」に記されているよう、経由数を1プラスする必要があります)。

 将来の拡張のために予約されている予約コードについても、上記の通り処理してください。

目次へ

2.署名 (Ver0.27r 表記変更)

 サーバーからのデータには、それがサーバーから発信されたことを示す署名が含まれています。次の方法で署名の検証を行うことが出来ます。

  1. 「データ署名」の検証
    「サーバー保証用公開鍵」を使用し、「データ署名」が、「有効期限(YYYY/MM/DD HH-NN-SS)」と「データのMD5ハッシュ(バイナリ)」を結合したデータの署名であるかを検証します。
    MD5ハッシュとなるデータは、地震情報では「地震情報概要」と「地震情報詳細」、津波予報では「津波予報詳細」、各地域ピア数では「地域ピア数(全体)」です。
  2. 「有効期限」の確認
    「有効期限」が切れていないかを確認します。

目次へ

3.地震情報 (Ver0.23,0.25,0.27 一部変更)

 地震情報はサーバーから発信されます。が、サーバーも「1ピア」として発信するため、実装で特に意識する必要はありません。地震情報は、コード551です。データは、コロン区切りで「データ署名」「有効期限」「地震情報概要」「地震情報詳細」と大きく4つに分かれています。クライアントで表示フォーマットを自由にデザインすることが出来ます。

↓ 551 5 ABCDEFG:2005/03/27 12-34-56:12時34分頃,3,1,4,紀伊半島沖,ごく浅く,3.2,1,N12.3,E45.6,仙台管区気象台:-奈良県,+2,*下北山村,+1,*十津川村,*奈良川上村

 地震情報概要は、カンマ区切りで「発生時刻」「震度」「津波の有無(0=なし,1=あり,2=調査中,3=不明)」「地震情報種類(1=震度速報,2=震源情報,3=震源・震度情報,4=震源・詳細震度情報,5=遠地地震情報)」「震源」「深さ」「マグニチュード」「震度訂正(0=いいえ,1=はい)」「緯度(N=北緯,S=南緯)」「経度(E=東経,W=西経)」「発表管区」となっています。

 地震情報詳細は、カンマ区切りです。先頭に「-」があれば都道府県名、「+」があれば震度、「*」があれば震度観測点名です。

 注意:地震情報の種類により、震源または地震情報詳細が空である場合があります。震度は「5弱」等文字列が含まれることがあります。地震情報詳細の震度にはさらに「5弱以上(推定)」も含まれることがあります。

[表示例]
12時34分頃、震度3の地震がありました。津波の心配はありません。震源は紀伊半島沖、深さはごく浅く、マグニチュードは3.2と推定されます。震度が訂正されました。
【奈良県】震度2:下北山村 震度1:十津川村 奈良川上村

目次へ

4.津波予報 (Ver0.36 一部変更)

 地震情報と同じように、津波予報もサーバーから発信されます。サーバーが「1ピア」として発信する点も同じです。津波予報は、コード552です。データは、コロン区切りで「データ署名」「有効期限」「津波予報詳細」と大きく3つに分かれています。

↓ 552 6 ABCDEFG:2005/03/27 12-34-56:-大津波警報,*和歌山県,-津波警報,+淡路島南部,+徳島県,-津波注意報,+大阪府,+兵庫県瀬戸内海沿岸

 津波予報詳細は、カンマ区切りです。先頭に「-」があれば予報種類(津波注意報・津波警報・大津波警報)、「+」または「*」があれば予報区名です。「*」は、その予報区に直ちに津波が来襲することを示します。ただし、解除された場合は、単に「解除」という文字列が入ります。

 予報区は、気象庁の「地震・津波の資料」の「津波予報区について」に記載されています。

 (Ver0.36 廃止) なお、仮に津波予報が各管区気象台から別々に発表された場合、(Webサイトへの更新のタイミングから)その一部を取りこぼす可能性がある重大な問題を含んでいます。当プロトコルに準拠するソフトウェアを公開される場合は、ヘルプ等に必ずこれを明記してください。

目次へ

5.各地域ピア数/緊急地震速報 配信試験/緊急地震速報(警報) 部分配信 (Ver0.34,0.36 一部変更)

 「各地域ピア数」とは、ピアが通知した「地域コード」を元に、各地域のピア数を示したものです。各地域ピア数もサーバーが「1ピア」として発信します。各地域ピア数はコード561です。データは、コロン区切りで「データ署名」「有効期限」「地域ピア数」です。

↓561 25 ABCDEFG:2005/03/27 12-34-56:001,0;002,2;003,5;004,3

 地域ピア数は、地域ごとに「セミコロン区切り」で分かれています。さらに、地域コードとその地域のピア数が「カンマ区切り」となっています。なお、地域ピア数が0である地域のデータは含まれません。

  (Ver0.34 一部変更, Ver0.36 加筆) 「緊急地震速報 配信試験」は、 NHK ラジオ第一の音声認識により、緊急地震速報(警報)の発表を検出した旨を伝えるものです。互換性を保つために各地域ピア数のデータに含む形で発信します。「地域ピア数」データ内に、地域コードが950・ピア数が0のデータがあるかどうかで判断します。なお、地域コードが951・ピア数が0の場合はテスト配信です。

↓561 25 ABCDEFG:2005/03/27 12-34-56:001,0;002,2;003,5;004,3;950,0

  (Ver0.36 一部変更) 気象庁の緊急地震速報(警報)の内容の一部を、互換性を保つために各地域ピア数のデータに含む形で発信します。「地域ピア数」データ内に、以下の地域コードがピア数0のデータとして含まれています。

名称については epsp-area.csv に記載しています。以下のサンプルは、短縮用震央地名が「茨城沖」、府県予報区が「福島」「茨城」となっている例です。

↓561 25 ABCDEFG:2005/03/27 12-34-56:001,0;002,2;003,5;004,3;952,0;779,0;169,0;170,0

 本データは簡易的な伝達を目的としたもので、緊急地震速報(警報)としての利活用は推奨いたしません。なお、緊急地震速報(警報)は続報が発表されることがありますが、本データでは発表順や異なる地震のものかを区別することはできません。取消も配信しません。

目次へ

6.ユーザー署名の扱い - 署名 (Ver0.27r,0.30 一部変更)

 地震感知情報データは、ユーザーから発信されます。「正しい方法によって発信された」ことを示すために、発信時にデータの署名を行う必要があります。

  1. 有効期限のセット
    プロトコル時刻から、プラス1分にセットします(Ver0.30r2以前は3分、Ver0.27r以前は3〜4分程度)。
  2. 署名の実施
    サーバーから割り当てられた「秘密鍵」を使用し、署名を行います。署名結果は「データ署名」と呼びます。
    署名の元となるデータは、「有効期限」と「データのMD5ハッシュ(バイナリ)」を結合したものです。
    MD5ハッシュの元となるデータは、(Ver0.30 変更)「地震感知情報データ」です(カンマ区切りそのまま)。
  3. BASE64エンコード
    生成された「データ署名」、サーバーから割り当てられた「公開鍵」、同様に割り当てられた「鍵署名」を、それぞれBASE64エンコードします。
    BASE64エンコード結果に改行を含む場合は、改行を取り除きます。

 このようにして出来た「データ署名」「公開鍵」「鍵署名」のBASE64エンコードデータは、「9.地震感知情報」発信に使用されます。

目次へ

7.ユーザー署名の扱い - 検証 (Ver0.27r,0.30 一部変更)

 逆に、地震感知情報データが「正しい方法によって発信された」ことを確かめるには、次のようにして検証します。

  1. BASE64デコード
    受信した「データ署名」「公開鍵」「鍵署名」をそれぞれBASE64デコードします。
  2. 鍵署名の検証
    「ピア保証用公開鍵」を使用し、「鍵署名」が、「公開鍵(バイナリ)」と「(あわせて受信した)鍵期限(YYYY/MM/DD HH-NN-SS)」を結合したデータの署名であるかを確認します。
    加えて、「鍵期限」が切れていないか確認します。
  3. データ署名の検証
    受信・デコードした「公開鍵」を使用し、「データ署名」が「有効期限(YYYY/MM/DD HH-NN-SS)」と「データのMD5ハッシュ(バイナリ)」を結合したデータの署名であるかを確認します。
    MD5ハッシュの元となるデータは、(Ver0.30 変更)「地震感知情報データ」です(カンマ区切りそのまま)。

    (Ver0.30 廃止というか不要に)※Ver0.27r発行時点のオフィシャルP2PQ_Clientでは、誤った実装により「有効期限」と「データ」を結合したもので署名が行われています。
  4. 「有効期限」の確認

 これにより、「サーバーから割り当てられた鍵を用いて発信された」ことを確認することが出来ます。

目次へ

8.「多重発信」の識別

 悪意のあるなしに関わらず、1人によって地震感知情報が大量に発信されれば、地震感知情報は使い物にならなくなってしまいます。このようなことを防ぐために、受信側で何らかの対策が必要となります。

 例えば、地震感知情報では「同じ公開鍵によるものは1分に1回しか受け付けない」ようにします。これにより、何者かが1分に100回の地震感知情報を発信しても、100回のうち99回は「無効」として処理されるため、機能に支障をきたすことがなくなります。実際には、5〜10分に1回しか受け付けないぐらいでも良いでしょう。

目次へ

9.地震感知情報 (Ver0.30 変更、Ver0.34r2 表記変更)

 地震感知情報は、ユーザーによる「揺れた」という情報のことです。コード555で、(Ver0.30変更)データは「データ署名」「有効期限」「公開鍵」「鍵署名」「鍵期限」「感知情報データ」です。「感知情報データ」には、カンマ区切りで「ユニーク値」「地域コード」が入っています。なお、署名が出来ない場合は「有効期限」「感知情報データ」以外は空文字列とします。

↓ 555 13 ABCDEFG:2005/03/27 12-34-56:ABCEFFG:ABCDEFG:2005/03/14 12-34-56:2503151124,901

 「ユニーク値」には、「ピアIDと日時」といった重複しない文字列を指定します。

 この地震感知情報はユーザーによるものであり、誤報も多く含みます。そのため、受信した時点ですぐに表示はせず、「30秒間に一定件数以上を受信した場合」といった条件で表示することを推奨します。

目次へ

10.伝言板 (Ver0.30 変更、0.33 廃止)

 伝言板は、地震発生時・地震感知情報表示時における情報交換に使用するものです。コード556で、(Ver0.30変更)データは「データ署名」「有効期限」「公開鍵」「鍵署名」「鍵期限」「伝言板データ」です。「伝言板データ」には、カンマ区切りで「名前」「地域コード」「メッセージ」「ID(予約)」「ID署名(予約)」が入っています。

↑ 556 1 ABCDEFG:2005/03/27 12-34-56:ABCDEFG:ABCDEFG:2005/03/14 12-34-56:ななし,901,めるぽ!,Reserved,Reserved

 メッセージにコロン(:)・アンパサンド(&)・改行が含まれる場合、送信・受信時にそれぞれ置き換えを行う必要があります。コロンは「:」、アンパサンドは「&」、改行は「&newline;」です。

目次へ