ある時、手持ちのMacからTIME_WAITが出てるか調べようと netstat
を叩いた所、想定していた挙動と全く違ったので、メモ代わりに書いておく。
何が違ったのか?
-p
オプションの挙動- TIME_WAITの扱い
-p
オプションの挙動
これは完全にLinuxとBSD系であるOSXの違いなんですが、 -p
の扱いが両者で全く違います。
完全にPIDと実行プログラム名が出ると思って -p
付けて叩いたら
ʕ ◔ϖ◔ʔ % netstat -anp (net-tools)-[master] netstat: option requires an argument -- p Usage: netstat [-AaLlnW] [-f address_family | -p protocol] netstat [-gilns] [-f address_family] netstat -i | -I interface [-w wait] [-abdgRtS] netstat -s [-s] [-f address_family | -p protocol] [-w wait] netstat -i | -I interface -s [-f address_family | -p protocol] netstat -m [-m] netstat -r [-Aaln] [-f address_family] netstat -rs [-s]
なんて出たもので。BSD系では -p
はプロトコル指定のオプションなんですね。
なので、実行プログラム名とか見たいって場合は netstat
よりも lsof
使った方がいいのかもしれません。
TIME_WAITの扱い
OS Xの場合、netstat
ではTIME_WAITが表示されません。
なので、確認したい場合は
ʕ ◔ϖ◔ʔ % sysctl net.inet.tcp.tw_pcbcount net.inet.tcp.tw_pcbcount: 0
を実行しましょう。
おわりに
OS XがTIME_WAITを頑なに隠してるのが謎・・・
どっかのファイルにTCPコネクションを吐いていてくれたら、なんとかツール組んで出来るんじゃないかなーと思ったり。
あと、調査する中で面白かったのはnetstatがアマチュア無線のパケット通信プロトコルであるAX25とかをサポートしてたりとか、謎な知識が知れたことですね。
今回、netstatのコードも読んだんですが一度読んでみると様々な発見があるのでお薦めです。