WCFでは、 maxConcurrentSessionsのデフォルトは10であるため、サーバーが10を超えるTCP接続を開くことを制限します。
なんでそうなの?
「少数」(または2つ)のクライアントがあるが、クライアントにイベントを送信するために各クライアントに対してnetTcpBindingを開いたままにする必要があるサーバーに対して、非常に高い値に設定するだけで安全ですか?
WCFでは、 maxConcurrentSessionsのデフォルトは10であるため、サーバーが10を超えるTCP接続を開くことを制限します。
なんでそうなの?
「少数」(または2つ)のクライアントがあるが、クライアントにイベントを送信するために各クライアントに対してnetTcpBindingを開いたままにする必要があるサーバーに対して、非常に高い値に設定するだけで安全ですか?
インスタンスモードはセッションごとだと思います。必要に応じて、この値をInt32.Maxに設定できます。ただし、WCFスロットリングの概念を詳細に理解することは良いことです。
WCFチームはサービスを「デフォルトで安全」にすることを望んでいるため、DOS攻撃を防ぐために、この値は非常に低くなっています。
ここに良い読み物があります、ここでこのブログ投稿を見てください
これらの値は非常に低いことに注意してください...多くの人が望んでいるよりもはるかに低い値です。ここでのWCFチームの考えは、WCFを「デフォルトで安全」にし、サービスに対して開始されるDOS攻撃の変更を減らすことを望んでいたことです。そのアイデアは素晴らしいように聞こえるかもしれませんが、実際には大きな問題を引き起こします。
実際、セッションをサポートするWsHttpBindingのようなバインディングを使用している場合は、ほぼ確実にこれらの問題に遭遇しています。何故ですか?デフォルトのセッション数は10です。これは、最初は10人のユーザーが同時にサービスにアクセスできることを意味します。ただし、WCFセッションはWebセッションではありません。サーバーによって管理され、通常はhttp Cookieを使用して追跡されるWebセッションとは異なり、WCFセッションはクライアントプロキシによって開始され、タイムアウトするか、クライアントがセッションを放棄する明示的な要求を送信するまで終了しません。これが重要です。各プロキシインスタンスは独自のセッションを開始するため、一度にいくつかのリクエストを行うユーザーは、一度に複数のセッションを使用する可能性があります。今、あなたはあなたがそうしなければあなたは安全だと思っているかもしれません この種のことを行うマルチスレッドコードがあります...しかし、それは正確には真実ではありません。ユーザーは自分のセッションをキャンセルするためにサーバーに明示的な要求を行う必要があるため、誤ってセッションを開いたままにしておく可能性があります。ASMXサービスを使用している人は、プロキシオブジェクトを閉じる必要があることに気付かないことがよくあります。また、オブジェクトを閉じる必要があることを認識している少数の人は、オブジェクトを使い捨てオブジェクトのように扱うという間違いを犯すことがよくあります。セッションは開いたままになります。デフォルトのセッション制限は10であることに注意してください。これは、比較的短時間でWsHttpBindingを使用してサービスを10回呼び出すと、セッションが期限切れになるまでサービスをロックしてしまう可能性があることを意味します。ユーザーは自分のセッションをキャンセルするためにサーバーに明示的な要求を行う必要があるため、誤ってセッションを開いたままにしておく可能性があります。ASMXサービスを使用している人は、プロキシオブジェクトを閉じる必要があることに気付かないことがよくあります。また、オブジェクトを閉じる必要があることを認識している少数の人は、オブジェクトを使い捨てオブジェクトのように扱うという間違いを犯すことがよくあります。セッションは開いたままになります。デフォルトのセッション制限は10であることに注意してください。これは、比較的短時間でWsHttpBindingを使用してサービスを10回呼び出すと、セッションが期限切れになるまでサービスをロックしてしまう可能性があることを意味します。ユーザーは自分のセッションをキャンセルするためにサーバーに明示的な要求を行う必要があるため、誤ってセッションを開いたままにしておく可能性があります。ASMXサービスを使用している人は、プロキシオブジェクトを閉じる必要があることに気付かないことがよくあります。また、オブジェクトを閉じる必要があることを認識している少数の人は、オブジェクトを使い捨てオブジェクトのように扱うという間違いを犯すことがよくあります。セッションは開いたままになります。デフォルトのセッション制限は10であることに注意してください。これは、比較的短時間でWsHttpBindingを使用してサービスを10回呼び出すと、セッションが期限切れになるまでサービスをロックしてしまう可能性があることを意味します。ASMXサービスを使用している人は、プロキシオブジェクトを閉じる必要があることに気付かないことがよくあります。また、オブジェクトを閉じる必要があることを認識している少数の人は、オブジェクトを使い捨てオブジェクトのように扱うという間違いを犯すことがよくあります。セッションは開いたままになります。デフォルトのセッション制限は10であることに注意してください。これは、比較的短時間でWsHttpBindingを使用してサービスを10回呼び出すと、セッションが期限切れになるまでサービスをロックしてしまう可能性があることを意味します。ASMXサービスを使用している人は、プロキシオブジェクトを閉じる必要があることに気付かないことがよくあります。また、オブジェクトを閉じる必要があることを認識している少数の人は、オブジェクトを使い捨てオブジェクトのように扱うという間違いを犯すことがよくあります。セッションは開いたままになります。デフォルトのセッション制限は10であることに注意してください。これは、比較的短時間でWsHttpBindingを使用してサービスを10回呼び出すと、セッションが期限切れになるまでサービスをロックしてしまう可能性があることを意味します。
ここでWCFチームが下した決定は当惑する可能性があります。攻撃者がサービスに対してDOS攻撃を仕掛ける能力を制限しようとして、攻撃者はサービスに対してDOS攻撃を実行するのをはるかに簡単にしました。サーバーが応答できなくなるようにサーバーをリクエストで溢れさせるためのリソースはもう必要ありません。接続を明示的に要求せずに少数の呼び出しを行うだけで、セッション数を閉じて最大にすることができます。この値を極端に高く設定しないと、CPU使用率がゼロでチルアウトしているにもかかわらず、サーバーが着信接続の受け入れを拒否するリスクがあります。
サーバーにリクエストを処理するためのリソースがある限り、これをはるかに高く設定できます。これは、サービスに対するサービス拒否攻撃を簡単に打ち負かすため、デフォルトは10です。この単一のサービス専用の強力なサーバーがある場合は、必要に応じて10,000に設定できます。これに使用できるマジックナンバーはありません。一方の需要ともう一方のサーバーリソースのバランスをとる必要があり、この最大同時セッション数はメルトダウンを防ぐのに役立ちます。