1 はじめに
TCP接続でトラブルシューティングする時、TCPの状態を把握することが必要になってきます。
ホストのネットワーク接続状態は、
Windows、Linuxとも”netstat”という名のコマンドで確認することができます。
本記事は、TCPのとり得る状態と、netstatコマンドの使い方について、
ある程度知っている方がリファレンスとして参照できることを目的にまとめたものです。
解説が目的ではありませんので、説明が少なく分り難くなっているかと思います。
2 TCPコネクションの状態
TCPでは接続ごとに、
それぞれシーケンス番号やACK番号、
オープン/クローズなどの処理状態といった「状態(State: ステート)」を持っています。
2.1 コネクションの確立と切断
2.1.1 コネクションの確立
TCPはコネクション型プロトコル(通信相手の応答があってはじめて通信を開始する)
であることから、データ転送を行う前にコネクションの確立を行います。
このTCPにおいて使用されるコネクションの確立のことを、3ウェイハンドシェイクといいます。
図2.1-1に示すように、 ”3回のやりとり”によってコネクションが確立します。
2.1.2 コネクションの切断
TCPの通信終了には、次の3つのパターンがあります。
・ FINによる通常切断
・ RSTによる強制切断
・ 通信の途絶による時間切れ(タイムアウト)
上記のうち、FINによる通常のコネクション切断の流れを 図2.1-2に示します。
2.2 TCPコネクションの状態遷移
2.1.1項、2.1.2項で示した状態、
およびESTABLISHED状態をまとめて
その遷移の様子を示すと、図2.2-1のようになります。
3 TCP通信の状態を調べる「netstat」コマンド
ホストのネットワーク接続状態は、
Windows、Linuxとも”netstat”という名のコマンドで確認することができます。
ホストが現在実行している接続一覧とその状態を確認できるほか、
ソケット/インターフェイスごとのIPや
TCP/UDP以下の各パケット統計やエラー状態なども調べらます。
3.1 Windowsのnetstat
図3.1-1に、Windowsの場合でのnetstatの実行例を示します。
図3.1-1の実行例は、オプションパラメーター無しで実行した場合のものです。
3.1.1 構文
3.1.2 パラメーター
3.2 Linuxのnetstat
図3.2-1に、Linuxの場合でのnetstatの実行例を示します。
図3.2-1の実行例は、オプションパラメーター無しで実行した場合のものです。
途中のSTREAMの表示をかなり省いています。
3.2.1 構文
Linuxのnetstatは、以下に示す構文をとります。
netstat [ address_family_options ][ --tcp | -t ][ --udp | -u ][ --raw | -w ][ --listening | -l ][ --all | -a ][ --numeric | -n ][ --numeric-hosts ] [ --numeric-ports ] [ --numeric-ports ][ --symbolic | -N ][ --extend | -e [ --extend | -e] ] [ --timers | -o ][ --program | -p ][ --verbose | -v ][ --continuous | -c]
netstat { --route | -r }[ address_family_options ][ --extend | -e [ --extend | -e] ] [ --verbose | -v ][ --numeric | -n ][ --numeric-hosts ] [ --numeric-ports ] [ --numeric-ports ][ --continuous | -c]
netstat { --interfaces | -i }[ iface ][ --all | -a ][ --extend | -e [ --extend | -e] ] [ --verbose | -v ][ --program | -p ][ --numeric | -n ][ --numeric-hosts ] [ --numeric-ports ] [ --numeric-ports ][ --continuous | -c]
netstat { --groups | -g }[ --numeric | -n ][ --numeric-hosts ] [ --numeric-ports ] [ --numeric-ports ][ --continuous | -c]
netstat { --masquerade | -M }[ --extend | -e ][ --numeric | -n ][ --numeric-hosts ] [ --numeric-ports ] [ --numeric-ports ][ --continuous | -c]
netstat { --statistics | -s }[ --tcp | -t ][ --udp | -u ][ --raw | -w ]
netstat { --version | -V }
netstat { --help | -h }
address_family_options :
[ --protocol= { inet , unix , ipx , ax25 , netrom , ddp }[, ...] ][ --unix | -x ] [ --inet | --ip ][ --ax25 ][ --ipx ] [ --netrom ][ --ddp ]
3.2.2 オプション
オプションを付けずに実行すると、netstatはオープンされているソケットの一覧を表示します。
アドレスファミリーが指定されていなければ、
設定されている全てのアドレスファミリーに関して、アクティブなソケットが表示されます。
TCPだけでなくUNIXソケットのローカル通信についても大量に表示されるなど、
あまり実用的ではありません。
情報を絞り込むためのいくつかの主要なオプションを表3.2-1に示します。
以上
HTMLだと、
思うように編集することは難しく、やろうすればとっても時間が掛かります。
ですので、本記事の元となっているWordで作成したPDFを
ページ最後に貼り付けました。
役に立てていただければ、うれしく思います。
このPDFファイルは、自由に配布されてもかまいません。
ただし、再配布の際には、
入手元と著者名は明らかにしてください。
なお、上のPDFファイルの内容、また本文中の記述に、
誤字や脱字、誤った内容の記述など見つかりましたら、
下に示すフォームでご連絡いただければ幸いです。