受信処理時のルーティング

あるパケットを受信したとき、そのパケットを自ホストで受信するのか、それとも他のホストへ転送するのかを解決しなければならない。また転送する場合、通常のパケット送信処理と同じく以下のことも解決しなければならない。

  • どのネットワークインターフェイスから送信すべきか?
  • ホストが同じネットワーク上にないとき、どのゲートウェイマシンに 対してパケットを送信すべきか?

パケット受信(ip_rcv)時には、ルーティング情報を検索(ip_route_input関数)し、経路情報(rtable構造体)を入手する。入手した経路情報(rtable構造体)はパケット(sk_buff)にリンクされ、以後この経路情報に従って処理が行われる。

  1. ip_route_input関数は、まずルーティングキャッシュ(rt_hash_table)に 目的とするルーティングテーブル(rtable)が登録されていないか検索する。 ルーティングキャッシュは、発信元アドレス/送信先アドレス/ インターフェイス情報を元にキャッシュされている。
  2. ルーティングキャッシュ(rt_hash_table)に目的とするルーティング情報が キャッシュされていない場合、大元のルーティングテーブル (フォワーディングインフォメーションベース - fib -と呼んでいる) からルーティング情報を引き出す操作(ip_route_input_slow関数) を行う。
    1. fibテーブルを検索(fib_lookup関数)し、目的のアドレスへ送信 するための経路情報を求める。fib_lookup関数はlocal_table, main_tableの両方を検索する。
    2. 発信アドレスを元に、発信元となるアドレスに対応する ネットワークインターフェイスが存在するか確認する(ip_dev_find関数)。 (local_tableを検索)。
    3. 発信元のアドレスが正しいかチェックする(fib_validate_source関数)。
    4. 経路情報に従い、入出力関数を登録する。
      • ローカルマシンへの配送なら、入力関数として ip_local_deliver関数を登録する。
      • 他マシンへの転送なら、入力関数としてip_forward関数を 出力関数としてip_output関数を登録する。
    • fibテーブルから得た情報を元に、ゲートウェイ情報、MTU情報、 ウィンドウサイズ情報、RTT情報を反映させる(rt_set_nexthop関数)。
    • fibテーブル上に、ルーティング情報が見つかった場合、 rtable構造体を一つ確保(dst_alloc関数)し、ルーティング キャッシュ(rt_hash_table)に登録(rt_intern_hash関数)する。

(NIS)HirokazuTakahashi
2000年06月11日 (日) 22時29分57秒 JST
1