HTTPだけでP2Pシステムを構築できないか?
現状大抵のシステムがHTTPで実現できているので、P2PもHTTPでかなりの部分構築できないのかな、と考えています。これは先日のエントリーの「P2Pシステムのインターフェース共通化の提案」の発展版です。
まずこの目論見を説明するためにP2Pを2つのタイプの機能にブレイクダウンします。
・P2Pクライアント機能
・P2Pサーバ機能
P2Pなのにクライアント、サーバと名づけるには違和感がある人もいるとは思うが、まずはこれで説明しよう。クライアント、サーバが意味することは後ほど説明します。
P2Pクライアント機能は「HTTPクライアント」です。もっと具体的に言うと、HTTPでP2Pサーバに「リンク」を張り、維持し、HTTPで各種「要求」を行います。
要求とはリンクの形成・維持(Joinなど)、DHTで言うPUTやGET要求などです。
P2Pサーバは「HTTPサーバ」です。もっと具体的に言うとHTTPでP2Pクライアントからのリンクを待ちうけ、維持し、HTTPで各種「要求」を処理します。
通常のP2PノードはP2Pクライアント機能+P2Pサーバ機能と考えられます。この亜種としてP2Pサーバ機能しかないノードやP2Pクライアント機能しかないノードというのも考えられます。これらを含めてP2Pシステムと呼ぶことにしよう。
もう少し説明を続けます。
今すべてのノードがグローバルIPアドレスを保有しているものとします。ノードはHTTPサーバ機能を持っているので仮にすべてのノードが80番ポートでHTTPを待ち受けるとします。
つまり、P2Pに関するリンクを80番で待ち受けるものとします。
ノードA、ノードBが存在した場合のリンクの形成を考えてみます。
ノードAはノードBに対してあて先80番ポートで接続します。ノードBは80番ポートでノードAのリンクを待ち受けます。
逆にノードBはノードAに対してあて先80番ポートで接続します。ノードAは80番ポートでノードBのリンクを待ち受けます。このようにすることでHTTPのセッションは2つできるが、2つまとめてみると「双方向」のリンクが構築できます。
(本来TCPコネクション1本でも双方向リンクを構築できるが、それは本質的ではないので、ここでは説明しません。)
P2Pサーバ機能は、リンクの接続を受けることと要求の返答をするだけではありません。各種要求を必要に応じて他のノードに転送する役割を持ちます。構造化オーバーレイであれば転送経路はひとつのリンクだし、非構造化オーバーレイでは複数のリンクを各種要求が転送するかもしれません。ここが通常のWEBサーバと違うところです。P2PサーバはWEBサーバというよりもSIPサーバの機能に近いかもしれません。
ではHTTPを使ってどう要求を行う、あるいは要求を返答するかということですが、これはSOAPやRESTのような既存技術を使えばよいでしょう。
つまり、NATがない前提あるいはUPnPが使える前提であればHTTPだけでP2Pシステムが構築できることが考えられます。
話は元に戻って、先ほど「P2Pシステムのインターフェース共通化の提案」について話しましたが、そうなるとP2Pの共通インターフェースを記述する方法というのはSOAPかRESTの方がよいかもしれません。興味ある人で勉強会を実施してSOAPやRESTを使ってP2Pシステムのインターフェースを規定したり、実装してみませんか?
なお、今回の提案は、IETFのNAT越え技術に関するドラフトNICEにインスパイヤされて検討したものです。
| 固定リンク
「P2P」カテゴリの記事
- WebRTCを実現するためにSTUNだけでなくTURNも必要な理由(2015.01.08)
- [P2P]P2Pストリーミングのサーベイ文書について(2014.11.09)
- Winnyの開発者、金子 勇氏の急逝を悼んで(2013.07.07)
- 「分散ハッシュシステムでのNAT超えの考察」に対する質問について(2012.12.16)
- [P2P]Websocketでブラウザ間P2P通信は実現できるか?(その2)(2011.11.20)
この記事へのコメントは終了しました。
コメント