arp

仕事であるルータのarpキャッシュエントリの最大数の登録を試験することになった。ちなみにその最大値は16384である。どうやってやろうか。16384のarpキャッシュが登録されるのはどういう場合か。

まず、16384の異なるホストに対して通信を行う事が必要である。しかも、キャッシュは一定時間でクリアされるから、その時間内に16384個のホストにarp requestを送信し、replyを受け取らねばならない。

そして、arpを送信するという事は、同一サブネットに存在するホストでなければならない。

ルータのインタフェースを、16384個のホストが存在するネットワークにつなげばよいのだが、もちろんそれは非現実的な事である。さいわい職場にはトラフィックジェネレータがある。これで実際に存在しないホストやNWを模したトラフィックを送信することができる。

まず最初に、arp replyを一方的に送りつけてみたが、これではキャッシュに登録されなかった。やはり、requestを送信したものに対するreplyでなければならない。そのジェネレータには、portの設定でどんなarp requestに対してもreplyを返すという設定がある。そうしておけば、存在しないアドレスであってもreplyが返ってきてキャッシュに登録される。

まず、そのポートに向けてpingを打ってみた。ホストが存在しておらずicmp echo replyが返ってこなくても、先程のarp replyの設定によりarp キャッシュには登録される。pingを16384個のhost宛に打てばそれがすべてarpキャッシュに登録される・・・。

しかしそこで考えてみよう。16384回のpingを、arpキャッシュが消えるまでに打たねばならない。そしてその時間は5分以下である。5分で16384回ということは・・・54.6/秒。無理だ。回数とtime out待ち時間を最小にしても絶対にそんな数のpingは実行できない。

pingは無理なので、別のインタフェースにトラフィックを流してarp cacheを登録させたいi/fに転送させることにした。そのトラフィックもジェネレーターで作り、宛先IPアドレスをincrementさせる。16384個のアドレスということは、いつも使っている/24では足りない。とりあえず/8にすれば足りるだろうと/8にしたが、必要最小限なのはいくつだろうか?/16で65536,だから、その半分の半分、/18になる。しかし実際使えるのは16384-2だから、/17ということになる。

トラフィックはFEポートの10%のレート、つまり10Mbpsで流したが、あっという間にキャッシュはMAX値まで増えた。正確には16383までである。なぜひとつ足りないかというと、事前にトラフィック受信側のi/fにpingを打っていて、そこで登録された1個が含まれるからである。そこで16383までいったら受信側のi/fからケーブルを抜いて、あと1個のarpキャッシュエントリを追加するために、存在しないと思われるアドレス宛にpingを打って、めでたく16384件が登録された。実はこの試験はいままでに一度も確認できたことがなかった。私初めてこの限界に到達したのである。