猿でもわかる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と何が違うんですか?

Q: ripとの向き不向きは?

ripは小規模ネットワークでは十分役立つプロトコルです。 routedをあげるだけですぐ使えるのはなんといっても楽でしょう。 しかし、中規模以上のネットワーク(例: キャンパス全土)や多重経路のある ネットワークでは不便な点がたくさんあります。

ospfは中規模から大規模のネットワークに適した(つまりバックボーン向きの) プロトコルです。 多重経路のあるネットワークでもちゃんと動作しますが、 設定はそれなりに面倒(他のルータとの協調が必要)です。 ですから、以下のような運用が最も賢いのではないでしょうか:

Q: コストの同じ経路が複数あったら、パケットはどっちを通りますか?

RFCでは実装依存(つまり、どっちでもいいじゃん)と言うことになっています。 gatedはどうやってるのかまだ詳しく見てませんが、調整はできないように見えます。 ルータが複数ある場合には、end hostにripでくべる経路で「xx行きはこっちの ルータにとりあえずおいで」すればある程度最適化は可能ですが、 ripへの吐き変え制御がめんどくさかったら「ほっとく」というのがいちばんです。

Q: gatedのバージョンはなにがおすすめですか?

安心して使いたいひとは3.0.3p2、どきどきしたいひとは3.5alpha10を おすすめします。 両者の違いは知ってる限りで以下の通り:

Q: gatedを動かす前にしないといけないことは?

ふたつの準備が必要です。一つは必須でもうひとつは必須ではありません。
カーネルがudpのチェックサムを正しく取り扱うようにする(必須)
カーネルがudpのチェックサムを取り扱えないと、gated-3は ripを使ってくれません。 このため、ripを使いたいならカーネルがudpのチェックサムを扱えるように しないといけません。

4.3BSD系のOSの場合、udpのチェックサムをまともに扱わせるための 手段として以下があります(番号の若いものほどおすすめ):

  1. カーネルをコンパイルし直す

    /sys/netinet/in_proto.cの

    int udp_cksum = 0;
    の行を
    int udp_cksum = 1;
    にしてカーネルを作り直す。
  2. 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の場合よくしりません。自分で調べてね。
  3. gatedをつくるときに、udp_cksumの値が1であると誤認するように 改造する

  4. 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