ネットワーク情報の詳細を探る


表1.ポイントと項目

No ポイント コマンドとオプション 内容
@ ノードの応答時間は? ping -s hostname [ data_size ] [ count ] 特定ノードの応答時間を確認する
traceroute hostname 途中のノードも含めた応答時間を確認する
A トラフィックの内容は? snoop -d LANIF 特定LANインタフェースのパケットダンプ
snoop -d LANIF -V パケットトレースを表示
snoop -d LANIF -v 詳細なパケット情報をトレース
snoop -d LANIF protocol protocolで示されるトレースを表示
snoop -d LANIF AHost BHost PortNo A、BHostのPortNoで示される情報をトレース
B nddコマンドで値を変更する方法は? ndd /dev/xxx \? xxxドライバのパラメタ一覧を表示
ndd /dev/xxx param xxxドライバのparam値を表示
ndd -set /dev/xxx param value xxxドライバのparam値をvalueに変更
/etc/system nddでセットされないパラメタのチューニング


@ノードの応答時間は?

ネットワーク上の特定ノードの応答時間は、pingコマンド-sオプションで測定します。図1.1に出力例を示します。応答時間の最小、平均、最大値がround-tripにミリ秒の単位で表示されます。-sオプションを指定しない形式は、通常、特定ノードが生きているかどうかを確認するのに用いられます。表示は"hostname is alive"と表示されます。その他のオプションは、ping(1M)のマニュアルページをご覧下さい。

# ping www.actcrp.com <CR>
www.actcrp.com is alive
# ping -s www.actcrp.com 56 5 <CR>
PING www.actcrp.com: 56 data bytes
64 bytes from business2e.plala.or.jp (210.153.70.21): icmp_seq=0. time=100. ms
64 bytes from business2e.plala.or.jp (210.153.70.21): icmp_seq=1. time=96. ms
64 bytes from business2e.plala.or.jp (210.153.70.21): icmp_seq=2. time=45. ms
64 bytes from business2e.plala.or.jp (210.153.70.21): icmp_seq=3. time=71. ms
64 bytes from business2e.plala.or.jp (210.153.70.21): icmp_seq=4. time=106. ms

----www.actcrp.com PING Statistics----
5 packets transmitted, 5 packets received, 0% packet loss
round-trip (ms) min/avg/max = 45/83/106
#

図1.1 pingコマンド-sオプションの実行例

pinglコマンド-sオプションで表示されるround-trip時間は、通常、隣接ノードの場合、0ミリ秒です。いくつかのノードを経由した場合、転送遅延が生じます。ノード間の遅延を調べるには、tracerouteコマンドを用います。図1.2にtracerouteの出力例を示します。先頭の番号はホップ数です。ホップ数は30が省略時値で、-mオプションで変更することが出来ます。そのホップのノードに3回のICMP要求を送信します。それらの3回のICMP要求に対する応答時間がミリ秒で表示されます。ICMP要求の回数は-qオプションで指定することが出来ます。その他のオプションは、traceroute(1M)のマニュアルページをご覧下さい。

# traceroute www.actcrp.com <CR>
traceroute to www.actcrp.com (210.153.70.21), 30 hops max, 40 byte packets
1 ---.---.0.1 (---.---.0.1) 0.544 ms 0.317 ms 0.310 ms
2 t252168.ap.plala.or.jp (220.220.252.168) 2.446 ms 2.427 ms 1.989 ms
3 t252161.ap.plala.or.jp (220.220.252.161) 2.506 ms 2.412 ms 3.566 ms
4 t250025.ap.plala.or.jp (220.220.250.25) 3.395 ms 3.335 ms 2.897 ms
5 218.43.251.249 (218.43.251.249) 3.191 ms 2.453 ms 3.417 ms
6 221.184.4.1 (221.184.4.1) 3.055 ms 2.497 ms 3.215 ms
7 61.207.0.10 (61.207.0.10) 3.213 ms 3.015 ms 2.533 ms
8 210.150.215.213 (210.150.215.213) 3.404 ms 2.770 ms 3.091 ms
9 g1-1-n-otemachi-core6.sphere.ad.jp (203.138.68.205) 3.264 ms 4.760 ms 2.887 ms
10 p3-1-kanda-core6.sphere.ad.jp (202.239.114.221) 3.071 ms 4.379 ms 4.537 ms
11 g3-0-kanda-core3.sphere.ad.jp (203.138.72.65) 3.876 ms 3.567 ms 3.493 ms
12 f0-0-0-kanda-arena-gw8.sphere.ad.jp (203.138.77.41) 5.510 ms 3.870 ms 4.596 ms
13 202.229.129.38 (202.229.129.38) 4.056 ms 3.845 ms 4.543 ms
14 202.229.63.2 (202.229.63.2) 5.796 ms 5.563 ms 5.103 ms
15 202.229.63.166 (202.229.63.166) 6.625 ms 4.926 ms 5.147 ms
16 210.153.0.241 (210.153.0.241) 6.561 ms 5.947 ms 6.150 ms
17 * * *
   :
30 * * *
#

図1.2 tracerouteコマンドの出力例


Aトラフィックの内容は?

ネットワークを流れるデータはさまざまなプロトコルによって転送されます。netstatコマンドでは、TCP/IPやLANレベルのパケット数やバイト数の統計情報、pingコマンドでは、ICMPの応答時間を測定しました。ときに、ネットワーク状態が悪く再送エラーが発生したり、プロトコル上の問題が発生したような場合、パケットの詳細な内容や、データを調査したい場合があります。このような場合、一般にスニーファをネットワークに接続してデータを採取します。Solarisのsnoopコマンドはスニーファと同様の機能を持っており、ネットワークデータを捕まえることが出来ます。図2.1は特定のLANインタフェースを流れるデータをキャプチャしたものです。

【注意】 snoopコマンドはあらゆるデータをキャプチャすることが出来ますので、使用にあたって十分ご注意願います。特にパスワード、重要なデータ等、機密情報は取り扱いにご注意下さい。セキュリティ保持は特に重要です。採取データの管理を厳重にするようご注意下さい。

 

# snoop -d eri0 <CR>
Using device /dev/eri (promiscuous mode)
---.---.0.3 -> act061 TELNET C port=1067
act061 -> ---.---.0.3 TELNET R port=1067 Using device /dev/er
---.---.0.3 -> act061 TELNET C port=1067
act061 -> dns2.plala.or.jp DNS C 3.0.168.192.in-addr.arpa. Internet PTR ?
dns2.plala.or.jp -> act061 DNS R Error: 3(Name Error)
act061 -> ---.---.0.3 TELNET R port=1067 ---.---.0.3 -> act0
---.---.0.3 -> act061 TELNET C port=1067
act061 -> ---.---.0.3 TELNET R port=1067 act061 -> 192.
---.---.0.3 -> act061 TELNET C port=1067
act061 -> ---.---.0.3 TELNET R port=1067 act061 -> dns2
---.---.0.3 -> act061 TELNET C port=1067
act061 -> ---.---.0.3 TELNET R port=1067 dns2.plala.or.jp ->
---.---.0.3 -> act061 TELNET C port=1067
^C#

図2.1 snoopコマンドによる特定LANインタフェースのパケットキャプチャ


図2.2はsnoopコマンド-Vオプションで、パケット1個を1行にしてデータをキャプチャしたものです。

# snoop -d eri0 -V <CR>
Using device /dev/eri (promiscuous mode)
________________________________
---.---.0.3 -> act061 ETHER Type=0800 (IP), size = 60 bytes
---.---.0.3 -> act061 IP D=---.---.0.4 S=---.---.0.3 LEN=40, ID=22216
---.---.0.3 -> act061 TCP D=23 S=1067 Ack=389349499 Seq=1176318504 Len=0 Win=64218
---.---.0.3 -> act061 TELNET C port=1067
________________________________
act061 -> ---.---.0.3 ETHER Type=0800 (IP), size = 96 bytes
act061 -> ---.---.0.3 IP D=---.---.0.3 S=---.---.0.4 LEN=82, ID=36799
act061 -> ---.---.0.3 TCP D=1067 S=23 Ack=1176318504 Seq=389349499 Len=42 Win=24820
act061 -> ---.---.0.3 TELNET R port=1067 Using device /dev/er
________________________________
---.---.0.3 -> act061 ETHER Type=0800 (IP), size = 60 bytes
---.---.0.3 -> act061 IP D=---.---.0.4 S=---.---.0.3 LEN=40, ID=22217
---.---.0.3 -> act061 TCP D=23 S=1067 Ack=389349541 Seq=1176318504 Len=0 Win=64176
---.---.0.3 -> act061 TELNET C port=1067
________________________________
act061 -> dns2.plala.or.jp ETHER Type=0800 (IP), size = 84 bytes
act061 -> dns2.plala.or.jp IP D=210.153.0.130 S=---.---.0.4 LEN=70, ID=34673
act061 -> dns2.plala.or.jp UDP D=53 S=33481 LEN=50
act061 -> dns2.plala.or.jp DNS C 3.0.168.192.in-addr.arpa. Internet PTR ?
________________________________
dns2.plala.or.jp -> act061 ETHER Type=0800 (IP), size = 147 bytes
dns2.plala.or.jp -> act061 IP D=---.---.0.4 S=210.153.0.130 LEN=133, ID=50483
dns2.plala.or.jp -> act061 UDP D=33481 S=53 LEN=113
dns2.plala.or.jp -> act061 DNS R Error: 3(Name Error)

図2.2 snoopコマンド-V オプションによる1パケット1行のキャプチャ


図2.3は、snoopコマンド-vオプションでより詳細にパケット情報をキャプチャしたものです。

# snoop -d eri0 -v <CR>
        :
TELNET: ----- TELNET: -----
TELNET:
TELNET: "TCP: .... ...0 = No Fin\r\nTCP: Window = 63846\r\nTCP: "
TELNET:

ETHER: ----- Ether Header -----
ETHER:
ETHER: Packet 18 arrived at 15:54:50.07
ETHER: Packet size = 60 bytes
ETHER: Destination = 0:3:ba:10:6:f,
ETHER: Source = 0:6:5b:c7:fc:51,
ETHER: Ethertype = 0800 (IP)
ETHER:
IP: ----- IP Header -----
IP:
IP: Version = 4
IP: Header length = 20 bytes
IP: Type of service = 0x00
IP: xxx. .... = 0 (precedence)
IP: ...0 .... = normal delay
IP: .... 0... = normal throughput
IP: .... .0.. = normal reliability
IP: Total length = 40 bytes
IP: Identification = 22547
IP: Flags = 0x4
IP: .1.. .... = do not fragment
IP: ..0. .... = last fragment
IP: Fragment offset = 0 bytes
IP: Time to live = 128 seconds/hops
IP: Protocol = 6 (TCP)
IP: Header checksum = 2165
IP: Source address = ---.---.0.3, ---.---.0.3
IP: Destination address = ---.---.0.4, act061
IP: No options
IP:
TCP: ----- TCP Header -----
TCP:
TCP: Source port = 1067
TCP: Destination port = 23 (TELNET)
TCP: Sequence number = 1176318525
TCP: Acknowledgement number = 389360607
TCP: Data offset = 20 bytes
TCP: Flags = 0x10
TCP: ..0. .... = No urgent pointer
TCP: ...1 .... = Acknowledgement
TCP: .... 0... = No push
TCP: .... .0.. = No reset
TCP: .... ..0. = No Syn
TCP: .... ...0 = No Fin
TCP: Window = 64008
TCP: Checksum = 0x74c3
TCP: Urgent pointer = 0
TCP: No options

^C#

図2.3 snoopコマンド-vオプションによる詳細なパケットキャプチャ


図2.4は、snoopコマンドでプロトコル名を指定した例です。

# snoop -d eri0 tcp <CR>
Using device /dev/eri (promiscuous mode)
---.---.0.3 -> act061 TELNET C port=1067
act061 -> ---.---.0.3 TELNET R port=1067 Using device /dev/er
---.---.0.3 -> act061 TELNET C port=1067
act061 -> ---.---.0.3 TELNET R port=1067 ---.---.0.3 -> act0
---.---.0.3 -> act061 TELNET C port=1067
act061 -> ---.---.0.3 TELNET R port=1067 act061 -> 192.
---.---.0.3 -> act061 TELNET C port=1067
act061 -> ---.---.0.3 TELNET R port=1067 act061 -> 192.
---.---.0.3 -> act061 TELNET C port=1067
act061 -> ---.---.0.3 TELNET R port=1067 ---.---.0.3 -> act0
---.---.0.3 -> act061 TELNET C port=1067
act061 -> ---.---.0.3 TELNET R port=1067 act061 -> 192.
---.---.0.3 -> act061 TELNET C port=1067
act061 -> ---.---.0.3 TELNET R port=1067 ---.---.0.3 -> act0
---.---.0.3 -> act061 TELNET C port=1067
^C#

図2.4 snoopコマンドのプロトコル指定によるパケットキャプチャ


特定のLANインタフェースを指定すると、そのLANインタフェースを使用すべての通信相手のデータがキャプチャされ、結果、大きなトレースファイルになることがあります。これを絞り込むため、所定の通信相手とのパケット送受信だけをキャプチャしたい場合、IPアドレスを指定することが出来ます。図2.5にその例を示します。

# snoop -d eri0 ---.---.0.4 ---.---.0.7 23 <CR>
Using device /dev/eri (promiscuous mode)
---.---.0.7 -> act061 TELNET C port=1235
act061 -> ---.---.0.7 TELNET R port=1235
---.---.0.7 -> act061 TELNET C port=1235
---.---.0.7 -> act061 TELNET C port=1235
act061 -> ---.---.0.7 TELNET R port=1235
act061 -> ---.---.0.7 TELNET R port=1235
---.---.0.7 -> act061 TELNET C port=1235
act061 -> ---.---.0.7 TELNET R port=1235
---.---.0.7 -> act061 TELNET C port=1235
act061 -> ---.---.0.7 TELNET R port=1235
---.---.0.7 -> act061 TELNET C port=1235
act061 -> ---.---.0.7 TELNET R port=1235
---.---.0.7 -> act061 TELNET C port=1235
act061 -> ---.---.0.7 TELNET R port=1235 \377\373\1\377\375\1login:
---.---.0.7 -> act061 TELNET C port=1235
act061 -> ---.---.0.7 TELNET R port=1235
---.---.0.7 -> act061 TELNET C port=1235
---.---.0.7 -> act061 TELNET C port=1235 o
act061 -> ---.---.0.7 TELNET R port=1235 o
---.---.0.7 -> act061 TELNET C port=1235 r
act061 -> ---.---.0.7 TELNET R port=1235 r
---.---.0.7 -> act061 TELNET C port=1235 a
act061 -> ---.---.0.7 TELNET R port=1235 a
---.---.0.7 -> act061 TELNET C port=1235
---.---.0.7 -> act061 TELNET C port=1235 c
act061 -> ---.---.0.7 TELNET R port=1235 c
---.---.0.7 -> act061 TELNET C port=1235 l
act061 -> ---.---.0.7 TELNET R port=1235 l
---.---.0.7 -> act061 TELNET C port=1235 e
act061 -> ---.---.0.7 TELNET R port=1235 e
---.---.0.7 -> act061 TELNET C port=1235
---.---.0.7 -> act061 TELNET C port=1235
act061 -> ---.---.0.7 TELNET R port=1235
---.---.0.7 -> act061 TELNET C port=1235
act061 -> ---.---.0.7 TELNET R port=1235 Password:
---.---.0.7 -> act061 TELNET C port=1235
---.---.0.7 -> act061 TELNET C port=1235 h
act061 -> ---.---.0.7 TELNET R port=1235
---.---.0.7 -> act061 TELNET C port=1235 o
act061 -> ---.---.0.7 TELNET R port=1235
---.---.0.7 -> act061 TELNET C port=1235 g
act061 -> ---.---.0.7 TELNET R port=1235
---.---.0.7 -> act061 TELNET C port=1235 e
act061 -> ---.---.0.7 TELNET R port=1235
---.---.0.7 -> act061 TELNET C port=1235 h
act061 -> ---.---.0.7 TELNET R port=1235
---.---.0.7 -> act061 TELNET C port=1235 o
act061 -> ---.---.0.7 TELNET R port=1235
---.---.0.7 -> act061 TELNET C port=1235 g
act061 -> ---.---.0.7 TELNET R port=1235
---.---.0.7 -> act061 TELNET C port=1235
act061 -> ---.---.0.7 TELNET R port=1235
---.---.0.7 -> act061 TELNET C port=1235
act061 -> ---.---.0.7 TELNET R port=1235 Last login: Sat Aug
---.---.0.7 -> act061 TELNET C port=1235
^C#

図2.5 snoopコマンドによる特定ノード間のパケットキャプチャ


Bnddコマンドで値を変更する方法は?

パフォーマンスチューニングにおいて、nddコマンドを用いてネットワーク関連パラメタをチューニングすることが出来ます。個々のチューニングパラメタは、プロトコル毎に"/dev/xxx"のように指定します。xxxに、tcp、ip、icmp、udpなどのプロトコル(ドライバ名)を指定します。では、どれだけのパラメタがそのプロトコルにあるのでしょうか? 図3.1はTCPプロトコルの持つチューニングパラメタを表示したものです。先頭から3行目より、最後から2行目までがパラメタです。各々"()"(括弧)内に、そのパラメタが読み取りか書き込み、いずれが可能か表示されます。

# ndd /dev/tcp \? <CR>
? (read only)
tcp_time_wait_interval (read and write)
tcp_conn_req_max_q (read and write)
tcp_conn_req_max_q0 (read and write)
tcp_conn_req_min (read and write)
tcp_conn_grace_period (read and write)
tcp_cwnd_max (read and write)
tcp_debug (read and write)
tcp_smallest_nonpriv_port (read and write)
tcp_ip_abort_cinterval (read and write)
tcp_ip_abort_linterval (read and write)
tcp_ip_abort_interval (read and write)
tcp_ip_notify_cinterval (read and write)
tcp_ip_notify_interval (read and write)
tcp_ipv4_ttl (read and write)
tcp_keepalive_interval (read and write)
tcp_maxpsz_multiplier (read and write)
tcp_mss_def_ipv4 (read and write)
tcp_mss_max_ipv4 (read and write)
tcp_mss_min (read and write)
tcp_naglim_def (read and write)
tcp_rexmit_interval_initial (read and write)
tcp_rexmit_interval_max (read and write)
tcp_rexmit_interval_min (read and write)
tcp_deferred_ack_interval (read and write)
tcp_snd_lowat_fraction (read and write)
tcp_sth_rcv_hiwat (read and write)
tcp_sth_rcv_lowat (read and write)
tcp_dupack_fast_retransmit (read and write)
tcp_ignore_path_mtu (read and write)
tcp_rcv_push_wait (read and write)
tcp_smallest_anon_port (read and write)
tcp_largest_anon_port (read and write)
tcp_xmit_hiwat (read and write)
tcp_xmit_lowat (read and write)
tcp_recv_hiwat (read and write)
tcp_recv_hiwat_minmss (read and write)
tcp_fin_wait_2_flush_interval (read and write)
tcp_co_min (read and write)
tcp_max_buf (read and write)
tcp_strong_iss (read and write)
tcp_rtt_updates (read and write)
tcp_wscale_always (read and write)
tcp_tstamp_always (read and write)
tcp_tstamp_if_wscale (read and write)
tcp_rexmit_interval_extra (read and write)
tcp_deferred_acks_max (read and write)
tcp_slow_start_after_idle (read and write)
tcp_slow_start_initial (read and write)
tcp_co_timer_interval (read and write)
tcp_sack_permitted (read and write)
tcp_trace (read and write)
tcp_compression_enabled (read and write)
tcp_ipv6_hoplimit (read and write)
tcp_mss_def_ipv6 (read and write)
tcp_mss_max_ipv6 (read and write)
tcp_rev_src_routes (read and write)
tcp_ndd_get_info_interval (read and write)
tcp_wroff_xtra (read and write)
tcp_extra_priv_ports (read only)
tcp_extra_priv_ports_add (write only)
tcp_extra_priv_ports_del (write only)
tcp_status (read only)
tcp_bind_hash (read only)
tcp_listen_hash (read only)
tcp_conn_hash (read only)
tcp_acceptor_hash (read only)
tcp_host_param (read and write)
tcp_time_wait_stats (read only)
tcp_host_param_ipv6 (read and write)
tcp_1948_phrase (write only)
tcp_reserved_port_list (read only)
tcp_close_wait_interval(obsoleted- use tcp_time_wait_interval) (no read or write)
#

図3.1 TCPドライバのネットワークチューニングパラメタ


"write"の表示されているパラメタは、nddコマンドによって動的に変更することが出来ます。"read only"と表示されているパラメタは値の表示のみ出来ます。一部のパラメタはnddコマンドではなく、/etc/systemファイルに指定するものがあります。表3にネットワーク関連の/etc/systemファイルに記述するパラメタを示します(現在のところ、TCPドライバのみです)。

表3./etc/systemファイルに記述するネットワークチューニングパラメタ

ドライバ名 パラメタ
tcp tcp_bind_hash
tcp_listen_hash
tcp_conn_hash
tcp_acceptor_hash


図3.1ではTCPドライバのパラメタ一覧を示しました。他のドライバのパラメタはどうなっているのでしょうか? 図3.2は、全部のネットワークドライバに関するパラメタを"ドライバ名_tags"のファイル、各パラメタの値を"ドライバ名_params"のファイルに書き出すシェルスクリプトです。なお、最初のfor文にある引数の"eri"は、LANドライバの名前です。システムに構成されているhme、qfe等のLANドライバ名に置き換えます。


for p in tcp ip udp icmp eri
do
    ndd /dev/${p} \? | grep -v "?" | sort > ${p}_tags
    echo "${p}_parameters\n" > ${p}_params
    for i in `ndd /dev/${p} \? | grep -v obsoleted | grep -v "?" | sed "s/\(/ /g" | sort | awk '{ print $1 }'`
    do
        echo ${i} >> ${p}_params
        ndd /dev/${p} ${i} >> ${p}_params
    done
done

図3.2 全ネットワークドライバのパラメタを出力する


図3.3は、特定のパラメタの値を表示する例です。例はTCPドライバの"tcp_time_wait_interval"を表示したものです。値の単位はミリ秒です。秒に直すと240秒で、4分間のタイマです。

# ndd /dev/tcp tcp_time_wait_interval <CR>
240000
#

図3.3 特定のパラメタ値を表示する


では、どのようにしてパラメタを変更するのでしょうか? 図3.4は前述の"tcp_time_wait_interval"を-setオプションで15秒(15000ミリ秒)に変更する例です。変更後、指定した通りに変わっているかを確かめる習慣をつけておきましょう。

# ndd -set /dev/tcp tcp_time_wait_interval 15000 <CR>
# ndd /dev/tcp tcp_time_wait_interval <CR>
15000
#

図3.4 特定のパラメタ値を変更する


nddコマンドで変更できないパラメタはシステムブート時にセットされます。このため、/etc/systemファイルに設定します。もちろん、図3.4にあるようにnddコマンド-setオプションでセットした一時的変更も、システムを再ブートすると元に戻ってしまいます。恒常的にパラメタをセットする場合は、/etc/systemファイルに設定して下さい。

set tcp:tcp_conn_hash_size=32768

図3.5 /etc/systemファイルの設定例


Copyright (C) 2004 by The Art of Computer Technologies, Corp.  All rights reserved.