動かし続ける

INPUT · スライド

届くかどうかを確かめる

01 / 08

返事をくれと頼む

前のレッスンでは設定を読んだね。口があって、住所が付いていて、道があるか。

でも設定が正しく見えても、実際に届くかは別の話だよ。

書類は揃っている → でも本当に着く?

それを試すのが ping だよ。

~ $ ping -c 2 127.0.0.1PING 127.0.0.1 (127.0.0.1): 56 data bytes64 bytes from 127.0.0.1: seq=0 ttl=64 time=0.6 ms64 bytes from 127.0.0.1: seq=1 ttl=64 time=0.9 ms--- 127.0.0.1 ping statistics ---2 packets transmitted, 2 packets received, 0% packet loss

やっていることは、とても単純だよ。

こちら「これと同じものを返してください」相手  「はい、これです」

内容には意味が無いんだ。56バイトの適当な中身を送って、そのまま返ってくるかだけを見ている。郵便の受取確認みたいなものだね。

-c 2 は「2回だけ送る」という印だよ。付けないと止まらないので、必ず付ける癖をつけてね。

ping 127.0.0.1        永遠に送り続ける(Ctrl-C で止める)ping -c 2 127.0.0.1   2回で終わる

名前の由来もおもしろいよ。潜水艦のソナーが「ピン」と音を出して、跳ね返りを聞く動作から来ているんだ。

ピン …… (跳ね返り)

そこに何かあるかを音で確かめるでしょう。まさに同じことをしているんだ。

この回で本当に覚えてほしいのは、届いたときの読み方ではなく届かなかったときの読み方だよ。そちらのほうが、現場で何倍も役に立つからね。

02 / 08

1行を読む

返ってきた1行を分けて見てみようか。

64 bytes from 127.0.0.1: seq=0 ttl=64 time=0.700 ms└──┬──┘      └───┬───┘  └─┬┘ └─┬─┘ └────┬────┘ 大きさ         相手      番号  残り  かかった時間

4つとも読む値打ちがあるよ。

場所何が分かるか
64 bytes送ったものが同じ大きさで戻った
seq=0何通めか(欠けたら番号が飛ぶ)
ttl=64あと何台通れるか
time=0.7 ms往復にかかった時間

seqtime がとくに大事だよ。

seq=0seq=1seq=3   ← 2 が飛んだ! 途中で1通消えた

番号が飛ぶのは、荷物が落ちているという意味だね。ケーブルが傷んでいたり、混みすぎているときに起きるんだ。

time は速さそのものだよ。目安を持っておくと便利だね。

0.1 ms 以下   自分自身(ループバック)1 ms 前後     同じ部屋の中10〜30 ms     国内のサーバー150 ms 以上   地球の裏側、または何か遅い

最後に統計が出るでしょう。

2 packets transmitted, 2 packets received, 0% packet lossround-trip min/avg/max = 0.600/0.750/0.900 ms

packet loss が 0% でなければ、どこかで落ちているんだ。ここだけ見れば足りることも多いよ。要点だけ見たいときは -q を付けると、この2行だけになるんだ。

03 / 08

ttl は残りの体力

ttl は Time To Live の略で、直訳すると「生きられる時間」だよ。でも実際には通れる台数なんだ。

出発時 ttl=64  ↓ 1台通る     ttl=63  ↓ 1台通る     ttl=62     ttl=0 → 捨てられる

なぜこんな仕組みがあるのかというと、迷子を止めるためだよ。

A → B → C → A → B → C → …

設定を間違えると、荷物がぐるぐる回り続けることがあるでしょう。それが積もるとネットワークが詰まってしまうんだ。だから残り回数を持たせて、尽きたら捨てるようにしてあるんだよ。

ここから面白いことが読めるよ。

ttl=64   0台(自分自身か、すぐ隣)ttl=53   11台通ってきた(64 - 53)

返ってきた ttl から、相手までの距離が推測できるんだ。出発時の値は 64 や 128 が多いので、そこから引き算するんだよ。

実際に何台通ったかを1台ずつ見せてくれる道具もあるよ。

~ $ traceroute 127.0.0.1traceroute to 127.0.0.1 (127.0.0.1), 30 hops max 1  localhost (127.0.0.1)  0.100 ms  0.050 ms

自分自身なので1台だけだね。外につながる機械で打つと、10台20台と並ぶんだ。

traceroute の仕掛けは、この ttl を使った小さな手品だよ。

ttl=1 で送る → 1台めが「尽きました」と返す → 1台めが分かるttl=2 で送る → 2台めが返す → 2台めが分かる

わざと途中で尽きさせて、返してきた相手の名前を集めているんだ。うまい考えでしょう。

04 / 08

回数と待ち時間

ping の印は多いけれど、使うのは4つだけだよ。

すること既定
-c 回数何回送るか止まらない
-W 秒返事を待つ上限10秒
-w 秒全体を打ち切る秒数無し
-q要点だけ出す全部出す

-c は必ず付けるようにしてね。付け忘れると止まらないんだ。

-W-w の違いは、慣れるまで紛らわしいよ。

-W  1通の返事をどれだけ待つか-w  ping 全体を何秒で打ち切るか
ping -c 3 -W 1 相手     3回送って、返事は1秒だけ待つping -c 100 -w 5 相手   100回送るつもりだが、5秒で終わる

なぜ待ち時間を縮めたいかというと、返ってこない相手を待つのが長いからだよ。

ping -c 1 死んでる相手         10秒待たされるping -c 1 -W 1 死んでる相手    1秒で分かる

スクリプトの中で使うときは、これが決め手になるでしょう。10台調べるのに、片方は100秒、片方は10秒だからね。

for A in ...; do ping -c 1 -W 1 "$A" ...; done

章11で覚えた for と組むと、死活の一覧が作れるんだ。この回の最後にやるよ。

-q も並べておくね。

~ $ ping -c 2 -q 127.0.0.1PING 127.0.0.1 (127.0.0.1): 56 data bytes--- 127.0.0.1 ping statistics ---2 packets transmitted, 2 packets received, 0% packet loss

1通ずつの行が消えて、要点だけになったでしょう。100回送るときはこちらが読みやすいんだ。

05 / 08

大きさを変えてみる

送るものの大きさも変えられるよ。

~ $ ping -c 1 -s 8 127.0.0.1PING 127.0.0.1 (127.0.0.1): 8 data bytes16 bytes from 127.0.0.1: seq=0 ttl=64 time=0.5 ms

8バイト送ったのに、16バイト返ってきたね。増えた8バイトは ICMP の頭(ヘッダ)だよ。

8(中身)+ 8(頭)= 1656(既定)+ 8(頭)= 64

これで既定が 64 bytes だった理由が分かったでしょう。

大きさを変えて何が分かるのかというと、大きい荷物だけ落ちるという故障を見つけられるんだ。

ping -c 1 -s 56 相手     返るping -c 1 -s 2000 相手   返らない!

これは前のレッスンで見た mtu(1回に運べる大きさ)に関わる話だよ。

mtu 1500   ふつうの有線mtu 65536  ループバック(外に出ないので大きい)

mtu より大きい荷物は、途中で分割して運ばれるんだ。その分割がうまくいかない設定になっていると、小さい荷物だけ通って大きい荷物が消えるでしょう。

ping は通る、でもファイルの転送だけ途中で止まる

この症状の原因がそれなんだ。とても見つけにくい故障の代表で、大きさを変えた ping が切り札になるんだよ。

この環境は mtu 65536 なので大きい荷物も通るけれど、手の内として知っておいてね。「ping は通るのに動かない」と言われたときの一手だよ。

06 / 08

返ってこないときの4種類

この回でいちばん大事なところだよ。返ってこない理由は1つではないんだ。

出るものどこで止まったか見る場所
bad address名前を住所に変えられない/etc/hosts / DNS
Network unreachable出る道が無いip route
Destination Host Unreachable道はあるが相手が居ない相手の電源・住所
(無反応で 100% loss)届いたが返事が来ない相手の設定・防火壁

4つとも直す場所が違うでしょう。ここを読み分けられるかどうかが、この回の値打ちなんだ。

この環境で2つは実際に出せるよ。

~ $ ping -c 1 example.comping: bad address 'example.com'~ $ ping -c 1 8.8.8.8PING 8.8.8.8 (8.8.8.8): 56 data bytesping: sendto: Network unreachable

1行めが出ているかどうかに注目してね。

PING 8.8.8.8 … が出た    → 名前は解決できた(住所は分かった)出ていない               → 名前の段で止まった

どこまで進んだかが、出力の行数で分かるんだ。

4つめの「無反応」がいちばん厄介だよ。

PING 相手 (192.168.1.99): 56 data bytes--- 相手 ping statistics ---3 packets transmitted, 0 packets received, 100% packet loss

エラーが1行も出ないのに返ってこないでしょう。よくある原因はこれだよ。

相手が ICMP を捨てる設定にしている(わざと隠れている)防火壁が途中で落としている相手が落ちている

1つめが大事だよ。ping が返らないからといって、そこに機械が無いとは限らないんだ。次のレッスンでその続きをやろうね。

07 / 08

ping が返っても安心できない

逆の落とし穴も知っておいてね。

ping は返る → でもサイトが見られない

これはよく起きるんだ。なぜかというと、ping が確かめているのは機械が生きていることだけだからだよ。

ping が見ているもの    機械が返事をするか見ていないもの        アプリが動いているか

家に例えると、こうだね。

ping     家に人が居るか(ノックして返事があるか)それ以外  お店が開いているか(扉が開いているか)

人は居るのに店は閉まっていることがあるでしょう。

サーバーは生きている(ping は返る)でも Web のプログラムが落ちている(見られない)

だから調べる順番はこうなるんだ。

1. ping        機械は生きている?2. netstat     扉は開いている?      ← 次のレッスン3. wget        中身は返ってくる?    ← その次

1段ずつ上げていくでしょう。下が駄目なら上は必ず駄目、でも下が良くても上は分からないんだ。

もう1つ言っておくと、ping が使えない相手も増えているよ。

クラウドのサーバー   既定で ICMP を閉じていることが多い企業のネットワーク   外からの ping を全部落とす

隠れているほうが安全だからだね。だから「ping が返らない」だけで結論を出さないでほしいんだ。

ping が返らない  →  死んでいるとは限らないping が返る      →  使えるとは限らない

便利だけれど、それだけでは足りない道具として持っておいてね。

08 / 08

さあ、打ってみよう

この回で使う形をまとめておくね。

ping -c 3 127.0.0.1        3回だけ送るping -c 2 -q 127.0.0.1     要点だけ出すping -c 1 -W 1 相手        返事を1秒だけ待つping -c 1 -s 8 127.0.0.1   小さく送るping -c 1 名前             名前で送るtraceroute 127.0.0.1       通った台数を見る

読むところも並べておくよ。

seq=      何通め(飛んだら落ちている)ttl=      あと何台通れるか(距離が読める)time=     往復の速さ0% packet loss  全部返った

今日いちばん覚えてほしいことは3つだよ。

1. -c を必ず付ける(付けないと止まらない)2. 返ってこない理由は4種類ある3. ping が返っても、使えるとは限らない

そして今日の結論。

> どこまで届いているかを、1段ずつ確かめる

「つながらない」を「名前は引けた・道はあった・返事だけ来ない」に分解する。ここまで言えれば、もう自分で直せるか、正しく人に頼めるでしょう。

この環境では外に出られないので、相手はいつも自分自身だよ。それでも読み方は本物と同じなので、卒業したあとにそのまま使えるからね。

最後の2問では、章11の forif、前のレッスンの logger を組み合わせて死活を見張る道具を作るよ。では打ってみよう。