web-dev-qa-db-ja.com

netstat出力内でTCPサーバーとクライアントを区別する

クライアントプロセスとサーバープロセスの間にソケット接続があり、どちらも自分のマシンで実行されています。接続には、次のように2つのエントリが表示されます。

Sudo netstat -ntp | grep 56442
tcp        1      0 127.0.0.1:56442         127.0.0.1:8002          CLOSE_WAIT  8276/python
tcp        0      0 127.0.0.1:8002          127.0.0.1:56442         FIN_WAIT2   -

この場合、どのサーバーであるかをどのようにして知ることができますか?

TCPサーバーはポート8002で実行されており、クライアントはポート56442からリスニングサーバーに接続しています。

netstatの出力エントリを見て、サーバーとクライアントを区別する方法を見つけようとしています。

また、ソケットがFIN_WAIT2状態のときに、プロセスID /説明が表示されないのはなぜですか?

6
user93868

私は信じている netstat -ntpは、ローカルアドレス列にクライアント(非リスニング)ソケットのみを表示します。

-lフラグにより​​、netstatはサーバー(リスニング)ソケットのみをリストし、-a両方を取得する必要があります。そうすれば、[〜#〜] state [〜#〜]に基づいて区別できます。

0
PSkocik

netstatなしでgrepを実行すると、中央の左側の列に「Local Address」のような見出しがあり、中央の右側の列に「LocalAddress」のような見出しがあることがわかります。 「Foreign Address」のような見出し。サーバーのポート番号を含むローカルアドレスを示す行がサーバーです。

2つのクライアントプロセスを同時に開始してから実行すると、これをよりよく感じることができる場合があります。

Sudo netstat -ntp | grep -E "Address|8002"

また、ソケットがFIN_WAIT2状態のときに、プロセスID /説明が表示されないのはなぜですか?

おそらくプロセスが終了したためです。結局のところ、FINは「finish」または「final」を表します。 FINパケットとFIN_状態は、TCP接続のシャットダウン(クローズ)に関連しています。これは通常、プロセスが完了したときにのみ発生します(一方または両方の場合に自動的に発生します)。ソケットは、開いていたプロセスがなくなった後、しばらくの間システム内でハングアップする可能性があります。繰り返しになりますが、両方の場合にnetstatを実行すると、これをよりよく感じることができます。プロセスは正常に動作しており、シャットダウンするとプロセスがどのように変化するかを監視します。

1
Scott