■接続(セッション)状態とは?
STATEが「ESTABLISHED」であること。
「接続が確立した」という説明だけだと分かりにくいが、
「TIME WAIT」等の「CLOSE」に至る直前まで含める必要は無い。
RFC: 793
http://www.atmarkit.co.jp/fwin2k/network/baswinlan016/rfc793.txt
$ w3m -dump http://www.atmarkit.co.jp/fwin2k/network/baswinlan016/rfc793.txt | grep -A 58 'Page 22'
[Page 22]
September 1981
Transmission Control Protocol
Functional Specification
+---------+ ---------\ active OPEN
| CLOSED | \ -----------
+---------+<---------\ \ create TCB
| ^ \ \ snd SYN
passive OPEN | | CLOSE \ \
------------ | | ---------- \ \
create TCB | | delete TCB \ \
V | \ \
+---------+ CLOSE | \
| LISTEN | ---------- | |
+---------+ delete TCB | |
rcv SYN | | SEND | |
----------- | | ------- | V
+---------+ snd SYN,ACK / \ snd SYN +---------+
| |<----------------- ------------------>| |
| SYN | rcv SYN | SYN |
| RCVD |<-----------------------------------------------| SENT |
| | snd ACK | |
| |------------------ -------------------| |
+---------+ rcv ACK of SYN \ / rcv SYN,ACK +---------+
| -------------- | | -----------
| x | | snd ACK
| V V
| CLOSE +---------+
| ------- | ESTAB |
| snd FIN +---------+
| CLOSE | | rcv FIN
V ------- | | -------
+---------+ snd FIN / \ snd ACK +---------+
| FIN |<----------------- ------------------>| CLOSE |
| WAIT-1 |------------------ | WAIT |
+---------+ rcv FIN \ +---------+
| rcv ACK of FIN ------- | CLOSE |
| -------------- snd ACK | ------- |
V x V snd FIN V
+---------+ +---------+ +---------+
|FINWAIT-2| | CLOSING | | LAST-ACK|
+---------+ +---------+ +---------+
| rcv ACK of FIN | rcv ACK of FIN |
| rcv FIN -------------- | Timeout=2MSL -------------- |
| ------- x V ------------ x V
\ snd ACK +---------+delete TCB +---------+
------------------------>|TIME WAIT|------------------>| CLOSED |
+---------+ +---------+
TCP Connection State Diagram
Figure 6.
■上記から「現在利用中の接続数」を「同時接続数」と考えることができる。
参考:F-Secure アンチウィルスLinux ゲートウェイ
http://www2.f-secure.co.jp/download/trial/linuxgw/linuxgw.pdf
クライアントの同時接続数が、設定した "最大同時接続数" に達した場合に記録されます。...
また、現在利用中の接続数については、以下のように netstat コマンドで該当ポート番号が
ESTABLISH 状態の数で確認いただけます。
(ポート番号 9080 の場合)
■上記を元にユーザ権限でチェックするワンライナー。
$ MYDATE=`date '+%Y/%m/%d,%H:%M:%S'`; \
netstat -an | \
grep "ESTABLISHED" | \
grep "8080" | \
echo "${MYDATE},`wc -l`"
2012/11/02,17:01:03,8
■ユーザ権限でのスクリプト化。
$ cat established_check.sh
if [ "$#" -lt 1 ] ;then
CHKPORT=8080
else
CHKPORT=`echo $1 | awk '{print $1%65536}'`
fi
if [ "$CHKPORT" -eq "0" ];then
echo 'Usage: ./'$0' [1-65535]'
exit 1
fi
MYDATE=`date '+%Y/%m/%d,%H:%M:%S'`
netstat -an | \
grep "ESTABLISHED" | \
echo "${MYDATE},${CHKPORT},`wc -l`"
unset MYDATE CHKPORT
exit 0
$ ./established_check.sh
2012/11/02,17:16:46,8080,12
■root権限でも使えるように修正。
※ポートがroot権限でしか見れない場合に必要。
$ cat established_check.sh
if [ "`id -u`" -ne "0" ];then
MYOPT='-an'
else
MYOPT='-anp'
fi
if [ "$#" -lt 1 ] ;then
CHKPORT=8080
else
CHKPORT=`echo $1 | awk '{print $1%65536}'`
fi
if [ "$CHKPORT" -eq "0" ];then
echo 'Usage: ./'$0' [1-65535]'
exit 1
fi
MYDATE=`date '+%Y/%m/%d,%H:%M:%S'`
netstat $MYOPT | \
grep "ESTABLISHED" | \
echo "${MYDATE},${CHKPORT},`wc -l`"
unset MYDATE CHKPORT MYOPT
exit 0
$ ./established_check.sh
2012/11/02,17:24:05,8080,10
$ sudo ./established_check.sh
2012/11/02,17:24:12,8080,8
■Windowsの場合
面倒なので、条件分岐はしませんし、
tempファイルもチェックしません。
変数「CHKPORT」を適当に書き換えてください。
> netstat -an | find /c "ESTABLISHED"
10
@echo off
> type established_check.bat
@echo off
Set CHKPORT=8080
Set FILE=established_check.tmp
netstat -an > %FILE%
for /f %%A in ('find /c "ESTABLISHED" ^< %FILE%') do set CNT=%%A
echo %date%,%time:~0,8%,%CHKPORT%,%CNT%
DEL %FILE%
> established_check.bat
2012/11/02,17:51:25,8080,12
□追記。
上記は全ポートの同時接続数になっていたので、以下で修正しています。
同時接続数を見る別の方法と修正版
http://d.hatena.ne.jp/labunix/20121104
説明は不要であれば、githubにあります。
https://github.com/labunix/established_check