SO_PORT_SCALABILITY

SO_PORT_SCALABILITY ソケット オプションを使用すると、ソケットのローカル ポートのスケーラビリティを実現できます。

SO_PORT_SCALABILITY

0x3006

SO_PORT_SCALABILITY ソケット オプションを使用すると、ローカル コンピューター上の異なるローカル アドレス ポート ペアに対してワイルドカード ポートを複数回割り当てることで、ポート割り当てを最大化できるため、ローカル ポートのスケーラビリティを実現できます。

解説

注: SO_PORT_SCALABILITYとSO_REUSE_UNICASTPORTの両方がサポートされているプラットフォームでは、SO_REUSE_UNICASTPORTを使用することをお好みです。

プロキシ サーバー環境では、ローカル ポートの可用性が制限されているため、スケーラビリティの問題があります。 これを回避する方法の 1 つは、マシンに IP アドレスを追加することです。 ただし、既定では、 バインド 関数で使用されるワイルドカード ポートは、ローカル コンピューター上の IP アドレスの数に関係なく、ローカル コンピューター上の動的ポート範囲のサイズ (最大 64K ポート、通常は少ない) に制限されます。 これを回避するには、アプリケーションがポート予約またはヒューリスティックを使用して独自のポート プールを維持する必要があります。

スケーラビリティを必要とするすべてのアプリケーションが独自のポート プールを管理し、アプリケーションの互換性を維持しながらスケーラビリティを向上させるために、Windows Server 2008 では、ワイルドカード ポートの割り当てを最大化するために 、SO_PORT_SCALABILITY ソケット オプションが導入されました。 ポートの割り当ては、アプリケーションが一意のローカル アドレスとポート ペアごとにワイルドカード ポートを割り当てることで最大化されます。 そのため、ローカル コンピューターに 4 つの IP アドレスがある場合は、ワイルドカード バインド 関数要求によって最大 256 K のワイルドカード ポート (64 K ポート× 4 つの IP アドレス) を割り当てることができます。

ソケットで SO_PORT_SCALABILITY ソケット オプションが設定され、指定したアドレスとワイルドカード ポートに対して バインド 関数の呼び出しが行われた場合 ( name パラメーターが特定のアドレスとポート 0 で設定されている場合)、Winsock は指定したアドレスにポートを割り当てます。 この割り当ては、ローカル コンピューター上で使用可能なすべての IP アドレスとポート/アドレスごとに基づいて割り当てられます。 SO_PORT_SCALABILITY オプションを使用してワイルドカード ポートを取得した場合、SO_PORT_SCALABILITY オプションがないと、そのポートを別のソケットで割り当てることはできません。 ワイルドカード ローカル ポートを再利用できないアプリケーションとの下位互換性の問題を回避するために、この制限が適用されています。 これは、 SO_PORT_SCALABILITYを使用 して多数のポートを取得するアプリケーションが、ポートのレガシ アプリケーションを枯渇させる可能性があることを意味します。 SO_PORT_SCALABILITYを持つ少なくとも 1 つのアドレスに対して使用可能なすべてのエフェメラル ポートが取得されている場合、ソケット オプションなしではワイルドカード ポートの割り当てを行うことはできません。

効果を得るために、バインド関数を呼び出す前に、SO_PORT_SCALABILITY オプションを設定する必要があります。 2 つのアドレスを持つコンピューターでこれを使用する方法の例を次に示します。

  • ソケット関数は、 ソケット を作成するプロセスによって呼び出されます。
  • setsockopt 関数が呼び出され、新しく作成されたソケットで SO_PORT_SCALABILITY ソケット オプションが有効になります。
  • バインド関数は、ローカル コンピューターの IP アドレスとポート 0 のいずれかでバインドを実行するために呼び出されます。
  • その後、 connect 関数が呼び出され、リモート IP アドレスに接続されます。 ソケットは、必要に応じてアプリケーションによって使用されます。
  • ソケット関数は、2 番目の ソケット を作成するために、同じプロセス (場合によっては別のスレッド) によって呼び出されます。
  • setsockopt 関数が呼び出され、新しく作成された 2 番目のソケットで SO_PORT_SCALABILITY ソケット オプションが有効になります。
  • バインド関数は、ローカル コンピューターの 2 番目の IP アドレスとポート 0 で呼び出されます。 すべてのポートが以前に割り当てられている場合でも、この呼び出しは成功します。これは、ローカル コンピューターで使用可能な IP アドレスが複数あり、同じプロセスの両方のソケットで SO_PORT_SCALABILITY ソケット オプションが設定されているためです。
  • その後、 connect 関数が呼び出され、リモート IP アドレスに接続されます。 2 番目のソケットは、必要に応じてアプリケーションによって使用されます。

要件

要件
サポートされている最小のクライアント
サポートなし
サポートされている最小のサーバー
Windows Server 2008 [デスクトップ アプリのみ]
ヘッダー
Ws2def.h

関連項目

getsockopt

setsockopt

SOL_SOCKET ソケット オプション

ソケット オプション