■スレッドリストへ戻る■ 全部 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