Show page source of internal24-237-アドレスの解決 #25064

[[PageNavi(internal24-navi)]]

{{{ comment
h2w-title:アドレスの解決
}}}
 

= アドレスの解決 = #SECTION05630000000000000000

上位プロトコル層(IP層など)から、パケット送信のためにネットワークドライバの起動(dev_queue_xmit関数)を行う場合、論理アドレス(IPアドレスなど)とハードウェアアドレス(イーサアドレス)との対応作業が必要である。

下位ハードウェアの種類により、アドレス解決の方法は異なる。複数の解決方法が用意されており、各ドライバは初期化時に下記いずれかの解決方法(操作関数テーブル)を登録する。

||操作関数テーブル || 説明 ||
||arp_hh_ops ||	ARPプロトコルにより、アドレス解決なデバイス用。	一度解決したARP情報をキャッシュとして保存する。	イーサデバイスはこれに含まれる。||
|| arp_direct_ops || 物理アドレスとの対応付けの必要のないデバイスの場合。	1対1の直結線などでハードヘッダ生成不必要のデバイス用。	出力時のアドレス変換作業は行わず、毎回直接dev_queue_xmit関数を	起動する。||
|| arp_generic_ops ||	ハードウェア(ドライバ)レベルでアドレス解決機能を持つことのできる	デバイス用。||

イーサドライバの場合、通常arp_hh_ops が登録される。下図は、IPパケットをイーサへ出力する場合の動作を表している。

 [[Embed(internal24-images:img96.gif)]]
 

IPレイヤの送信処理(ip_finish_output関数)は、送信先のARP情報が登録されていない(dst_entryが空)場合、アドレス解決付の出力関数を呼び出す。(arp_hh_opsが登録されているデバイスの場合、neigh_resolve_output関数を呼び出す。)

  1.  ARPキャッシュ上を検索する。 
    *  ARPキャッシュ上に情報が無い場合、ARPプロトコルによりアドレスの	解決を試みる。arp_solicit関数により、アドレス解決要求パケットを	生成し送出する(arp_send(ARPOP_REQUEST)関数)。
    *  送出すべきパケットは、ARPの返答があるまで、neighbour構造体の	arp_queueメンバに全てリンクしておく。
    *  ARPパケットがロストした時に備え、	ARP再送タイマ(neigh_timer_handler関数)の起動要求を行う。 
  *  ARPキャッシュ上に情報がある場合、 
    *  dst_entryにARP情報を登録。これにより次回のIPレイヤの	送信処理(ip_finish_output関数)からの出力要求は	dev_queue_xmit()が呼び出されるようになる(hh_outputメソッド)。
    *  パケットにハードウェアヘッダを生成し	(net_device構造体の	hard_headerメソッド呼び出し)、	その後、ドライバへパケット送信(dev_queue_xmit関数)を行う。 

アドレス解決要求を出した後、応答がある前に次々とパケット送信要求があった場合は、neighbour構造体の	arp_queueメンバに繋いでおき、実際の送信処理は開始しない(できない)。

ARPパケットが到着した場合、arp_rcv関数が呼び出される。ARPパケットには、先に要求したアドレス解決要求パケットに対する応答(リプライ)の場合と、他のホストから当ホストへのアドレス解決要求である場合がある。

  1.  アドレス解決要求(ar_opがARPOP_REQUEST)の場合 
    *  ARP応答返送経路を検索(ip_route_input関数)する。
    *  ARPキャッシュ(arp_tbl)を検索(neigh_evnet_ns関数)する。
    *  アドレス解決要求の応答を返却する(arp_send(ARPOP_REPLY)関数) 
  *  アドレス解決応答(ar_opがARPOP_REPLY)の場合 
    *  ARPキャッシュ(arp_tbl)を検索(__neigh_lookup関数)し、	ARPキャッシュを更新する(neigh_update関数)。
    *  送信が保留されていたパケットの送信を行う。	neighbour構造体のarp_queueメンバにリンクされている	パケットを外し、ドライバへパケット送信(dev_queue_xmit関数)を行う。 

----

''(NIS)HirokazuTakahashi [[BR]]2000年12月09日 (土) 23時55分06秒 JST''1

[[PageNavi(internal24-navi)]]