次のマゾヒスティックな余暇プロジェクトでは、他のトラフィックが流れる UDP トンネルを使用して、基本的な匿名プロトコルを実装しようとしています。UDP を使用したいのは、スループットが高く、TCP over TCP で発生する可能性のあるタイムアウトのメルトダウンを防ぐためです。
匿名ネットワーク内の各ユーザーはノードになり、他のユーザーのトンネルの一部になります。各ノードは複数のトンネルを処理できる必要があるため、着信パケットと発信パケットを特定のトンネルに属するものとして識別できなければなりません。
実際のパケット データ (可能であればヘッダーまたは接続のみ) を確認する必要なく、パケットが属しているトンネルを特定する最良の方法は何ですか? UDP の接続指向バージョンはありますか?
私のUDPの理解はこれです-それはコネクションレスであり、パケットヘッダーは送信元/宛先アドレスと送信元が何であるかを示しているだけです。
この情報を利用する方法はいくつか考えられます。
- パケットの送信元ポートをスプーフィングして、IP アドレスに関連付けられた 16 ビットの接続 ID を保持します (したがって、各マシンでは、接続テーブルは送信元またはターゲットの IP + 接続 ID を連結したものになります。これには生のソケットをいじる必要があり、より少ない可能性がありますUDP パケットを構築し、反対側でそれらを検査するオーバーヘッドがどのようなものかはわかりません。
- 一意の接続 ID には UDP パケットの送信元ポートを使用しますが、ポート フィールドは 16 ビットであるため、グローバル ID には実際的ではありません。アプリケーションで任意のポートを使用できるようにし、単一のポートのみを必要とするようにしたいと考えています。
- UDP の上に構築された UDT のようなプロトコルを使用します。それでも高速 (UDP の速度の 1/4-1/3) であり、信頼性をチェックし、輻輳制御があり、接続があります。複雑に思えますが、独自の (オープン ソースの場合) ライブラリに依存する必要はありません。最終的には、これに加えてストリーム暗号化を行う必要があるため、さらに遅くなります。
(1) 最小限のオーバーヘッドが追加される場合、好ましいと思われます。単一の任意のポートのみを使用し、パケットが特定のトンネルの一部であることを識別する方法以外に、UDP の上に余分なものを持たないことを本当に望んでいます。
編集: オーバーヘッドを削減する 1 つの可能性は、UDP ソケットでリッスンし、生のソケットを介して送信することですが、それは主な問題には対処しません。
EDIT2: Skype や集中的にルーティングされる別のストリーミング サービスはどのように機能しますか? 彼らは独自のプロトコルを使用していますか?
EDIT3:Xaxxonの答えについて、匿名ネットワークをtunインターフェースを使用してユーザー空間プログラムに公開する予定です。これにより、ssh、ftp などのシステム上で必要なトラフィックを実行できるようになります。これらの上位層プロトコルに対応するパケット ヘッダーを台無しにしたくありません。