0

アプリケーションのサーバー クライアント アスペクトにどの手法を選択すればよいか悩んでいます。

デザインの定義

  • Windows、.net 2 上の C#
  • 多くのマシンには .net 2 サービスがあります。私はそれをクライアントと呼んでいます。
  • マシンは、インターネットに接続された (または接続されていない) NAT の背後にある異なるネットワークに存在する可能性があります。
  • サーバー サービスは公開されています。

要件

  • オンデマンドでクライアントと通信するため。
  • クライアントは着信接続をリッスンする必要があります。
  • サーバーはオンラインであってもオンラインでなくてもかまいません。
  • ポート転送はできません。

そのようなことをするための私の選択は何ですか?現在、UDP ホール パンチング テクニックを調べています。UDP ホール パンチング手法のセットアップと私のセットアップの違いは、NAT と仲介サーバーの背後に 2 つのクライアントを配置する代わりに、サーバーと通信する必要がある NAT の背後にあるクライアントのみを取得したことです。それは簡単に違いありませんが、理解して実装するのに苦労しています。私はこの種のNATトラバーサルで正しい道を進んでいますか、それとも実装がはるかに簡単な他の方法でしょうか?

私が考慮した他の方法:

  • サービスがサーバーがオンラインであることを確認すると、TCP を使用してサーバーへの接続を作成します。問題は、約 200 のクライアントがあり、その数が増加していることです。これがリソース キラーではないかと心配していました。

  • サービスがサーバーがオンラインであることを確認すると、コマンドのデータベース テーブルをチェックし、30 秒ごとに再度チェックします。これは、サーバーのリソース キラーでもあります。

要するに、UDP ホール パンチング手法がこのシナリオに適している場合は、NAT の背後にあるサービスで実行される UDPServer のコードのアイデアを提供してください。

ありがとうございました。

4

1 に答える 1

2

穴あけとp2p

UDP ホール パンチング の高レベルの議論に興味があるかもしれません。クライアント (どちらもファイアウォールの背後にある可能性があります) が中継サーバーなしで直接通信する場合は、ホール パンチングが必要です。これは、いくつのピア 2 ピア (p2p) 通信が機能するかです。

p2p では、通常、NAT されたクライアントは、何らかの外部サーバーを使用して、互いの「サーバー再帰アドレス」を判別する必要があります。NAT 変換が発生すると、ファイアウォールの背後にあるポートをパブリックへの任意のポートにマップできます。クライアントは、STUN サーバーを使用して、その「サーバー再帰アドレス」を判別できます。その後、クライアントは中間サーバーを介してサーバーの再帰アドレスを交換し、通信を開始できます (セッションを開始するためのホール パンチを使用)。

多くの場合、NAT は上記のような直接通信を許可するように動作しません。異なる宛先にパケットを送信すると、NAT は宛先に応じてポートをまったく異なる値にマップします。この場合、TURN サーバーが必要です。

リンク

サーバーとクライアントの通信

クライアントがサーバーとの通信のみを必要とする場合、ホール パンチは必要ありません。クライアントがパブリック インターネットと通信できる限り、任意の C# ソケット API (私は C# に詳しくありません) を使用して、サーバーのパブリック IP/ポートの組み合わせに接続できます。通常、ソケット接続を行うクライアントは送信元ポートを指定せず、実際には重要ではないため、基礎となるソケット API にその決定を任せます。

サーバーは特定のポートをリッスンする必要があり (この決定はユーザーが行います)、サーバーがクライアントからパケットを受信すると、パケットの送信元アドレスは NAT 処理されたアドレスになります。つまり、送信元アドレスは、クライアントが背後にあるファイアウォールのパブリック IP になります。NAT がクライアントのパケットの送信元ポートを変更した場合、サーバーはこの NAT されたポートを送信元ポートとして認識します。サーバーが応答パケットを送り返すと、クライアント マシンの NAT が宛先ポートを変換し (内部に変換を保存します)、パケットを正しいプライベート ホスト (クライアント) に正しく送り返すため、これは問題ではありません。

于 2012-07-26T16:35:05.720 に答える