STCPでは、複数のプロセスが同じポート番号をリッスンしている場合、接続が要求されたときに、そのポート番号にバインドした最初のプロセスにのみ通知されます。この制限を回避する一般的な方法としては、接続が完了したらリスニングソケットを閉じて、新しいソケットを作成してバインドして再度リスニングする方法があります。これにより、リスニングソケットはリスニングソケットのチェーンの最後に配置されます。
17.1以降、この手順はデフォルトのSTCPパラメータ値を変更しないと動作しなくなります。
17.1以前のバージョンでは、STCPはソケットオプションSO_REUSEADDRの意図を誤解していた。このオプションの意図は、ポートXをリッスンしているプロセスが終了し、システムがTIME_WAIT状態でポートXにバインドされているソケットが残っている場合、直ちに再起動できるようにすることでした。しかし、STCPの以前のリリースでは、SO_REUSEADDRソケットオプションが設定されている場合、ポートXにバインドされている既存のソケットの状態に関係なく、プロセスがポートXをリッスンできるようになっていました。この動作により、2つの異なるアプリケーションが同じポート番号をリッスンすることができます。最初のアプリケーションがポートリサイクル手順を使用するか、プロセスが終了して再起動された場合、2番目のアプリケーションがポートをハイジャックすることになります。
リリース 17.1 より、 bind 関数は、要求されたポートにバインドされたすべてのソケットが TIME_WAIT 状態になっているか、2 番目のプロセスが 1 番目のプロセスと同じセッション ID を持っていない限り、エラー EADDRINUSE を返します。同じ親プロセスから開始されたすべてのプロセスは同じセッションIDを持っているので、1つのプロセスが複数の子プロセスをフォークし、それらすべての子プロセスがポートXでリスンすることができます。
リリース17.1では、STCPの動作を17.1以前の動作に戻すために使用できる2つのSTCPパラメータが追加されました。それぞれのパラメータには、「safe」(デフォルト)と「unsafe」という値があります。unsafeという用語が使われているのは、この設定が上記のポートハイジャックを許すからです。
analyze_systemリクエストのlist_stcp_paramsを使用して、これら2つのパラメータの現在の設定を表示し(図1)、set_stcp_paramを使用して設定を変更することができます(図2)。すべてのSTCPパラメータと同様に、変更はシステムが再起動されるまでしか有効ではないので、変更を恒久的なものにするには、パラメータをunsafeに設定するコマンドをmodule_start.cmファイルかstart_stcp.cmファイルに記述しなければなりません。
analyze_system -request_line 'list_stcp_params tcp_reuseaddr_action' -quit
OpenVOS Release 17.1.0ab, analyze_system Release 17.1.0ab
現在のプロセスは481、ptep 89B6B740、Noah_Davids.CACです。
TCP SO_REUSEADDR アクション [安全/不安全] (tcp_reuseaddr_action) safe
用意ができました 17:10:29
analyze_system -request_line 'list_stcp_params udp_reuseaddr_action' -quit
OpenVOS Release 17.1.0ab, analyze_system Release 17.1.0ab
現在のプロセスは481、ptep 89B6B740、Noah_Davids.CACです。
UDP SO_REUSEADDR アクション [安全/不安全] (udp_reuseaddr_action) safe
用意ができました 17:11:16
|
図1 - 2つのreuseaddrアクションパラメータの表示 |
analyze_system -request_line 'set_stcp_param tcp_reuseaddr_action unsafe' -quit
OpenVOS Release 17.1.0ab, analyze_system Release 17.1.0ab
現在のプロセスは481、ptep 89B6B740、Noah_Davids.CACです。
TCP SO_REUSEADDRアクションの変更(tcp_reuseaddr_action)
危なげないところから危なげないところへ
用意ができました 07:30:38
|
図2 tcp_reuseaddr_actionを安全でないものに変更するコマンド |