■ netstat
さてネット君。
ここ数回分をまとめてみよう。
はい。
まず。
ネット君が脇役キャラであることが証明されたわけだ。
ななな、なんですか。
それはもういいんですって。
なんだ、いいのか。
そうだな。確かに脇役キャラの人生などどうでもいいかもしれん。
うううぅ。
そうあらかさまにはっきり言われると、ちょっと……。
ともかくだ。TCPやUDPの動きを実際に見てみよう、という話だ。
実際にみることができるんですか?
うむ。
netstatという非常に便利なコマンドを使う。
ねっとすたっと?
まぁ、「酒は百薬の長」というくらいだから、とにかくまず見てもらおう。
…。
それは「百聞は一見にしかず」では?
- c:\> netstat -a -n
コマンドプロンプトで上のコマンドを入力してくれたまえ。
あぁ、ちなみにWidowsでのコマンドだ。UNIXでも同じnetstatコマンドは存在するがオプションがちょっと違う。
オプション…。
後ろの、-a や -n ですね。
うむ。
コマンドを実行すると、以下のような表示が出てくると思う。
[Figure45-01:netstat画面]
わわわ。
なんかやけに長いですよ?
うむ。-a オプションですべての接続を表示してるからな。
さて、まず見るべきポイントは一番右の「state」だ。
[Figure45-02:netstat画面 state]
state、すてーと?
「LISTENING」「TIME_WAIT」「CLOSE_WAIT」「FIN_WAIT2」「ESTABLISHED」……何か見覚えがあるような…。
ふむ。
相変わらず記憶力が意志薄弱だな。
う…、それは新しい表現ですね。
記憶力が意志薄弱ってどんなんですか。
語感的にあってるだろう。
ともかく第39回を思い出せ。これだ。
[Figure39-03:3Way HandShake]
[Figure39-05:コネクション切断]
すりーうぇいはんどしぇいく………。
あぁ、TCPの接続状態だ。
そうだ。stateにTCPの接続状態が表示される。
つまり、Local AddressとForeign Address間のコネクションの状態だ。
ははぁ。
ってことは、一番上の表示は0.0.0.0:21と0.0.0.0間のコネクション?
■ LISTENING
まぁ、そう先走るな。順に見ていこう。
一番上には「LISTENING」状態のものがくる。
[Figure45-03:netstat画面 LISTENING]
これは、ポートが開いているという状態だな。
外部からの接続待ち状態という意味だ。
外部からの接続待ち?
そうだ。
外部にサービスを提供するサーバアプリケーションは、事前にソケットを確立しポートを開けておく必要がある。
うぅ?
第43回でやったように、ポート番号が違うと相手のアプリケーションにデータが届かない。
[Figure43-08:受け取るアプリケーション]
なので、サービスを提供したい場合、ソケットを確立してLISTENING状態にしておく必要があるのだよ。
ということは、サービスを提供するサーバアプリケーションは自動的にソケットを確立するってことですか?
そういうことだ。
もう一度先ほどのnetstat画面を見てみよう。
[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は接続状態を示さなければならないから「誰かと接続状態」という表記になるが、実際は誰とも接続していない待ち受け状態だがな。
マシンによっては、
[Figure45-05:netstat画面 LISTENING 特定インタフェース]
上のように、特定のIPアドレス(を持つインタフェース)のみサービスを提供しているという場合もある。
なるほど。
netstatで、自分がどのサービスを提供しているかがわかるんですね。
■ ESTABLISHED
さて、LISTENINGの下の方には、「TIME_WAIT」「CLOSE_WAIT」「FIN_WAIT2」「ESTABLISHED」などの状態があると思う。
「ESTABLISHED」は接続中。
「TIME_WAIT」「CLOSE_WAIT」「FIN_WAIT2」は切断待ち中ですよね。
[Figure45-06:netstat画面 接続・切断] ▼
そういうことだ。
例えば、3行目を例にあげてみよう。
[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はメールサーバアプリケーションだから、つまりメールのチェック中ということだな。
今度は逆に、外部からアクセスされている状態をみてもらおう。
[Figure45-08:netstat画面 外部からアクセス]
どこからアクセスされているかは隠させてもらったが。
このマシンの192.168.0.2の80番ポートのアプリケーションに、何処かの1588番ポートのアプリケーションからアクセスされて、接続されている状態だ。
え〜っと。
自分が他のサーバにアクセスされているのと見た目変わらないんですけど。
そうだな。自分が他にアクセスしているから接続中(切断中)なのか、他からアクセスされているから接続中なのかは、ポート番号から想像するしかないな。
一般的には、ウェルノウンポートの側がサーバだけどな。
うぇるのうんぽーと。
1〜1023番のポートですよね。
■ UDP
さて、ESTABLISHEDやTIME_OUTの下の方には、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
[Figure45-11:netstat画面 統計情報]
うわっ、さらに長いですね。
なんです、これは?
これはIP、ICMP、TCP、UDPの統計情報だ。
現在までの送受信の結果情報だな。例えばTCPを見てみよう。
[Figure45-12:netstat画面 統計情報 TCP] ▼
このように、詳細な統計情報が手に入るわけだ。
ははぁ。
今回は、TCPとUDPの話がメインだから、UDPの情報もみてみよう。
[Figure45-13:netstat画面 統計情報 UDP] ▼
この統計情報を見ることによって、ネットワークやネットワーク機能を調べることができる。 例えばTCPの統計で、Active Opensが0だった場合、どう思う?
Active Opensって、他ポートへ接続したコネクション数ですよね。
う〜ん。TCPが上手く動いてないのかなぁ、と思いますね。
うむ、その通り。
TCPが必要なアプリケーションを動かしているのに、Active Opensが0っていうのはおかしい。
そうですね。
どっか壊れたのかもしれませんよね。
そう考えるのが妥当だよな。
このように、pingやtracerouteではわからないことも、ある程度推測できるわけだ。
なるほど。
■ netstat 他のオプション
まだnetstatでわかることはある。
すごい多機能ですね。
- c:\> netstat -e
[Figure45-14:netstat画面 統計情報 イーサネット] ▼
イーサネットの統計情報だ。
もちろん、LANカードをつけていて、イーサネットを使っているマシンでないと出てこない。
へへぇ、こんな情報もだせるんですね。
- c:\> netstat -r
[Figure45-15:netstat画面 ルーティングテーブル]
あれ?
これはどこかで見た覚えが…。
うむ。第30回で出てきたルーティングテーブルだ。
あぁ、そう。それですよ。
>route printで表示させてましたよね。
そう、第30回では >route print で表示させていたが、netstat -r でも表示させることが可能だ。
いろいろ情報が見れて便利だから、>route print よりは netstat -r の方が使い勝手がよさそうですよ。
そうだな、そうかもしれん。
さて、今回はこれぐらいにしておこう。
……。
どうした、ネット君?
いえあの、疑問なんですけど。
さっきでてきた、コレ。
[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.1:80、のようにコロンで区切って表記する。
- 画像
- 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 で現在までの統計情報を見ることが出来る。
- これらの情報で、ネットワークの状態や、ネットワーク機能を確かめる。