DP Reflector

DP Reflector とは、Internet 上のホスト同士の TCP/UDP 通信を中継するソフトウェアです (DP = Dual Protocol)。一つの DP Reflector につき 256 本のチャネルと1チャネルに付き 256 台までのクライアントをハンドル出来ます。同じチャネルに属するクライアント同士はユニキャスト、マルチキャスト、ブロードキャスト通信が可能です。

クライアントは性能、完全性や順序性をどの程度求めるのかによって、TCP または UDP どちらか好きなほうを選択出来ます。両方を同時に利用することも可能です。その場合、UDP で発信されたパケットは可能なかぎり UDP で、TCP で発信されたパケットは可能なかぎり TCP で送ろうとしますが、クライアントによって望みのプロトコルで送れない場合は自動的に他方を利用して送ろうとします。

プロトコル解説

パケットフォーマット

DP Reflector はパケットの先頭4+α octets をヘッダとして利用します。ヘッダの内訳は次の通りです。

コマンド

DP Reflector/DP Reflector Client に対するコマンドを表す数字です。現在は下記の5種類が定義されています。

Channel ID

参加するチャネルを表します。0〜255 です。

Source Client ID

このパケットを投げたクライアントの ID です。クライアントの ID は ENTRY 時に DP Reflector により採番されます。0〜255 です。

Target Client ID count

このパケットの送信先 Client ID の数です。0〜255 まで指定出来ます。0 を指定した場合はブロードキャストとなります。

Target Client ID list

このパケットの送信先 Client ID のリストです。(Target Client ID count) octets の長さとなります。

各コマンドについて

ENTRY コマンド

DP Reflector のあるチャネルを使いたい、と思ったクライアントは、まず最初に必ず ENTRY コマンドを DP Reflector に送信し、Client ID を採番してもらう必要があります。最低 ENTRY コマンド、参加したいチャネル ID を指定したパケットを送信してください。Source Client ID 以降は省略可能です (指定しても無視されます)。なお、UDP で ENTRY した場合は UDP で、TCP で ENTRY した場合は TCP で返事されます。ENTRY は大切なので、出来れば TCP の方が良いかもしれません。

ENTRY が受け付けられると、DP Reflector から新たに採番された正規の Source Client ID がセットされた形で ENTRY パケットが送り返されてきますので、それ以降その Client ID を利用出来ます。

ENTRY コマンドは何回でも発行出来、その度に新しい ID が採番されます。単一のクライアントで2つ以上の Client ID が使いたい場合は2回 ENTRY コマンドを投げてください。

採番されるクライアント ID は、そのチャネルでその時点で空いている ID のうち一番小さいものです。

SEND コマンド

メインで使われることになる、同じチャネルに参加しているクライアントにパケットを送信したい時に利用するコマンドです。送りたいチャネル ID と正しい Source Client ID、Target Client ID count (ブロードキャストの場合は 0) と Target Client ID リストをセットして、後続に好きなデータを置いてください。

なお、最大データサイズはネットワーク環境によりますが、UDP の場合普通の Internet 環境ではヘッダも含めて 1K 以下くらい、TCP の場合は (後で説明するストリームフォーマット上の制限から) 64K 以下に押さえる必要があります。

LIST コマンド

あるチャネルに参加しているクライアントのリストが欲しい時に利用するコマンドです。送りたいチャネル ID と正しい Source Client ID をセットして送信してください。Target Client ID count 以降は省略可能です。

リストは、ヘッダ内の Target Client ID count/list に埋め込まれた形で返送されます。

ADDRESS コマンド

ターゲットに指定したクライアント (複数可) の UDP ソースアドレス、ソースポートを得るコマンドです。データ部に、「クライアント ID (1 octet)」「IP アドレス (4 octets)」「ポート番号 (2 octets)」の順で並んだ形で返答されます。サーバがまだクライアントの UDP ネットワーク情報を知らない場合は無視されます。また存在しないクライアントに対する要求も無視されます。

EXIT コマンド

能動的にチャネルから抜けたい場合に指定します。Target Client ID count 以降は指定しなくても構いません。

パケットのカプセル化

DP Reflector - Client 間の通信に UDP を用いるか、TCP を用いるかによって、上記で説明したパケットをどうカプセル化するかが若干異なります。

UDP の場合

上記パケットがそのまま UDP データグラムに乗せられます。

TCP の場合

上記パケットは TCP ストリーム上を下記フォーマットでカプセル化されて送信されます。

まず 2 octets のパケット長が送られ、その直後にパケット本体が送信されます。パケット長は 2 octets なので必然的に 0〜65535 までとなり、最大パケット長は 64K になるわけです。なお、パケット長はネットワークバイトオーダ、つまりビッグエンディアンで送信されます。

タイムアウトについて

DP Reflector は、30 秒以上パケットを一つも送信してこなかったクライアントをチャネルから削除します。したがって通信を維持したいクライアントは、送信すべきデータが無い場合でも、30 秒に一度は必ず (例えば自分自身宛などでも) 何かパケットを送信するようにしてください。

セキュリティなど

DP Reflector 自身はそれなりに気をつかって書かれているのでそれほどの危険性はないと思いますが、DP Reflector プロトコル自体はなりすましや DoS などの攻撃に対して非常に脆弱です。それを十分考慮の上、利用するようにしてください。

アーカイブ

ソースコードアーカイブは下記です。