3 Minutes NetWorking
No.45

3Minutes NetWorking

第45回レイヤ4 netstat

■ netstat

インター博士

さてネット君。
ここ数回分をまとめてみよう。

ネット助手

はい。

インター博士

まず。
ネット君が脇役キャラであることが証明されたわけだ。

ネット助手

ななな、なんですか。
それはもういいんですって。

インター博士

なんだ、いいのか。
そうだな。確かに脇役キャラの人生などどうでもいいかもしれん。

ネット助手

うううぅ。
そうあらかさまにはっきり言われると、ちょっと……。

インター博士

ともかくだ。TCPやUDPの動きを実際に見てみよう、という話だ。

ネット助手

実際にみることができるんですか?

インター博士

うむ。
netstatという非常に便利なコマンドを使う。

ネット助手

ねっとすたっと?

インター博士

まぁ、「酒は百薬の長」というくらいだから、とにかくまず見てもらおう。

ネット助手

…。
それは「百聞は一見にしかず」では?

  • c:\> netstat -a -n
インター博士

コマンドプロンプトで上のコマンドを入力してくれたまえ。
あぁ、ちなみにWidowsでのコマンドだ。UNIXでも同じnetstatコマンドは存在するがオプションがちょっと違う。

ネット助手

オプション…。
後ろの、-a や -n ですね。

インター博士

うむ。
コマンドを実行すると、以下のような表示が出てくると思う。

netstat画面

[Figure45-01:netstat画面]

ネット助手

わわわ。
なんかやけに長いですよ?

インター博士

うむ。-a オプションですべての接続を表示してるからな。
さて、まず見るべきポイントは一番右の「state」だ。

netstat画面 state

[Figure45-02:netstat画面 state]

ネット助手

state、すてーと?
「LISTENING」「TIME_WAIT」「CLOSE_WAIT」「FIN_WAIT2」「ESTABLISHED」……何か見覚えがあるような…。

インター博士

ふむ。
相変わらず記憶力が意志薄弱だな

ネット助手

う…、それは新しい表現ですね。
記憶力が意志薄弱ってどんなんですか。

インター博士

語感的にあってるだろう。
ともかく第39回を思い出せ。これだ。

3Way HandShake

[Figure39-03:3Way HandShake]

コネクションの切断

[Figure39-05:コネクション切断]

ネット助手

すりーうぇいはんどしぇいく………。
あぁ、TCPの接続状態だ。

インター博士

そうだ。stateTCPの接続状態が表示される。
つまり、Local AddressとForeign Address間のコネクションの状態だ。

ネット助手

ははぁ。
ってことは、一番上の表示は0.0.0.0:21と0.0.0.0間のコネクション?

■ LISTENING

インター博士

まぁ、そう先走るな。順に見ていこう。
一番上には「LISTENING」状態のものがくる。

netstat画面 LISTENING

[Figure45-03:netstat画面 LISTENING]

インター博士

これは、ポートが開いているという状態だな。
外部からの接続待ち状態という意味だ。

ネット助手

外部からの接続待ち?

インター博士

そうだ。
外部にサービスを提供するサーバアプリケーションは、事前にソケットを確立しポートを開けておく必要がある。

ネット助手

うぅ?

インター博士

第43回でやったように、ポート番号が違うと相手のアプリケーションにデータが届かない

受け取るアプリケーション

[Figure43-08:受け取るアプリケーション]

インター博士

なので、サービスを提供したい場合、ソケットを確立してLISTENING状態にしておく必要があるのだよ。

ネット助手

ということは、サービスを提供するサーバアプリケーションは自動的にソケットを確立するってことですか?

インター博士

そういうことだ。
もう一度先ほどのnetstat画面を見てみよう。

netstat画面 LISTENING FTP

[Figure45-04:netstat画面 LISTENING FTP]

ネット助手

え〜。
Local Address0.0.0.0の21番ポートLISTENING状態ですけど。

インター博士

うむ。
つまり、このマシンはFTPサービスを開始しているってことだな。

ネット助手

0.0.0.0の意味は?

インター博士

Local Addressの0.0.0.0は、そのマシンが持つすべてのインタフェースでという意味。
Foreign Addressの0.0.0.0は「誰か」、不特定という意味だ。

ネット助手

ははぁ。つまり。「0.0.0.0:21 0.0.0.0 LISTENING」は。
「自分の持つすべてのインタフェースで、誰かと接続状態でFTPサービスを提供している」という意味ですか。

インター博士

TCPは接続状態を示さなければならないから「誰かと接続状態」という表記になるが、実際は誰とも接続していない待ち受け状態だがな。
マシンによっては、

netstat画面 LISTENING 特定インタフェース

[Figure45-05:netstat画面 LISTENING 特定インタフェース]

インター博士

上のように、特定のIPアドレス(を持つインタフェース)のみサービスを提供しているという場合もある。

ネット助手

なるほど。
netstatで、自分がどのサービスを提供しているかがわかるんですね。

■ ESTABLISHED

インター博士

さて、LISTENINGの下の方には、「TIME_WAIT」「CLOSE_WAIT」「FIN_WAIT2」「ESTABLISHED」などの状態があると思う。

ネット助手

「ESTABLISHED」は接続中
「TIME_WAIT」「CLOSE_WAIT」「FIN_WAIT2」は切断待ち中ですよね。

netstat画面 接続・切断

[Figure45-06:netstat画面 接続・切断] 

インター博士

そういうことだ。
例えば、3行目を例にあげてみよう。

ESTABLISHED

[Figure45-07:ESTABLISHED]

インター博士

192.168.0.2の2218番ポートに接続しているアプリケーションと、61.193.0.66の80番ポートに接続しているアプリケーションが接続中、という意味だ。

ネット助手

80番ポートっていうと、HTTPですよね。
Webサイトを見ているってことですか?

インター博士

そうだ。実際はブラウザとWebサーバアプリケーションが接続して、HTMLファイルや画像をやりとりしている、という意味になる。

ネット助手

なるほど。
すぐ下の同じサーバとの接続が、「TIME_WAIT」になってますけど。

インター博士

うむ。つまりデータのやりとりは終了して、切断待ちってことだな。
HTTPはわりとあっさりと終わるからな。

ネット助手

ふむふむ。
1行目と2行目はForeign Addressのポート番号は110ですけど、これは?

インター博士

110はPOP3、POP3はメールサーバアプリケーションだから、つまりメールのチェック中ということだな。
今度は逆に、外部からアクセスされている状態をみてもらおう。

netstat画面 外部からアクセス

[Figure45-08:netstat画面 外部からアクセス]

インター博士

どこからアクセスされているかは隠させてもらったが。
このマシンの192.168.0.2の80番ポートのアプリケーションに、何処かの1588番ポートのアプリケーションからアクセスされて、接続されている状態だ。

ネット助手

え〜っと。
自分が他のサーバにアクセスされているのと見た目変わらないんですけど。

インター博士

そうだな。自分が他にアクセスしているから接続中(切断中)なのか、他からアクセスされているから接続中なのかは、ポート番号から想像するしかないな。
一般的には、ウェルノウンポートの側がサーバだけどな。

ネット助手

うぇるのうんぽーと。
1〜1023番のポートですよね。

■ UDP

インター博士

さて、ESTABLISHEDやTIME_OUTの下の方には、UDPの状況が表示されているはずだ。

netstat画面 UDP

[Figure45-09:netstat画面 UDP] 

ネット助手

あれ? Foriegn Addressがないですよ?
* : * になってる。

インター博士

それは当たり前だ、ネット君。
UDPはコネクションレスのプロトコルだからな。

ネット助手

こねくしょんれす…。
「送りっぱなし」でしたっけ。

インター博士

うむ。そんなコネクションレスプロトコルに、「接続状態」などあるわけなかろう。
なので、netstatでUDPはサービスの待ちうけ状態が表示される

ネット助手

ははぁ。
でも、こちらからサーバにアクセスする場合は?

インター博士

だから、コネクションレスだ、と言っているだろう。
わざわざコネクションをとらないのに、送った時の道をいつまでも開けておく必要はないだろう。

[Figure45-10:UDPのポート開閉]

ネット助手

返事が必要なプロトコルってなんです?

インター博士

DNSのDNS要求や、DHCPのDISCOVER、REQUESTなどだな。
返事が返ってくるのにポートを閉じてしまったらデータは受け取れないからな。

ネット助手

ふ〜ん。
ということは、そのちょうど返事待ちのタイミングでnetstatを実行すれば、ポートが開いているところが見えるわけですね。

インター博士

まぁ、理論的にはそうだ。だがUDPは非常に高速なので、そのタイミングで実行するのはかなり難しいがな。
それに実際見えたとしても、「0.0.0.0:1520 * : *」となっていて普通とかわらないが。

ネット助手

なんだ、そうなんですか。

インター博士

ともかく、netstatでわかるUDPの状態は、現在開いているポートだけで、どこからアクセスにきてるか、どこに接続しているかはわからない。

ネット助手

送りっぱなし、ですものね。

■ 統計情報

インター博士

さて、このnetstat -a現在の接続・ポートの状態がわかるが、netstatには他の役割もある

ネット助手

へへぇ、まだあるんですか。

  • c:\> netstat -s

netstat画面 統計情報

[Figure45-11:netstat画面 統計情報]

ネット助手

うわっ、さらに長いですね。
なんです、これは?

インター博士

これはIP、ICMP、TCP、UDPの統計情報だ。
現在までの送受信の結果情報だな。例えばTCPを見てみよう。

netstat画面 統計情報 TCP

[Figure45-12:netstat画面 統計情報 TCP] 

インター博士

このように、詳細な統計情報が手に入るわけだ。

ネット助手

ははぁ。

インター博士

今回は、TCPとUDPの話がメインだから、UDPの情報もみてみよう。

netstat画面 統計情報 UDP

[Figure45-13:netstat画面 統計情報 UDP] 

インター博士

この統計情報を見ることによって、ネットワークやネットワーク機能を調べることができる。 例えばTCPの統計で、Active Opensが0だった場合、どう思う?

ネット助手

Active Opensって、他ポートへ接続したコネクション数ですよね。
う〜ん。TCPが上手く動いてないのかなぁ、と思いますね。

インター博士

うむ、その通り。
TCPが必要なアプリケーションを動かしているのに、Active Opensが0っていうのはおかしい。

ネット助手

そうですね。
どっか壊れたのかもしれませんよね。

インター博士

そう考えるのが妥当だよな。
このように、pingやtracerouteではわからないことも、ある程度推測できるわけだ。

ネット助手

なるほど。

■ netstat 他のオプション

インター博士

まだnetstatでわかることはある。

ネット助手

すごい多機能ですね。

  • c:\> netstat -e

netstat画面 統計情報 イーサネット

[Figure45-14:netstat画面 統計情報 イーサネット] 

インター博士

イーサネットの統計情報だ。
もちろん、LANカードをつけていて、イーサネットを使っているマシンでないと出てこない。

ネット助手

へへぇ、こんな情報もだせるんですね。

  • c:\> netstat -r

netstat画面 ルーティングテーブル

[Figure45-15:netstat画面 ルーティングテーブル]

ネット助手

あれ?
これはどこかで見た覚えが…。

インター博士

うむ。第30回で出てきたルーティングテーブルだ。

ネット助手

あぁ、そう。それですよ。
>route printで表示させてましたよね。

インター博士

そう、第30回では >route print で表示させていたが、netstat -r でも表示させることが可能だ。

ネット助手

いろいろ情報が見れて便利だから、>route print よりは netstat -r の方が使い勝手がよさそうですよ。

インター博士

そうだな、そうかもしれん。
さて、今回はこれぐらいにしておこう。

ネット助手

……。

インター博士

どうした、ネット君?

ネット助手

いえあの、疑問なんですけど。
さっきでてきた、コレ。

netstat画面 接続・切断

[Figure45-06:netstat画面 接続・切断]

ネット助手

こちらのアドレスは、192.168.0.2、ですけど。
これって、プライベートアドレスですよね。なんでグローバルアドレスと接続できるのかなぁ、って。

インター博士

ふむ。

ネット助手

こちらがプライベートアドレスってことは、送ったデータが返って来る時には宛先がプライベートアドレスってことになりませんか?
それっておかしいですよね。

インター博士

むむむ。
なんか成長したなぁ、ネット君

ネット助手

え、そうですか?

インター博士

もっともな疑問だ。
あのネット君がそんな疑問を持つなんて。あのネット君がだぞ、あの!!

ネット助手

いや、そんなに「あの」を強調しないでください。

インター博士

よし。
次回はその謎を説明する。

ネット助手

はい。
3分間ネットワーキングでした〜♪

コマンドプロンプト
スタート→プログラム→アクセサリ。
Windows98系ならば、スタート→プログラム→MS-DOSプロンプト
-a や -n
-a はすべての接続を表示。
-n は数字表示。-n を指定しない場合ポート番号がwinnt\system32\drivers\etc\services(Windows2000の場合)に記されているサービス名で、IPアドレスが名前解決されてドメインネームで表示される。
今回はわかりやすく -n オプション付きで表示。
Local Address0.0.0.0の21番ポート
IPアドレスとポート番号を同時に表記する場合は 192.168.0.180、のようにコロンで区切って表記する。
画像
1行目と2行目のForeign Addressは、メールサーバのため隠させていただいてます。
Webサーバアプリケーション
HTTPサービスを提供するアプリケーション。所謂Webサーバと呼ばれるサーバが実行している。
ホストからの要求に応じて、HTMLファイルや画像ファイルを送り返す。
POP3
[Post Office Protocol version 3]
メール転送プロトコル。
受信用のメールサーバに使用される。
画像
netstatには、どちらかのプロトコルだけ表示させる方法もあります。
-p tcp もしくは -p udp でTCP・UDPのみ表示になります。
サービスの待ち受け
例えば6行目、7行目の138、137はMicrosoftのファイル共有サービスで使用しています。
画像
TCPではコネクション単位での統計が多い。
なお、再送したセグメント数があまりにも多い場合、ネットワークで輻輳が多発していることを示す。
画像
UDPは「送りっぱなし」であるので、送ったポートが閉じていることは珍しくない。
(No Portsの統計)
画像
ユニキャストフレームは、宛先が1つだけの通常のフレーム。
非ユニキャストフレームは、ブロードキャスト・マルチキャストの宛先が複数あるフレーム。
ネット助手ネット君の今日のポイント
  • netstatで様々な情報を得ることが出来る。
  • netstat -a でTCP・UDPの接続やポートの状態を調べる事が出来る。
  • netstat -s で現在までの統計情報を見ることが出来る。
  • これらの情報で、ネットワークの状態や、ネットワーク機能を確かめる。

3 Minutes NetWorking No.45

管理人:aji-ssz(at)selene.is.dream.jp