Provided by: manpages-ja_0.5.0.0.20131015+dfsg-2_all
名前
arp - Linux ARP カーネルモジュール
説明
このカーネルプロトコルモジュールは、 RFC 826 で定義されている Address Resolution Protocol を 実装したものである。 ARP は、ダイレクトに接続されたネットワーク上で、 第 2 層のハード ウェアアドレスをIPv4 プロトコルアドレスに 変換するために用いられる。ユーザーは設定の場合を 除いて 通常直接このモジュールに関ることはない。 これはカーネル内部の他のプロトコルにサービ スを提供するものである。 ユーザープロセスは、 packet(7) ソケットを用いれば ARP パケットを受信することができる。 ARP キャッシュをユーザー空間で管理することもできる。 これには netlink(7) を用いる。 ARP テーブルも制御可能で、これには任意の AF_INET ソケットに ioctl(2) を用いる。 ARP モジュールはハードウェアアドレスからプロトコルアドレスへの マッピングのキャッシュを管 理する。キャッシュの大きさには制限が あるので、古いエントリや利用されないエントリはガベー ジコレクト される。 permanent (保存) マークがつけられたエントリは、 決してガベージコレクタ によって消去されない。 ioctl を用いればキャッシュを直接操作することもできる。 また後述の /proc インタフェースによりキャッシュの振る舞いを調整できる。 存在しているマッピングに対して、 正のフィードバックが一定時間ない (後述の /proc インタ フェースを見よ) と、 近傍キャッシュエントリ (neighbor cache entry) は 古くなった (stale) とみなされる。 正のフィードバックは高位のレイヤーからも取得できる (例えば TCP ACK が成功し た場合など)。 他のプロトコルは、 sendmsg(2) に MSG_CONFIRM フラグを用いることによって、 フォワードプログレス (forward progress) をシグナルできる。 フォワードプログレスがなけれ ば、 ARP は再びプローブを試みる。 まずローカルな arp デーモンに問合わせを行い、 更新された MAC アドレスを取得しようとする。 このリクエストに app_solicit 回失敗すると、古い MAC アド レスがわかっている場合は、 unicast のプローブが ucaset_solicit 回送られる。これにも失敗す ると、新しい ARP リクエスト をネットワークにブロードキャストする。 リクエストは、データが 送信キューにある場合のみ送られる。 Linux は、あるアドレスへのリクエストを受信・フォワードし、 受信したインターフェースで代理 arp が有効になっている場合には、 自動的にそのアドレスを nonpermanent な代理 arp エントリに 追加する。 そのターゲットに reject route があった場合には、 代理 arp エントリは一切追加さ れない。 ioctl すべての AF_INET ソケットでは、 3 つの ioctl が使用できる。 これらは struct arpreq へのポ インタを引数に取る。 struct arpreq { struct sockaddr arp_pa; /* protocol address */ struct sockaddr arp_ha; /* hardware address */ int arp_flags; /* flags */ struct sockaddr arp_netmask; /* netmask of protocol address */ char arp_dev[16]; }; SIOCSARP, SIOCDARP, SIOCGARP は、それぞれ ARP マッピングを設定・削除・取得する。 ARP マッ プの設定と削除は特権が必要な操作であり、 CAP_NET_ADMIN 権限を持つプロセスか、実行ユーザー ID が 0 のプロセス でなければ実行できない。 arp_pa は AF_INET アドレスでなければならず、 arp_ha は arp_dev で設定されたデバイスと同じ タイプでなければならない。 arp_dev はデバイスの名前を示す、ゼロで終端された文字列である。 ┌───────────────────────────────────────────────┐ │ arp_flags │ ├────────────────┬──────────────────────────────┤ │フラグ │ 意味 │ ├────────────────┼──────────────────────────────┤ │ATF_COM │ 参照完了 │ ├────────────────┼──────────────────────────────┤ │ATF_PERM │ エントリを peramanent にする │ ├────────────────┼──────────────────────────────┤ │ATF_PUBL │ エントリを publish する │ ├────────────────┼──────────────────────────────┤ │ATF_USETRAILERS │ trailer が必要 │ ├────────────────┼──────────────────────────────┤ │ATF_NETMASK │ netmask を用いる │ ├────────────────┼──────────────────────────────┤ │ATF_DONTPUB │ 回答しない │ └────────────────┴──────────────────────────────┘ ATF_NETMASK フラグがセットされているときには、 arp_netmask が有効でなければならない。 Linux 2.2 は代理ネットワーク ARP エントリをサポートしていないので、 これは 0xffffffff に セットしておくか、あるいは 現存の代理 arp エントリを削除したい場合には 0 にしておく必要が ある。 ATF_USETRAILERS は obsolete なので、用いるべきでない。 /proc インタフェース ARP では、グローバルなパラメータやインターフェースごとのパラメータを /proc インタフェース を通して設定することができる。 これらのインタフェースには、 proc/sys/net/ipv4/neigh/*/* ファイルの読み書きによりアクセスできる。 システムにあるそれぞれのインターフェースには、 そ れぞれ対応するディレクトリが /proc/sys/net/ipv4/neigh/ 以下にある。 "default" ディレクトリ に対して設定をすると、 それ以降生成されるデバイス全てに対してその設定が用いられる。 特に指 定がなければ、時間に関る sysctl の単位は秒である。 anycast_delay (Linux 2.2 以降) IPv6 の近傍要請メッセージ (neighbor soliciation message) に応答するまでの最大遅延 時間 (jiffy 単位)。 anycast のサポートはまだ実装されていない。 デフォルトは 1 秒。 app_solicit (Linux 2.2 以降) ユーザー空間の ARP デーモンに netlink を用いて探索させる最大回数。 これを越えるとマ ルチキャストによる探索に移行する (mcast_solicit を見よ)。 base_reachable_time (Linux 2.2 以降) 近傍のホストがみつかると、そのエントリは base_reachable_time/2 から 3*base_reachable_time/2 の間のランダムな値の時間、有効であるとみなされる。 エントリ の有効性は、高位のプロトコルからポジティブなフィードバックを 受け取ると延長され る。デフォルトは 30 秒。 このファイルは現在は非推奨であり、代わりに base_reachable_time_ms を使うこと。 base_reachable_time_ms (Linux 2.6.12 以降) base_reachable_time と同じだが、時間をミリ秒単位で測る。 デフォルトは 30000 ミリ秒 である。 delay_first_probe_time (Linux 2.2 以降) 近傍ホストのエントリが古くなったと判断された後に 最初に探索を行うまでの遅延時間。デ フォルトは 5 秒。 gc_interval (Linux 2.2 以降) ガベージ・コレクタを近傍ホストエントリに対して実行させる頻度。 デフォルトは 30 秒。 gc_stale_time (Linux 2.2 以降) 古くなった近傍ホストエントリに対してチェックを行う頻度。 近傍ホストエントリが古く なったとみなされると、そのエントリに データを送る前には再度解決が行われる。 デフォ ルトは 60 秒。 gc_thresh1 (Linux 2.2 以降) ARP キャッシュに保存するエントリ数の最小値。 この数より少ないエントリしかキャッシュ になければ、 ガベージ・コレクタは実行されない。 デフォルトは 128。 gc_thresh2 (Linux 2.2 以降) ARP キャッシュに保存されるエントリ数のソフトな最大値。 キャッシュのエントリがこの数 を 5 秒間越えつづけると、 ガベージ・コレクタが実行される。 デフォルトは 512。 gc_thresh3 (Linux 2.2 以降) ARP キャッシュに保存されるエントリ数のハードな最大値。 キャッシュのエントリがこの数 を越えると、 ガベージ・コレクタはただちに実行される。 デフォルトは 1024。 locktime (Linux 2.2 以降) ARP エントリをキャッシュに保存する時間の最小値 (jiffy 単位)。 可能性のあるマッピン グが一つ以上ある (たいていはネットワーク設定のミス) 場合に、 ARP キャッシュのスラッ シングが起きることを防ぐ。 デフォルトは 1 秒。 mcast_solicit (Linux 2.2 以降) エントリを unreachable マークする前に、 アドレスをマルチキャスト/ブロードキャストで 解決しようとする 試行回数の最大値。 デフォルトは 3。 proxy_delay (Linux 2.2 以降) 既知の代理 ARP アドレスに対して ARP リクエストを受信した場合に、 応答前に最大 proxy_delay jiffy まで遅延する。これは場合によって生じる ネットワーク・フラッディン グ (network flooding) を避けるために用いる。 デフォルトは 0.8 秒。 proxy_qlen (Linux 2.2 以降) 代理 ARP アドレスに対してキューイングできる最大のパケット数。 デフォルトは 64。 retrans_time (Linux 2.2 以降) リクエストを再度送るまでの遅延時間 (jiffy 単位)。 デフォルトは 1 秒。 このファイル は現在は非推奨であり、代わりに retrans_time_ms を使うこと。 retrans_time_ms (Linux 2.6.12 以降) リクエストを再度送るまでの遅延時間 (ミリ秒単位)。 デフォルトは 1000 ミリ秒。 ucast_solicit (Linux 2.2 以降) ARP デーモンへの問い合わせを行う前に行う unicast 探索の最大試行数 (app_solicit を見 よ)。デフォルトは 3。 unres_qlen (Linux 2.2 以降) 解決されていないアドレスに対して、 他のネットワーク層からキューイングできる最大パ ケット数。 デフォルトは 3。
バージョン
Linux 2.0 で、 struct arpreq に arp_dev メンバーが含まれるように変更があった。また同時に ioctl 番号も変更された。古い ioctl は Linux 2.2 で用いることができなくなった。 ネットワークに対する代理 arp エントリ (netmask が 0xffffffff でない) は、 Linux 2.2 で用 いることができなくなった。 これはカーネルによって設定される、別のインターフェースにおける 到達可能なすべてのホストに対する自動代理 arp によって置き換えられた (そのインターフェース でフォワーディングと代理 arp が有効になっている場合)。 neigh/* の各インタフェースは Linux 2.2 以前には存在しない。
バグ
いくつかのタイマー設定は jiffy で指定されるが、 jiffy はアーキテクチャやカーネルのバージョ ンに依存する。 time(7) を参照のこと。 ユーザー空間からポジティブなフィードバックを送る方法が存在しない。 つまり接続指向 (connection-oriented) のプロトコルをユーザー空間で 実装すると、余計な ARP トラフィックの原 因となる。 なぜなら ndisc は定期的に MAC アドレスを再探索するからである。 同様の問題はいく つかのカーネルプロトコル (NFS over UDP など) にも存在する。 この man ページでは IPv4 特有の機能と IPv4・IPv6 で共有される機能とがごっちゃになってい る。
関連項目
capabilities(7), ip(7) RFC 826: ARP の説明。 RFC 2461: IPv6 neighbor discovery の説明と利用されている基礎アルゴ リズム。 Linux 2.2 以降では IPv4 ARP は可能な場合は IPv6 アルゴリズムを使っている。
この文書について
この man ページは Linux man-pages プロジェクトのリリース 3.54 の一部 である。プロジェクト の説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。