同時接続数について

■接続(セッション)状態とは?
 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 状態の数で確認いただけます。
   # netstat -anp | grep :9080 | grep ESTABLISHED | wc -l 
      (ポート番号 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
#!/bin/bash

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
#!/bin/bash

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