Direct Connect

**Direct Connect**（**DC**）は、P2Pファイル共有の通信プロトコルである。Direct Connectのクライアントは中央のハブに接続し、互いに直接ファイルをダウンロードすることができる。Advanced Direct Connectは、しばしばこのプロトコルの後継と見なされている。

ハブには、接続されているクライアントまたはユーザーの一覧が表示される。ユーザーはファイルを検索し、他のクライアントからそれらをダウンロードすることができ、さらに他のユーザーとチャットを行うことも可能である。

## 歴史
NeoModusは、ジョン・ヘスが高校在学中の1999年11月に、アドウェア「Direct Connect」によって資金提供を受けて設立した会社である。

最初のサードパーティ製クライアントは「DClite」と呼ばれ、このプロトコルのファイル共有機能を完全にはサポートしていなかった。ヘスは、接続開始に単純な暗号鍵を必要とする新しいバージョンのDirect Connectを公開し、サードパーティクライアントを締め出した。この暗号鍵は解読され、DCliteの開発者はNeoModusの新しいソフトウェアと互換性を持つ新バージョンのDCliteを公開した。その後しばらくして、DCliteはOpen Direct Connectとして書き直され、MDIユーザインタフェースを持ち、ファイル共有プロトコル用のプラグインを使用する（MLDonkeyに類似）ことを目的とした。Open Direct Connectもまた、プロトコルのファイル共有機能を完全にはサポートしていなかったが、Javaへの移植版は完全なサポートを有していた。その後、DCTC（Direct Connect Text Client）やDC++といった他のクライアントが人気を博すようになった。

DCDevアーカイブには、2003年から2005年にかけてのDC開発におけるプロトコル変更に関する議論が収録されている。

## プロトコル
Direct Connect protocolはテキストベースのプロトコルであり、コマンドおよびその情報は平文で送信される。元のNeoModus製ソフトウェアには暗号化が存在しなかったが、プロトコル拡張として暗号化が利用可能である。クライアントは「ハブ」として機能する中央サーバに接続する。このハブはコンテンツの発見を提供し、クライアント同士が直接接続してコンテンツを転送するための交渉を可能にする。この中央ハブはメタデータのみを扱うため、コンテンツそのものを配信する場合と比べて必要な帯域幅ははるかに少ない。推定によれば、1000人のユーザーを処理するためには約2.5 Mbit/sの帯域幅が必要とされる。

このプロトコルには公式な仕様が存在しないため、（元のNeoModus製クライアントおよびハブを除く）すべてのクライアントおよびハブは情報をリバースエンジニアリングせざるを得なかった。そのため、本記事が参照するいかなるプロトコル仕様も不正確あるいは不完全である可能性が高い。

このプロトコルのクライアントサーバモデルでは、接続が確立される際にサーバが先に応答することが規定されている。たとえば、クライアントがハブのソケットに接続する際には、ハブが先にクライアントに応答する。

プロトコルにはクライアントやハブに対する既定の文字エンコーディングが規定されていない。元のクライアントおよびハブは、オペレーティングシステムのエンコーディングではなくASCIIエンコーディングを使用する。これにより、新しいソフトウェアではUTF-8エンコーディングへの移行が可能となっている。

ポート411はハブの既定ポートであり、412はクライアント間の接続に用いられる。これらのポートのいずれかがすでに使用中である場合、空いているポート番号が見つかるまで番号が増加される。たとえば、411、412、413が使用中であれば、ポート414が使用される。

ハブのアドレスは「dchub://example.com[:411]」の形式であり、411は任意のポート番号である。

グローバルな識別スキームは存在せず、ユーザーはハブごとにニックネームで識別される。

クライアント間の接続要求は、実際の接続と結びつけることができない。

検索結果は、特定の検索クエリと結びつけることができない。

ユーザーをキックしたり別のハブへ移動（リダイレクト）させたりする機能はプロトコルによってサポートされている。ユーザーがキックされる場合、ハブはそのユーザーに特定の理由を提示する義務はなく、ユーザーがリダイレクトされる先にも制限は存在しない。ただし、権限を持つ他のクライアントがハブにキックを命令する場合、そのクライアントは事前に通知メッセージを送信することがある。ユーザーをリダイレクトする際には、理由を添える必要がある。HTTPリファラに相当するものは存在しない。

ハブはクライアントに対してユーザーコマンドを送信することができる。これらのコマンドは純粋にプロトコル上のコマンドであり、主に特定の作業を簡便に行うために用いられる。たとえば、ハブはユーザーの既定ブラウザを開いてウェブサイトを訪問させるようなコマンドを送信することはできないが、「+rules」（「+」はコマンドであることをハブに示す。この記号は実装により異なる場合がある）といったコマンドを追加してハブのルールを表示させることは可能である。

プロトコルのPeer to Peer部分は「スロット」の概念に基づいている（求人における空きポジション数のようなもの）。これらのスロットは、任意の時点でユーザーからダウンロード可能な人数を示しており、クライアントによって制御される。

クライアント間の接続では、双方がランダムな数値を生成して、どちらが先にダウンロードを行うかを決定し、大きい数値を持つクライアントが優先される。

ダウンロードの転送およびハブへの接続にはTCPが用いられ、アクティブな検索にはUDPが使用される。

ユーザーが存在できるモードには「アクティブモード」と「パッシブモード」の2種類がある。アクティブモードのクライアントはネットワーク上の誰からでもダウンロード可能である一方、パッシブモードのユーザーはアクティブユーザーからしかダウンロードできない。NeoModus Direct Connectでは、パッシブモードのユーザーも他のパッシブモードユーザーの検索結果を受け取るが、ダウンロードは不可能である。「DC++」では、これらの検索結果すら受け取らない。NeoModus Direct Connectでは、検索クエリごとに最大5件の検索結果が全ユーザーに送信される。ユーザーが検索を行った場合、「DC++」ではアクティブモード時に10件、パッシブモード時には5件の検索結果が返される。パッシブクライアントには検索結果がハブ経由で送信され、アクティブクライアントには結果が直接送られる。

プロトコルの区切り文字には「$」、「|」、およびがある。これら（およびその他少数）のためにプロトコルにはエスケープシーケンスが定義されており、多くのソフトウェアはログイン（Lock to Key）シーケンスでそれを正しく使用している。何らかの理由で「DC++」の開発者はこのエスケープシーケンスを無視し、これらの文字をユーザーに表示する際にはHTMLの代替表現を使用している。

評価機能や言語パックといった機能に対する関心は依然として存在する。「DC++」の開発者らは、Direct Connectを完全に置き換えるプロトコルであるADC（非公式にはAdvanced Direct Connect）を提案している。ADCは元のプロトコルと同じネットワーク・トポロジー、概念、および用語を使用している。

オリジナルのプロトコルと比較して追加された機能の一例としては、共有ファイルのTiger Treeハッシュのブロードキャストがある。これにより、ファイルが正確にダウンロードされたかの検証が可能となり、ファイル名に依存せずにファイルを検索できるようになる。

## DDoS攻撃に利用されたDirect Connect
このプロトコルではハブが他のハブへユーザーをリダイレクトできるため、悪意のあるハブがユーザーを正規のDirect Connectハブ以外の場所にリダイレクトし、事実上のDDoS攻撃を引き起こすことがあった。これらのハブはクライアント間接続におけるIPアドレスを改変し、標的となる被害者を指すようにすることがあった。

CTM Exploitは2006年から2007年にかけて表面化し、この期間中にDirect Connectネットワーク全体がDDoS攻撃にさらされた。この状況を受けて、開発者たちはセキュリティ問題により真剣に取り組むようになった。

2009年2月の時点で、攻撃を受けた側が接続してきたユーザーを送信したハブを特定できるようクライアント向けの拡張機能が提案された。

## Direct Connect Network Foundation
Direct Connect Network Foundation（DCNF）は、非営利団体であり、ネットワーク内のソフトウェア、プロトコルおよびその他のサービスの改善を通じてDCネットワークの向上を目的としている。

DCNFは、DCに関連する記事、論文およびその他の文書のリストを管理している。

## 関連項目
*ファイル共有ソフト
*:en:Comparison of Direct Connect software

## 脚注

## 外部リンク
* NMDC Protocol Wiki (Mirror) 
* NMDC Protocol Document
* NMDC Protocol