荷物の仕分けは全体を考えない
物流センターの仕分け機は、荷札の郵便番号を読んで、荷物を一本のベルトに流します。目的地までの道のり全部は考えません。
ルーターもパケットに対して同じことをします。宛先のアドレスを読み、表から一行を選び、次へ渡します。
途中のルーターも、それぞれ同じ仕事を繰り返します。
このレッスンのゴール
メモ
ルーティングテーブルを読んで、パケットが通る経路を選ぶことができる。
重要な言葉
| ことば | いみ | れい |
|---|---|---|
| ルーティングテーブル | ルーターが持つ、行き先ごとの送り方の一覧 | |
| 次のホップ | パケットを次に受け取る、隣のルーター | via 10.0.1.1 |
| 直接つながった経路 | ルーターが直接つながっているネットワーク | |
| 静的経路 | 人が手で書いた経路 | |
| デフォルト経路 | 他にどの行も合わないときに使う行 | 0.0.0.0/0 |
| 最長一致 | 合う行のうち、ネットワークのビットが一番多い行を選ぶ決まり |
学生が入力するセルは、このプレビューでは空白です。
機器は直接かゲートウェイへ
機器は、まず一つ確かめます。宛先は自分と同じネットワークにあるか、です。
同じなら、直接送ります。違うなら、同じネットワークにいるルーターであるデフォルトゲートウェイへ送ります。
機器は、その先の道のりまでは考えません。
h1の経路を読む
sudo ip netns exec h1 ip routeここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
h1の送り先を聞く
sudo ip netns exec h1 ip route get 10.0.3.2ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
答えを読む
最初の実行は2行を出します。一つは h1 がいるネットワーク、もう一つは default via 10.0.1.1 で始まる行です。それ以外はすべて r1 へ送ります。
次の実行は 10.0.3.2 via 10.0.1.1 dev to-r1 で始まります。via の後ろが次のホップです。
ルーターは表に従う
ルーターには、いくつものインターフェース(口)と、ルーティングテーブルがあります。表の一行は「このネットワークなら、こちらへ」と言います。
設定する前のルーターが持つのは、直接つながった経路だけです。他のネットワークは、人が静的経路を足すか、プロトコルが経路を教えて、はじめて知ります。
行が無いネットワークには、パケットを転送できません。
例: ルーターの最初の表
| ネットワーク | 次のホップ | 種類 |
|---|---|---|
| 10.0.1.0/24 | 直接、to-h1 | 直接つながった経路 |
| 10.0.12.0/24 | 直接、to-r2 | 直接つながった経路 |
| 10.0.3.0/24 | なし | 行が無いので行けない |
学生が入力するセルは、このプレビューでは空白です。
r1の表をコンソールで読む
sudo vtysh -N r1 -c "show ip route"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
r1に知らない先を聞く
sudo ip netns exec r1 ip route get 10.0.3.2ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
h1から本物のパケットを送る
sudo ip netns exec h1 ping -c 2 -W 1 10.0.3.2ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
行が無ければ行けない
コンソールは r1 の4行を出します。2行は直接つながった経路の C、2行はルーター自身のアドレスの L で始まります。
ip route get の実行は RTNETLINK answers: Network is unreachable を出します。表に 10.0.3.2 の行が無いので、r1 には送り先がありません。
pingは、同じ穴を機器の側から見せます。返事はどれも From 10.0.1.1 で始まり、Destination Net Unreachable で終わります。
一番長く合う行が勝つ
一つのアドレスに、いくつもの行が合うことがあります。ルーターは、ネットワークを一番細かく指す行、つまり最長一致の行を選びます。
デフォルト経路 0.0.0.0/0 はプレフィックスが0ビットで、何にでも合います。だから他に合う行があれば負け、最後の手段になります。
よくある間違い
注意
「最初に合った行が勝つ」と思う人が多いです。ルーターは上から読みません。全部の行を見て、一番長く合う行を選びます。表の行の順番を変えても、答えは変わりません。
例: どの行が勝つか
| 宛先 | 合う行 | 勝つ行 |
|---|---|---|
| 10.0.3.200 | 0.0.0.0/0, 10.0.0.0/8, 10.0.3.0/24, 10.0.3.128/25 | 10.0.3.128/25 |
| 10.0.3.5 | 0.0.0.0/0, 10.0.0.0/8, 10.0.3.0/24 | 10.0.3.0/24 |
| 10.9.9.9 | 0.0.0.0/0, 10.0.0.0/8 | 10.0.0.0/8 |
| 8.8.8.8 | 0.0.0.0/0 | 0.0.0.0/0 |
学生が入力するセルは、このプレビューでは空白です。
発展: なぜその行が勝ったか
pick_route を写して、新しい関数 explain_route を作りましょう。次のホップだけでなく、勝った行全体を返します。
テストの TABLE で、10.0.3.129、10.0.3.127、10.200.0.1、1.1.1.1 を調べます。それぞれについて、合った行をすべて挙げ、勝った行がなぜ他に勝ったかを一文で書きましょう。