いつポートの使用を検討する必要がありますか?

いつポートの使用を検討する必要がありますか?

プロセスの再起動時に使用中のポートをバインドできないというメッセージが表示されました。いつポートの使用を検討すべきか疑問に思います。

「LISTEN」モードでのみ表示されますか?ポートによって開かれた接続がTIME_WAIT状態(またはTCPの他の状態)の場合でもこれは可能ですか?有限状態マシン)?

tcp        0      0 127.0.0.1:7199              0.0.0.0:*                   LISTEN      30099/java
tcp        0      0 192.168.1.2:9160          0.0.0.0:*                   LISTEN      30099/java
tcp        0      0 192.168.1.2:58263         192.168.1.2:9042          TIME_WAIT   -
tcp        0      0 192.168.1.2:58262         192.168.1.2:9042          TIME_WAIT   -
tcp        0      0 ::ffff:192.168.1.2:9042   :::*                        LISTEN      30099/java
tcp        0      0 ::ffff:192.168.1.2:9042   ::ffff:192.168.1.2:57191  ESTABLISHED 30099/java
tcp        0      0 ::ffff:192.168.1.2:9042   ::ffff:192.168.1.2:57190  ESTABLISHED 30099/java
tcp        0      0 ::ffff:192.168.1.2:9042   ::ffff:10.176.70.226:37105  ESTABLISHED 30099/java
tcp        0      0 ::ffff:127.0.0.1:42562      ::ffff:127.0.0.1:7199       TIME_WAIT   -
tcp        0      0 ::ffff:192.168.1.2:57190  ::ffff:192.168.1.2:9042   ESTABLISHED 30138/java
tcp        0      0 ::ffff:192.168.1.2:57198  ::ffff:192.168.1.2:9042   ESTABLISHED 30138/java
tcp        0      0 ::ffff:192.168.1.2:9042   ::ffff:10.176.70.226:37106  ESTABLISHED 30099/java
tcp        0      0 ::ffff:192.168.1.2:57197  ::ffff:192.168.1.2:9042   ESTABLISHED 30138/java
tcp        0      0 ::ffff:192.168.1.2:57191  ::ffff:192.168.1.2:9042   ESTABLISHED 30138/java
tcp        0      0 ::ffff:192.168.1.2:9042   ::ffff:192.168.1.2:57198  ESTABLISHED 30099/java
tcp        0      0 ::ffff:192.168.1.2:9042   ::ffff:192.168.1.2:57197  ESTABLISHED 30099/java
tcp        0      0 ::ffff:127.0.0.1:42567      ::ffff:127.0.0.1:7199       TIME_WAIT   -

プロセスはJMXポートを公開するJavaプロセスです。また、情報を取得するためにこのポートに要求を送信する監視エージェントもあります。再起動時に(停止後および開始前)、ポートが使用可能であることを確認して、ポートバインディングの問題が発生しないようにしたいと思います。そのポートで保留中のTIME_WAIT接続が使用中のポートであると見なされると、プロセスが開始される前にこれらのTIME_WAIT状態がクリアされるように停止と開始の間に待機時間が追加されます。他のより良いオプションがなければ。

ありがとう

ベストアンサー1

ポートは、バインドされたソケットがある限り「使用中」と見なされます。 LISTEN状態である必要はなく、バインディングするだけです。したがって、見えるTIME_WAITソケットが機能します。

ソケットがアドレスにバインドされている場合、状況はもう少し複雑になります。そしてポート。異なるアドレスにバインドされている場合は、異なるソケットを同じポートにバインドすることができます。ただし、ソケットがそのポートのワイルドカードアドレス(INADDR_ANYnetstatで示される*)にバインドされている場合、他のソケットはそのポートにバインドされません。どのアドレスと同じポートです。

通常、リスニングソケットを使用するほとんどのソフトウェアは、これらのソケットにSO_REUSEADDRソケットオプションを設定します。このオプションはルールを緩和します。オプションを設定すると、一度だけ制限されます。そしてソケットを受信すると、他のソケットが同じアドレスにバインドされるのを防ぎます。これは、遅延TIME_WAITと追加のソケットがソフトウェアを再起動し、同じポートにすぐにリバインドするのを妨げないことを意味します。

JavaプログラムはSO_REUSEADDRソケットを設定しない可能性が高いですが、設定する必要があります。

おすすめ記事