35

C# で TCP ホール パンチング (NAT トラバーサル) を実行したいと考えています。必要に応じて、ランデブー サーバーで実行できます。http://sharpstunt.codeplex.com/を見つけましたが、これを機能させることができません。理想的には、ポート番号 (int) をパラメーターとして指定し、このメソッドへの呼び出し後に NAT で使用できる (「ポート転送」) メソッドが必要です。メソッドが単にポート番号を返し、それが NAT で利用可能になる場合も問題ありません。誰かがC#でこれをやったことがありますか? Sharpstunt などの実際の例を教えてください。

4

5 に答える 5

23

各ネットワーク シナリオでは、TCP ホール パンチングは UDP ホール パンチングと同様の方法で動作します。たとえば、2 つのピア A と B が異なる NAT の背後にある場合、各ピアの最初の SYN パケットが他のピアに送信されると、それぞれの NAT のパブリック アドレスに関連付けられた穴が開きます。B から A への最初の SYN パケットが B の NAT に到達する前に、A から B への最初の SYN パケットが B の NAT に到達した場合、B の NAT は A の SYN パケットを未承諾と見なし、ドロップします。ただし、その後、B の最初の SYN パケットは A の NAT を正常に通過できます。これは、A の NAT が B のパブリック アドレスを、A が開始した発信セッションの宛先として認識するためです。

あ、はい。TCPホールパンチが可能です。誰もがそうでないと考える理由がわかりません。

また、このタイプの動作を手動で作成することはできませんか? 必要な情報をすべて収集する手順が同じである限り、特定のプロトコルに依存する必要はありません。

一般に、TCP ホール パンチング (3.2.1) は次のように進行します。

クライアント:A、B サーバー:S

• A は、S との接続を使用して、S に B との接続を要求します。 • S は、B のプライベート アドレスとパブリック アドレスを A に返信し、同時に A のアドレスを B に送信します。

• A と B は、S への登録に使用したポートと同じポートから、互いのパブリック アドレスとプライベート アドレスに対して非同期的に発信接続を試みます (SYN パケットを送信します)。ローカル TCP ポート。

• A と B は、発信 SYN パケットに対する SYN-ACK 応答、または着信接続要求 (SYN パケット) を待ちます。接続が失敗した場合、ピアは最大タイムアウト期間まで接続を再試行できます。

• スリーウェイ ハンドシェイク プロセスが完了すると、ピアは相互に認証します。認証が失敗すると、ピアはその接続を閉じ、別の接続が正常に認証されるまで待機します。認証に成功した最初の接続は、TCP データの転送に使用されます。

(これはあまり答えではないことはわかっていますが、コメントするのに十分な余地がありませんでした)。

于 2011-06-04T19:52:25.210 に答える
2

完全な NAT トラバーサルで ICE/STUN/TURN を使用して P2P ストリーミングを行うIceLinkというライブラリをまとめました。STUN ベースのホール パンチングは、大多数のルーターがピア間の直接接続を確立するために機能し、そこにある「不良」ルーターの場合、接続は TURN ベースのリレーにフォールバックします。

于 2012-12-04T23:06:30.257 に答える
1

TCPとUDPが混同されているようです。TCPは接続指向のプロトコルであり、ファイアウォールとルーターによって簡単に理解でき、1つのイニシエーター(クライアント)と1つのリスナー(サーバー)が必要です。クライアントとサーバーの両方がファイアウォールまたはNATの背後にある場合、両方を何らかのプロキシサーバー(ファイアウォールではない)に接続しない限り、穴を開けることはできません。これに伴う問題は、プロキシがすべてのトラフィックの中継を担当することです。

あなたの質問から、UDPはステートレスであり、接続指向ではないという脂肪を利用するUDPホールパンチングにもっと興味があるようです。したがって、ほとんどの状態追跡ファイアウォールは、UDPデータフローについて「最良の推測」を行い、特定のポートを離れるトラフィックが同じポートで応答を受信し、それらを自動的にルーティングし直すと想定します。チャネル外の手段(データではなくアドレスを渡すだけのTCPサーバーなど)を使用して、両方のピアが同じポートで相互にデータを送信できる場合、それぞれのファイアウォール/NATルーターが穴を開けて許可します。のトラフィック。

それを行う方法に関しては、それはすべて、ピアのIPアドレスを相互に取得する方法によって異なります。取得したら、合意されたポートでUDPパケットの送信を開始し、応答を待ちます。

于 2010-07-08T18:09:42.373 に答える
1

http://sipsorcery.codeplex.comには、動作中のスタン サーバーがあります。

SipSorcery.core -> SipSorcery.Net -> Stun

于 2010-04-26T11:00:46.150 に答える