ネットワーク・プログラミング (P2P, RPC)

Menu Menu


目的

ネットワーク・アプリケーションは、WWWのようなクライアント・サーバ型のサービスから、直接、ユーザのコンピュータ同士を接続するP2P技術に焦点が移りつつある。P2P技術の中心であるネットワーク・プログラムを習得し、新しいネットワーク・アプリケーションの可能性を探る。


関連科目

教科書:

    A.Silbershatz and P.Galvin  "Operating System Concepts"
    TCP/IP


実験方法

プログラムは、任意のプログラム言語で記述して良い。Java とかにある RMI や、Horb を使った方が簡単に出来る可能性がある。


level 1

情報工学実験IIで使用した sizedio library を使って、基本的な通信を行う。

TCP/IPを用いて、簡単なメッセージをやりとりするサーバとクライアントの両方を作成せよ。


level 2

以下のRPCパッケージを参考にRPCを用いたサーバとクライアントを作成せよ。


level 3

P2Pアプリケーションは、

    複数のユーザに関する情報を提供するP2Pサーバ
    サーバにアクセスするとともに、ユーザ間での通信をサポートするP2Pプログラム

の二種類から構成される。特に、後者は、サーバとクライアントの両方の性質を持つ。

P2Pサーバでは、接続して来るP2Pのプログラムを使用するユーザのデータベースを保持する。

ユーザ間での通信は、level 1, level 2 と同様である。ただし、データ受け取るポートは、一時的に作成されるポートとなる。


level 4

P2Pサーバに接続して、ユーザの登録を行う部分を作成せよ。もちろん、登録を要求するP2Pプログラムの部分も作成する必要がある。データベースは、どのように作成するのが良いか考察せよ。

   データベースサーバを用いる(Postgress, Oracle など)
   配列に格納する
   ハッシュテーブルを使う
   二分木を使う

これらの以外の方法がよさそうに思えるが...

このデータベースを作成する際に考慮すべきことは何だろうか?

   速度 (なんの速さ?)
   データの保存性
   データの整合性

ICQ などではデータベースには、番号(ユーザID)を用いている。これは適切だろうか? 名前を使用するようにできないか?


level 5

サーバに接続したP2PプログラムからIDで指定されたユーザに関する情報を提供する部分を作成せよ。また、P2Pプログラムから指定されたユーザに関する情報を取得する部分を作成せよ。

どのような情報をサーバのデータベースに置くべきだろうか?

    ユーザIDと、ユーザの人間向けの表現
    P2Pプログラム間の通信を可能にするためのポートアドレス


level 6

level 5の情報を用いて、P2Pプログラム間でファイル転送または、チャットを行うプログラムを作成せよ。

例えば、AからBへファイルを転送するには、

  1. Aが、P2Pサーバへの情報の伝達
  2. Bが、P2Pサーバから情報を取得
  3. Bが、P2Pサーバから取得したポート番号を使ってAへ接続
  4. WWWサーバなどと同じようにファイルを送信する
  5. 転送が終ったら接続を切る

やりとりするポート番号は、AとBだけに有効なものである必要がある。


level 7

作成したプロトコルを記述する文書を作成せよ。英語が望ましい。


level 8

作成したP2Pプログラムが、異なるアーキテクチャやOS上で動作することをテストで示せ。

nirai と pw 間、Mac OS X と nirai、Windows と Linux など。動かない理由は、エンディアンに起因することが多い。エンディアンの異なるアーキテクチャ間で通信できるかどうかを調べよう。

RPCを使えば、このあたりは自動的に処理してくれるが... 自分で行う際には、工夫が必要だろう。XDR などを参考にしてみよう。


level 9

P2Pプログラムで、同時に100人が複数のファイルを交換するテストを実行せよ。(もちろん、プログラムを作成して、実行する。ssh と shell script でも良い)

このP2Pサーバの性能を表現するには、どんな測定をすれば良いかを考察し、実際に測定せよ。

以上のプログラムでは、micq などを参考にしても良い。また、RPC を使用するかどうかも自由である。しかし、micq のソースは非常に汚い。GNUtera でも良いが...


level 10

このP2Pサービスの性能を向上させる方法を提案し、実装して、評価せよ。

例えば、

    UDPを使えば速くなるのでないか? シーケンス番号による管理が必須となる
    サーバをマルチスレッド化する (下手にやると遅くなる)
    複数の通信をまとめて処理する
    Kernel のTCP実装を入れ換える (何種類か開発されているらしい)


level 11

P2Pプログラムを利用した新しいサービスを考え実装せよ。

WWWと連係するのはどうか? 音声は? dvsend などと連係する。何を送り、何を共有するべきだろうか?


まとめ

以下の点に考慮しつつ実験の評価を行う。


おまけ (Sun RPC)

RPC(Remote Procedure call 遠隔手続き呼び出し) は、分散システムを構築されるために最も良く利用されている通信プリミティブの一つである。たとえば Sun の NFS(Network File System)や NIS(Network Information Service)を始めとして、数多くの分散システムがRPCを利用して作られている。

/usr/open/lectures/slab/info3/2-rpcfs/sunrpc/demo/dirにあるプログラムを作成し、動作させてみる。Makefile などを読み、プログラムがどのように作成されるのかを理解する。実際にプログラムを作成し動作を確認すること。その際、BSD/OSだけでなく、Solaris などの異なるOS間での動作も確認すること。

x という拡張子がついているファイルがRPCのインタフェースの定義である。このファイルを修正して、プログラムに新しいRPCを追加してみよ。

/usr/open/lectures/slab/info3/2-rpcfs/sunrpc/doc などのマニュアルを読んで理解すること。 レポートに含める必要はない。

XDRの役割を理解し、その仕組みを理解すること。それをレポートに記述すること。


Shinji KONO / Tue May 21 14:34:29 2002