■スレッドリストへ戻る■ 全部 1- 101- 201- 301- 401- 501- 601- 701- 801- 901- 最新50
2chのような掲示板システムってP2Pで
- 538 :266 :01/08/26 16:03
- ●P2Pcache 側の実装物について
P2Pプロトコルに基づいて動作するサーバント兼
その動作過程で獲得したデータを整形してブラウザに送る
HTTPd としての実装が必要。
以下ではプロトコルについて述べる。
プロトコルはメッセンジャーの非同期な交換としてモデル化する。
すなわち、ピアは他のピアへとメッセンジャーを送信するが、
どのメッセンジャーも独立しており、返信を必須条件としない。
ある目的に沿って二者間でメッセンジャーが継続的に往復する時
この往復の全体をセッションと呼ぶものとする。
メッセンジャーは次のフォーマットをとる。
struct Messenger{
struct Header ;
struct Message ;
} ;
struct Header{
time_t timeStamp ;
GUID inquirerID ;
GUID answererID ;
} ;
Message の中身はメッセージの種類ごとに異なる(後述)。
Header の各フィールドは次の意味を持つ。
timeStamp:メッセンジャーが生成された日時。
inquirerID:メッセンジャーの生成者を識別する一意なID。
answererID:メッセンジャーへの応答者を識別する一意なID。
inquirerIDとanswererIDはセッションごとに生成される。
- 539 :266 :01/08/26 16:03
- 以下にレスの検索から収集までのフローについての具体例を示す。
ピアAが search メッセージを持つメッセンジャーを生成する。
この時にメッセンジャーの inquirerID を初期化する。
↓
ピアAは生成したメッセンジャーを直近のピアにばらまく。
↓
メッセンジャーを受け取ったピアはそのメッセージをチェックし、
自分の抱えるキャッシュ内を検索してレスの有無を調べる。
レスが見つからなければ受信したメッセンジャーを複製して
更に自分の直近のピアにばらまく(無限拡散防止などはgnutellaとほぼ同じ)。
この時、「メッセンジャーをどのピアからどのピアへ中継したか」を記憶する。
↓
あるピアでついにキャッシュにヒットしたら、
メッセンジャーのメッセージを found メッセージに置換し、
answererID を新たに生成した一意なIDで初期化する。
できたメッセンジャーは自分に search メッセージを送ってきたピアに送る。
↓
found メッセージ付きのメッセンジャーを受け取ったピアは inquirerID を調べ、
自身が過去に生成したメッセンジャーのものかどうかを確かめる。
found メッセンジャーが自分の生成したものでなかったなら
過去の中継記録中にそのIDが含まれていないかどうかを調べる。
中継記録中に含まれていた場合は中継元に更に中継する。
↓
あるピアでついに found メッセージ付きのメッセンジャーを受信できたなら
メッセージ部分を retrieve に書き換えて・・・以下略。
timeStamp はメッセンジャーの破棄に用いる。
すなわち、一定時間よりも前に生成されたメッセンジャーはその場で廃棄する。
- 540 :266 :01/08/26 16:03
- 続いて各メッセージについて。
メッセージは search, found, retrieve, response の四つとする。
この四つはこの順序で状態遷移するものでもある。
1)search メッセージ
レスの検索を行う。フィールドは次の通り。
struct SearchMessage{
string type = "search" ;
short hopCountLeft ;
string board ;
string thread ;
resID_t resFrom ;
resID_t resTo ;
} ;
board 板の thread スレの resFrom から resTo までの範囲のレスを探す
という意味になる。search メッセージに対しては found メッセージで応答する。
見つからなければ返信はせずに search メッセージを増幅してばらまく。
- 541 :266 :01/08/26 16:04
- 2)found メッセージ
検索結果の通知を行う。フィールドは次の通り。
struct FoundMessage{
string type = "found" ;
short resCount ;
struct ResInfo{
resID_t resID ;
short resSize ;
long resHash ;
} resInfos[] ;
} ;
search メッセージに該当するレスの一覧の情報を返す。
この時、必ずしも完全にヒットしていなくてもよい。
例えば、resFrom=1, resTo=100 の search に対して
1 〜 40 のレスしか持っていなくても返信してよい。
found メッセージを受信したピアは次の retrieve メッセージで応答する。
ただし、found メッセージ中のハッシュが 2ch.net から取得したものと
一致しなかった場合にはこれを無視してよい。
3)retrieve メッセージ
レス内容の提供を要請する。フィールドは次の通り。
struct RetrieveMessage{
string type = "retrieve" ;
short resCount ;
resID_t resIDs[] ;
} ;
提供を要請する ID の列を resIDs に収める。
retrieve メッセージに対する返信として
ピアは次の response メッセージで応答する。
330KB
新着レスの表示
スレッドリストへ戻る 全部 前100 次100 最新50
0ch BBS 2004-10-30