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

あるパケットを目的のホストへ送信するとき、以下のことを解決しなければならない。

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

パケット送信時にはソケットが持つルーティング情報(rtable構造体)とパケットのリンクを行い、その後そのルーティング情報に従い、送信処理を行う。

ルーティング情報検索高速化のため、ソケットのコネクション確立時、またはIPパケット送信(ip_queue_xmit関数)時にルーティング情報(rtable構造体)を入手(ip_route_output関数)し、ソケットにリンクしておく。

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

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