イーサネット経由でIP通信を行うすべてのホストには、何らかの形でARPキャッシュが存在します。このキャッシュには、IPアドレスとイーサネットのメディアアクセス制御(MAC)アドレスの対応関係が格納されています。 SERVER-1という名前のホストでイーサネットアダプタを交換したり、SERVER-1を新しい/高速なハードウェアに置き換えたりすると、SERVER-1と通信するローカルイーサネットセグメント上のすべてのホストで、ARPキャッシュの更新が必要になります。SERVER-1は、すべてのホストを更新するための グレイタスARPパケットを送信 する かもしれませんが 、イーサネットである以上、ARPパケットが破損したり単にドロップされたりする可能性があるため、これに頼ることはできません。
OpenVOSのSTCPスタック内のARPキャッシュエントリの有効期間は10分間です。つまり、10分経過すると自動的に削除され、次にパケットを送信する必要が生じた際に再度追加されます。ARPキャッシュを表示すると、各エントリの残り時間が表示されます。 したがって、最悪の場合、SERVER-1を変更した後、古い(誤った)マッピングが期限切れになり、新しい(正しい)マッピングが追加されるまでに10分かかることになります。その間、SERVER-1との通信は不可能になります。
arp -deleteコマンドを使用すると、指定したエントリを削除できます。図 1 は、MAC アドレスと有効期限を表示するarpコマンドの実行例、続いてそのエントリを削除するarp -deleteコマンドの実行例、そしてキャッシュにエントリがもう存在しないことを示すarpコマンドの実行例を示しています。
arp 192.168.50.5 インターネットアドレス MACアドレス タイプ 有効期間 192.168.50.5 00-04-96-1F-67-0C 一時 6 分 準備完了 14:01:30 arp -delete 192.168.50.5 192.168.50.5 のマッピングを削除しました 準備完了 14:01:39 arp 192.168.50.5 arp: 192.168.50.5 のマッピングはありません 準備完了 14:01:44 |
| 図1 – 「arp」および「arp -delete」コマンド |
以前のTCP_OSスタックには、ARPキャッシュ内のすべてのエントリを削除する「arp -flush」コマンドがありました。削除すべきエントリが複数ある場合、それらをまとめて削除した方が(入力の手間が省けて)簡単です。 エントリは必要に応じて自動的に追加されるため、この方法の唯一の欠点は、ネットワーク上で数パケット分余分なトラフィックが発生することと、最初のパケットを送信する際に(ARPキャッシュが再構築される間)若干の遅延が生じることです。入力する側の視点から見れば、欠点は全くありません。
STCPスタックにはフラッシュオプションがありません
---------------------------------- arp ---------------------------------\ ホスト名:\ -all: いいえ\ -network:\ -delete: いいえ\ -set: いいえ\ mac_addr: |
| 図2 – STCP arp コマンドの形式 |
そこで、これを実行するための簡単なマクロ(図3)を作成しました。このマクロは、`arp -all` の出力をプロセスディレクトリ内のファイルにリダイレクトし、そのファイルを解析してIPアドレスを抽出します。そして、各アドレスに対して`arp -delete`を実行します。処理が完了する頃には、一部のエントリが復活しているかもしれませんが、それらはすべて最新のマッピングで更新されているはずです。
& arp_flush.cm はここから開始します & & バージョン 1.00 2017年4月11日 & [email protected] & & このスクリプトは、各エントリを個別に削除することで ARP キャッシュをクリアします。 & 処理が完了する頃には、一部のエントリが再び表示されるようになります。 & & & 本ソフトウェアは「現状有姿」で提供され、いかなる保証も、またいかなる種類のサポートも提供されません。作者は、商品性および特定目的への適合性に関する黙示の保証を明示的に否認します。 & この免責事項は、作者またはその他の者によるいかなる口頭での表明があっても、適用されます。 & & &set_string FILE (process_dir)>arp_list attach_default_output &FILE& arp -all detach_default_output &set LINE 2 &label again &set LINE (calc &LINE& + 1) &set_string IP (substr (contents &FILE& &LINE& -hold) 1 16) &if (end_of_file &FILE&) = 1 &then &return &if (length X&IP&) = 1 &then &return arp -delete &IP& &goto again & & arp_flush.cm はここで終了します |
| 図3 – arp_flush コマンドマクロ |
図4は、ARPキャッシュの内容を確認するための「arp -all」コマンドの実行例を示しています。続いて「arp_flush」マクロを実行し、さらに「arp -all」を再度実行した結果です。2回目の「arp -all」では、すべての有効期限が10分になっていることに注目してください。スペースを節約するため、最初の「arp -all」および「arp_flush」の出力から多くの行を削除しました。
arp -all インターネットアドレス MACアドレス タイプ 有効期限 10.10.1.200 00-90-E8-1F-4B-EA 一時 8 分 192.168.50.1 00-04-96-19-0B-20 一時 10 分 192.168.50.4 00-04-96-35-3F-B5 一時 1 分 192.168.50.2 00-04-96-20-C7-EC 一時 4 分 192.168.50.19 00-0C-29-6B-CA-AE 一時的 6 分 192.168.50.21 00-23-54-79-C5-81 一時的 7 分 . . . . . 192.168.51.252 00-50-56-BB-4D-8C 一時的 5 分 192.168.51.253 00-0C-29-86-AD-CC 一時的 3 分 準備完了 13:46:14 arp_flush 10.10.1.200 のマッピングが削除されました 192.168.50.1 のマッピングが削除されました 192.168.50.4 のマッピングが削除されました 192.168.50.2 のマッピングが削除されました 192.168.50.19 のマッピングが削除されました 192.168.50.21 のマッピングが削除されました . . . . . . . 192.168.51.252 のマッピングが削除されました 192.168.51.253 のマッピングが削除されました 準備完了 13:46:23 arp -all インターネットアドレス MACアドレス タイプ 有効期間 192.168.50.2 00-04-96-20-C7-EC 一時 10 分 192.168.51.4 00-04-FC-01-02-3E 一時 10 分 192.168.51.11 00-00-A8-80-80-4A 一時 10 分 192.168.51.49 00-50-56-46-08-2C 一時的 10 分 192.168.51.50 00-23-54-52-18-6E 一時的 10 分 192.168.51.76 00-23-54-52-1B-F5 一時 10 分 192.168.51.100 00-0C-29-A9-85-44 一時 10 分 192.168.51.128 00-00-A8-43-52-22 一時 10 分 192.168.51.158 00-26-B9-BC-B7-37 一時 10 分 192.168.51.180 5C-26-0A-06-BD-29 一時的 10分 192.168.51.203 00-00-A8-C0-86-A1 一時的 10分 準備完了 13:46:27 |
| 図4 – arp_flush コマンドマクロの実行 |
