猿でもわかるOSPF
$Id: index.j.html,v 1.15 1998/04/15 23:52:40 itojun Exp $
警告:
このページに示した例題はうのみにして実行してはいけません。
あなたのマシン/OSには適用できないかもしれませんし、わたしが間違えてるかも
しれません。
いずれにしても、私は責任を追いかねます。
死して屍拾う者なし。死して屍拾う者なし。
Frequently Asked Questions
Q: ospfって安直に言ってどういうプロトコルですか?
ospfはripと同様、autonomous system内の経路制御を担当するプロトコルです。
各ネットワークに割り付けられたcostという値を用いて
shotest path firstというアルゴリズムで経路を計算し、
もっとも通過するネットワークのcostの総和が少ない経路を選択します。
costは基本的に「ネットワークの伝送速度(バンド幅)」と思えばいいでしょう。
ciscoのマニュアルでは、「10^8/bps」を設定することを
推奨しているので、これに従えばいいでしょう。
つまり、10Mbpsのethernetはcost 10、100MbpsのFDDI/CDDIはcost 1です。
156MbpsのATM網は小数になっちゃいますが、まぁこれはcost 1でいいでしょう。
よっぽど困るなら、一緒にospfで遊ぶみんなで合意を取って計算式を
「10^10/bps」とかにすればいいでしょう。
でもこうするとシリアル回線がすごくおおきい値になりますよ。
Q: ripと何が違うんですか?
- 経路を計算するアルゴリズムが違います。
- 経路を計算する根拠となるデータが違います。
ripはmetric、つまり「通過するネットワークの個数」をもとにしていますが
ospfはcost、つまり「通過するネットワークのバンド幅の累計」を
もとにしています。
- ospfの方がルータの故障時の経路伝搬が速い、と言われています。
- ospfでは多重化した経路があってもただしく経路が計算できます。
ripの場合手でmetricを調整しなければなりません。
- ripの場合metricをいじって「こっちの経路にいけ」ということが
できますが、ospfでは全ルータが同じ経路情報を持っていることを
前提としているので、手で「こっちの経路にいけ」と言うことはできません。
また、このため特定の経路を特定のホストから見えなくしたりすることは
できません。
Q: ripとの向き不向きは?
ripは小規模ネットワークでは十分役立つプロトコルです。
routedをあげるだけですぐ使えるのはなんといっても楽でしょう。
しかし、中規模以上のネットワーク(例: キャンパス全土)や多重経路のある
ネットワークでは不便な点がたくさんあります。
ospfは中規模から大規模のネットワークに適した(つまりバックボーン向きの)
プロトコルです。
多重経路のあるネットワークでもちゃんと動作しますが、
設定はそれなりに面倒(他のルータとの協調が必要)です。
ですから、以下のような運用が最も賢いのではないでしょうか:
- バックボーンのルータはospfで経路を交換する
- 研究室の入口ルータはospfで経路を交換し、研究室内へだけripを流す
- 研究室内のend hostはroutedをあげてripを聞く
Q: コストの同じ経路が複数あったら、パケットはどっちを通りますか?
RFCでは実装依存(つまり、どっちでもいいじゃん)と言うことになっています。
gatedはどうやってるのかまだ詳しく見てませんが、調整はできないように見えます。
ルータが複数ある場合には、end hostにripでくべる経路で「xx行きはこっちの
ルータにとりあえずおいで」すればある程度最適化は可能ですが、
ripへの吐き変え制御がめんどくさかったら「ほっとく」というのがいちばんです。
Q: gatedのバージョンはなにがおすすめですか?
安心して使いたいひとは3.0.3p2、どきどきしたいひとは3.5alpha10を
おすすめします。
両者の違いは知ってる限りで以下の通り:
- gated.confの書式が一部違う(interface節ほか)
Q: gatedを動かす前にしないといけないことは?
ふたつの準備が必要です。一つは必須でもうひとつは必須ではありません。
- カーネルがudpのチェックサムを正しく取り扱うようにする(必須)
- カーネルがudpのチェックサムを取り扱えないと、gated-3は
ripを使ってくれません。
このため、ripを使いたいならカーネルがudpのチェックサムを扱えるように
しないといけません。
4.3BSD系のOSの場合、udpのチェックサムをまともに扱わせるための
手段として以下があります(番号の若いものほどおすすめ):
- カーネルをコンパイルし直す
/sys/netinet/in_proto.cの
int udp_cksum = 0;
の行を
int udp_cksum = 1;
にしてカーネルを作り直す。
- gatedを起動する前に、/etc/rc*かなんかの中で、dbx/adb/gdbを
使ってメモリ中のカーネルを書き換える
dbxの場合、以下のようにします:
# echo 'assign udp_cksum = 1' | dbx -k /vmunix
adbの場合、以下のようにします:
# echo 'udp_cksum/W1' | adb -k -w /vmunix /dev/mem
gdbの場合よくしりません。自分で調べてね。
- gatedをつくるときに、udp_cksumの値が1であると誤認するように
改造する
- dbx/gdbを使って/vmunixを書き換えてリブート
絶対あとでカーネルを作りなおすときに書き換えるのを忘れて
たいへんなメにあうのでおすすめしません。
ちなみに、Sony NEWS-OS 4.2.1では
/sys/netinet/in_proto.cが提供されないため、カーネルソース
書き換えによる解決はできません。
また、adbもないためdbxまたはgdbによる解決しかできません。あう。
- カーネルがマルチキャストを扱えるようにする(必須ではない)
- ospfではマルチキャストによる経路情報交換を推奨しています。
これを使うためにはカーネルがマルチキャストを扱えないといけません。
別にマルチキャストを使わなくても、経路情報を交換させたい隣接する
ルータどうし互いをgated.confで指定しあえばいちおうospfできますので、
小規模なネットワークであればマルチキャストを使う必要はありません
(ciscoはhello protocolで勝手にルータを発見してくれるので、
隣接ルータを指定しなくて平気です)。
ただ、経験上ときどきルータの発見に失敗することがあるようです。
(itojunはマルチキャストに疎いので誰か教えて欲しい)
Q: gated.confの文法チェックだけをしたいです。
# gated -C
しましょう。
Q: いま書いたgated.confを使って、どういう動作をするのか
カーネル内の経路表を書き換えないでテストがしたいです。
# gated -n -N
しましょう
(-n: カーネル内の経路表をかきかえない、
-N: daemonにならない)。
Q: gatedの現在の内部状態を知りたいです。
rootになって
# gdc dump
しましょう。/var/tmp/gated.dumpあたりにgatedの内部情報がたっぷりと
出力されます。
References
Authors
(旧タイトル "OSPF for du**ies" はlawsuit threatのため取り除かれました。
ばかばかしいったらありゃしねえ)
In English