STCPには以前からIPアドレスの重複検出機能がありましたが、MicrosoftWindows 動作変更により、興味深い問題が生じました。
まずは、その仕組みを確認しましょう。
重複IPアドレスの検出は、アドレス解決プロトコル(ARP)に依存しています。
packet_monitor ツールは、ARPパケットを2行で次のように表示します。
11:13:43.123 イーサネット受信 宛先 ff:ff:ff:ff:ff:ff 送信元 00:13:d4:59:7a:da タイプ 0806 (ARP)
ARP要求 宛先 164.152.77.217 送信元 164.152.77.34 [00:13:d4:59:7a:da]
どこ
|
STCPは Src フィールドを確認し、受信元のインターフェースのIPアドレスと一致する場合、STCPはsyserr_logに重複IPアドレスを報告します。その際のメッセージ形式は以下の通りです。
<time> WARNING (<index>): MAC address <MAC address> is using our IP address <IP address>
例えば:
11:13:43 警告(5): MACアドレス 00:13:d4:59:7a:da が、当社のIPアドレス 164.152.77.34 を使用しています
「MAC」はMedia Access Control(メディアアクセス制御)の略であり、MACアドレスが分かれば、問題を引き起こしているホストの特定に役立つ手がかりが得られます。アドレスの最初の3バイトはOrganizationally Unique Identifier(OUI)と呼ばれ、イーサネットカードや、それが搭載されているホストに関する情報を特定するために利用できます。 例えば、Stratus社には00-00-A8と00-04-FCの2つのOUIが登録されています。OUIはhttp://standards.ieee.org/develop/regauth/oui/public.htmlで検索できます。
STCPを含む多くのホストは、起動時やIPインターフェースが設定された際に、いわゆる「グラチュイタスARP」を送信します。このフレームは基本的に自身のIPアドレスを検索するもので、応答があればそのIPアドレスが使用中であることを認識します。以下は、別のVOSモジュールが自身のインターフェースを起動する際に送信したグラチュイタスARPを示す、packet_monitorのトレース例です。なお、 Target と Src フィールドの両方に同じIPアドレスが設定されている点に注意してください。
10:19:53.045 イーサネット受信 宛先 ff:ff:ff:ff:ff:ff 送信元 00:00:a8:41:3b:6e タイプ 0806 (ARP)
ARP要求 宛先 164.152.77.34 送信元 164.152.77.34 [00:00:a8:41:3b:6e]
さて、この投稿の冒頭で触れた「問題点」とは一体何でしょうか?
Windows およびWindows 以降、Microsoft の TCP スタックは、Src フィールドを 0.0.0.0に設定して、グラチュイタスARPを送信します。
10:45:10.530 イーサネット受信 宛先 ff:ff:ff:ff:ff:ff 送信元 1c:c1:de:b4:76:60 タイプ 0806 (ARP)
ARP要求 宛先 164.152.77.34 送信元 0.0.0.0 [1c:c1:de:b4:76:60]
その結果、STCPはこれを自身のイーサネットアドレスに対する「通常の」クエリであると判断し、通常の応答を返す
10:45:10.530 送信 イーサネット 宛先 1c:c1:de:b4:76:60 送信元 00:00:a8:41:3b:6e タイプ 0806 (ARP)
ARP応答 宛先 0.0.0.0 [1c:c1:de:b4:76:60] 送信元 164.152.77.34 [00:00:a8:41:3b:6e]
重複するIPアドレスの兆候は記録されていません。幸いなことに、Windows 重複を認識し、169.254.X.Yという形式のリンクローカルアドレスに切り替わります。
マイクロソフトはなぜこの変更を行ったのでしょうか?多くのTCPスタック(STCPを含む)は、送信元IPアドレスのARPキャッシュエントリを、ARPフレームに含まれるイーサネットアドレスで更新するようです。もしそのIPアドレスが重複している場合、パケットが重複しているホストにリダイレクトされてしまうため、そのIPアドレスへの現在の接続が切断されてしまうことになります。 Srcフィールドを0.0.0.0に変更することで、マイクロソフトはTCPスタック(STCPを含む)がARPキャッシュエントリを更新するのを防いでいます。
