このセクションでは一般に使われているネットワークの状態診断用のプログラ ムを簡単に紹介した上で、それらを使ってネットワーク上の問題点を発見する 方法について説明します。そのためにもう少し詳しく tcp/ip の仕組みについ ても解説します。この文書ではそれぞれのプログラムの働き方の詳細について 触れる機会がなかったので、ここで簡単にそれぞれのプログラムについて説明 しておくつもりです。今までに述べてきた点については、より詳しく 知るために参照すべき文書やマニュアルページを紹介しているので、それらを ご覧ください。
ping プログラムは NetKit-B のディストリビューションに含まれて います。このディストリビューションについては「ネットワーク用アプリケー ション」のセクションで詳しく説明しています。ping コマンドは、 その名が示すように(訳注:ping とは、潜水艦が敵艦を発見するために打つソ ナーを意味します)、ターゲットとなるホストがデータグラムを受けとり、正 しく返答してくるか、また通過してゆくネットワークも正しく働いているかど うかをチェックするものです。一番簡単な使用法は、
# ping gw
PING gw.vk2ktj.ampr.org (44.136.8.97): 56 data bytes
64 bytes from 44.136.8.97: icmp_seq=0 ttl=254 time=35.9 ms
64 bytes from 44.136.8.97: icmp_seq=1 ttl=254 time=22.1 ms
64 bytes from 44.136.8.97: icmp_seq=2 ttl=254 time=26.0 ms
^C
--- gw.vk2ktj.ampr.org ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 22.1/28.0/35.9 ms
#
とするだけです。
ping の動作は、与えられたホスト名を IP アドレスに変換して icmp プロトコルを利用して、ターゲットとなるホストに icmp echo request を定期的に送ることだけです。icmp echo request を受ける度にリモートホストは icmp echo reply デー タグラムを返送してきます。`64 bytes from ...' の各行は echo request に対応する返答(echo reply)を示します。各行は返答 をしているホストの IP アドレス、返答の番号、ttl(time to live) フィール ド、かかった時間、の各項目から成っています。かかった時間(round trip time)は echo request のデータグラムが送られてから echo replyが帰ってくるまでにかかった時間です。この数字は 2 つのマシン をつないでいるネットワークが速いか遅いかを示す目安になります。
中断後に表示される 2 行は、転送されたデータグラム数と有効な返答数、失 なわれたデータグラム数についての統計です。失なわれたデータグラム数が多 い場合、二台のマシンを接続しているネットワークのどこかで、ルーターやリ ンクの容量が溢れたとかイーサネットで多数のコリジョンが発生しているといっ た問題が生じている可能性があります。異なるネットワーク上にあるマシンに 対して ping してみることで、問題が発生している箇所を特定する ことが可能です。ある地点まではパケットがちゃんと届いているのに、そこを 越えると 届かなくなるようなような場合、問題はその間に起きています。
traceroute コマンドは既述の NetKit-A に入っています。このコマ ンドは、基本的には、目的のホストまでどのような経路を通って接続するかを 示すものです。traceroute は icmp プロトコルも使いま すが、通過してゆく経路を示すために多少の工夫をしています。その工夫とは、 転送するデータグラムの ttl フィールドを操作することです。 ttl フィールドとは、迷子になったデータグラムがループ状態に陥 いらないようにするため仕組みで、データグラムがルータを経由する度に ttl フィールドの数字を一つ減らし、それが 0 になった時点で、そ のデータグラムを受けたルータかホストがデータグラムの寿命が尽きたという メッセージ(icmp time to live expired message)を発信元のホスト に送ります。traceroute はこのメカニズムを使って、ttl フィールドを最初は 1 に設定し、1 ステップ経過するごとに ttl フィールドを一つずつ増やした udp データグラムを送信しています。 データグラムの寿命が尽きたというメッセージが帰ってきたアドレスを記録し ていくことで、目的地までの経路を決定することができます。例えばこんな風 に利用します:
# traceroute minnie.vk1xwt.ampr.org
traceroute to minnie.vk1xwt (44.136.7.129), 30 hops max, 40 byte packets
1 gw (44.136.8.97) 51.618 ms 30.431 ms 34.396 ms
2 gw.uts (44.136.8.68) 2017.322 ms 2060.121 ms 1997.793 ms
3 minnie.vk1xwt (44.136.7.129) 2205.335 ms 2319.728 ms 2279.643 ms
#
最初の数字は何ホップ離れているか(ttl の値)を示し、2 つめの欄 はその返答を返してきたホストのホスト名とアドレス(ホスト名がわからない 場合はアドレスのみ)を示します。第 3、第 4、第 5 の欄は、そのホストへ送っ た 3 つのデータグラムが往復するまでにかかった時間です。この例では、ま ず gw.vk2ktj へ接続し、そこまでの往復に要した時間を 3 つ表示しています。 次のホストはgw.uts.apmr.org で、minnie.vk2xwt.ampr.org はもう一つ先で す。それぞれのステップに要した時間から、ネットワークの状態をある程度推 測することが可能です。この例では、 gw マシンまでの時間はごく短いので gw マシンとはイーサネットで接続されていると考えることができます。 gw.uts には gw に比べてかなり時間がかかっており、低速の無線回線を経由 していると考えられます。一方、minnie.vk1xwt は gw.uts よりもほんの少し 時間がかかっているだけなので、minnie.vk1xwt と gw.uts は高速な回線で結 ばれていると推測できます。
traceroute してみて、経過時間の後に !N
という記号が付いた場合、
「ネットワーク的に到着不能(network unreachable)」であることを
示しています。このメッセージは、返答を返しているホストやルータが目的の
アドレスへの経路を見つけられない時に生じます。このメッセージが出る場合、
ネットワークのどこかがダウンしているのでしょう。最後に示されるアドレス
がリンクの切れている直前の部分です。
同様に !H
という記号が出ている場合、「ホストへ到着不能
(host unreachable)」状態を示します。この場合、ネットワーク的
には目的のホストまで到達しているものの、何らかのトラブルでそのホストが
返答できなくなっている状態です。
Adam Caldwell <acaldwel@103mort2.cs.ohiou.edu>
が linux へ
tcpdump を移植しました。tcpdump を使えば、あなたのマ
シンを経由して出入りするデータグラムを監視することができます。
tcpdump は、ネットワーク上の問題点を診断するのにも利用できま
す。
tcpdump のソースとバイナリは 103mor2.cs.ohiou.edu から入手できます。
tcpdump はそのマシンを経由していくデータグラムを傍受して、多 少暗号めいた形のテキストフォーマットで表示します。tcpdump は、 プロトコルエラーや原因不明の切断といった問題を分析するのに役立ち、ネッ トワークに何が起っているのかを直接見ることを可能にします。 tcpdump をきちんと活用するには各種のプロトコルやその働き方に ついての知識が必要ですが、特にそれらの知識がなくても様々な用途に使うこ とができます。例えば、ルーティングに関する問題が生じている時に、データ グラムが正しいポートからやり取りされてるかどうか、あるいは接続先から正 しくデータグラムを受けとっているかどうかなどを見ることができます。
簡単な tcpdump の出力例です。
# tcpdump -i eth0
tcpdump: listening on eth0
13:51:36.168219 arp who-has gw.vk2ktj.ampr.org tell albert.vk2ktj.ampr.org
13:51:36.193830 arp reply gw.vk2ktj.ampr.org is-at 2:60:8c:9c:ec:d4
13:51:37.373561 albert.vk2ktj.ampr.org > gw.vk2ktj.ampr.org: icmp: echo request
13:51:37.388036 gw.vk2ktj.ampr.org > albert.vk2ktj.ampr.org: icmp: echo reply
13:51:38.383578 albert.vk2ktj.ampr.org > gw.vk2ktj.ampr.org: icmp: echo request
13:51:38.400592 gw.vk2ktj.ampr.org > albert.vk2ktj.ampr.org: icmp: echo reply
13:51:49.303196 albert.vk2ktj.ampr.org.1104 > gw.vk2ktj.ampr.org.telnet: S 700506986:700506986(0) win 512 <mss 1436>
13:51:49.363933 albert.vk2ktj.ampr.org.1104 > gw.vk2ktj.ampr.org.telnet: . ack 1103372289 win 14261
13:51:49.367328 gw.vk2ktj.ampr.org.telnet > albert.vk2ktj.ampr.org.1104: S 1103372288:1103372288(0) ack 700506987 win 2048 <mss 432>
13:51:49.391800 albert.vk2ktj.ampr.org.1104 > gw.vk2ktj.ampr.org.telnet: . ack 134 win 14198
13:51:49.394524 gw.vk2ktj.ampr.org.telnet > albert.vk2ktj.ampr.org.1104: P 1:134(133) ack 1 win 2048
13:51:49.524930 albert.vk2ktj.ampr.org.1104 > gw.vk2ktj.ampr.org.telnet: P 1:28(27) ack 134 win 14335
..
#
tcpdump を引数なしで起動した場合、loopback デバイス以外の、 (一番小さい番号の)最初のネットワークデバイスを監視対象にします。上記の 例のようにモニタするデバイスをコマンドラインの引数で与えることも可能で す。起動されると、tcpdump は送受信される全てのデータグラムを テキストの形で、1 データグラム 1 行に示します。最初の欄はデータグラム が送受信された時間です。残りの部分はそのデータグラムのタイプによって変 ります。上記の例では、最初の 2 行は alvert.v2ktj から gw.vk2ktj への arp request のようです。次の 4 行は albert.vk2ktj から gw.vk2ktj への 2 回の ping でしょう。このように tcpdump は送受信された icmp データグ ラムの名称を示します。「大なり記号(>)」はどこからどこへデータグラムが 送られたのか、"送り手 > 受け手" の形で示しています。例の残りの部分は albert.vk2ktj から gw.vk2ktj への telnet 接続を行なっています。
ホスト名の最後についている数字や名前は使われているソケット番号を示して
います。数字をサービス名に変換するには /etc/services
ファイル
に登録されている情報を参照しています。
tcpdump は各フィールドを展開するので、いくつかのデータグラム では window の値や mss パラメーターを見ることも可能です。
指定可能なオプションは tcpdump のマニュアルページに記載されて います。
PPP ユーザーへの注意:現在のバージョンの tcpdump は
PPP プロトコルに対応していません。Al Longyear が PPP 用のパッチを作っ
ていますが、これは tcpdump の公式版には取りこまれていません。
パッチは sunsite.unc.edu
の tcpdump と同じディレクト
リにあります。
ICMP すなわち、Internet Control Message Protocol は使っている IP ネッ
トワークの健全さについての情報を送っています。ICMP メッセージは黙って
送受信されるので、その存在に気づくことはまずありません。
icmpinfo は 沈黙のうちに送信される ICMP メッセージを
tcpdump のように表示するためのプログラムです。Laurent
Demailly <dl@hplyot.obspm.fr>
が bsd の ping のソースを徹底的
に修正して作成しました。
icmpinfo の 1.10 は以下のサイトから入手できます:
hplyot.obspm.fr
/net/icmpinfo-1.10.tar.gz
コンパイルはごく簡単です。
# cd /usr/src
# cd icmpinfo-1.10
# gzip -dc icmpinfo-1.10.tar.gz | tar xvf -
# make
icmpinfo を走らせるには root 権限が必要になります。 icmpinfo の出力は起動した tty に直接表示したり syslog 経由で記録することが可能です。
どのように動くのかをテストするには icmpinfo を起動してから接 続先のホストへ traceroute してみるのがいいでしょう。 traceroute が使っている icmp メッセージが出力される はずです。