2

最近の一連の質問で、UDP、boost::asio、および c++ 全般について多くの質問をしました。

ここ Stackoverflow では答えがないように見える私の最新の質問は次のとおりです。

クライアント/サーバー アプリケーションでは、メッセージが許可されるように、サーバーが任意のファイアウォールでポートを開くことを要求してもまったく問題ありません。ただし、クライアントに対して同じことを行うことは、間違いなく優れたユーザー エクスペリエンスではありません。

通常、TCP 接続はこれを実現します。これは、ほとんどのルーターがステートフル パケット インスペクションをサポートし、元の要求がローカル ホストから発信された場合に応答パケットを通過できるようにするためです。

UDPはステートレスであり、(私の知る限り)「応答パケット」などがないため、これがUDPでどのように機能するかははっきりしていません。クライアント アプリケーションでこれをどのように説明する必要がありますか?

回答ありがとうございます。

4

1 に答える 1

8

UDP自体はステートレスですが、ファイアウォールは通常ステートレスではありません。UDPの規則では、要求がからclient:port_Aに送信されるとserver:port_B、応答はからserver:port_Bに返されclient:port_Aます。

ファイアウォールはこれを利用できます。クライアントからUDP要求が送信されるのを検出すると、状態テーブルにエントリを追加して、応答を認識させ、応答を許可します。UDPはステートレスであり、接続の終了を示さないため、ファイアウォールは応答を許可します。通常、タイムアウトを実装します。そのUDPアドレスペア間で一定時間トラフィックが発生しない場合、ファイアウォールの状態テーブルの関連付けは削除されます。

つまり、クライアントアプリケーションでこれを利用するには、サーバーがリクエストの受信に使用するのと同じポートから応答を返送するようにするだけです。

于 2011-02-03T01:28:34.470 に答える