STCP有重复的IP地址检测相当长的一段时间,但微软Windows 2008和7的行为方式的变化,增加了一个有趣的皱纹。
首先我们来回顾一下它的工作原理。
重复的IP地址检测依赖于地址解析协议(ARP)。
packet_monitor工具将一个ARP数据包分成两行显示,分别是
11:13:43.123 Rcvd Ether Dst ff:ff:ff:ff:ff:ff:ff:ff Src 00:13:d4:59:7a:da 类型 0806 (ARP)
ARP Req Target 164.152.77.217 Src 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"代表媒体访问控制,知道了MAC地址,就可以得到一些线索,知道违规主机的身份。地址的前3个字节被称为组织上的唯一标识符(OUI),可以用来确定以太网卡或它所在的主机的一些情况。例如,Stratus 有两个注册的 OUI,00-00-A8 和 00-04-FC。您可以在http://standards.ieee.org/develop/regauth/oui/public.html查询任何 OUI。
包括STCP在内的很多主机在启动或者配置IP接口的时候,都会发送所谓的无偿ARP。这个帧基本上是寻找自己的IP地址,如果得到回复就知道这个IP地址在使用中。下面是一个packet_monitor跟踪的例子,它显示了另一个VOS模块发送的无偿ARP,因为它带来了它的一个接口。请注意,这两个 目标和 Src字段具有相同的IP地址。
10:19:53.045 Rcvd Ether Dst ff:ff:ff:ff:ff:ff:ff:ff Src 00:00:a8:41:3b:6e Type 0806 (ARP)
ARP Req 目标 164.152.77.34Src 164.152.77.34[00:00:a8:41:3b:6e]
好了,那么我在文章开头提到的这个皱纹是什么呢?
从Windows 2008和Windows 7开始,微软的TCP协议栈发送无偿的ARP,Src字段设置为------。 0.0.0.0.
10:45:10.530 Rcvd Ether Dst ff:ff:ff:ff:ff:ff:ff:ff Src 1c:c1:de:b4:76:60 Type 0806 (ARP)
ARP Req 目标 164.152.77.34 Src 0.0.0.0.0[1C:C1:DE:B4:76:60]
结果是STCP认为这是对其以太网地址的"正常"查询,并以正常的回复作出回应。
10:45:10.530 Xmit Ether Dst 1c:c1:de:b4:76:60 Src 00:00:a8:41:3b:6e 类型 0806 (ARP)
ARP Rep Target 0.0.0.0 [1C:C1:DE:B4:76:60] Src 164.152.77.34 [00:00:a8:41:3b:6e] 。
它没有记录任何重复IP地址的迹象。好消息是,Windows堆栈可以识别重复,并将切换到169.254.X.Y形式的链接本地地址。
微软为什么要做这个改变呢?似乎许多TCP堆栈(包括STCP)会用ARP帧中包含的以太网地址更新其源IP地址的ARP缓存条目。如果IP地址是重复的,你最终会中断与重复IP地址的当前连接,因为数据包被重定向到重复的主机。通过将Src字段更改为0.0.0.0微软可以防止TCP堆栈(包括STCP)更新其ARP缓存条目。