我工作的公司生产和销售工业机器。 我们的产品之一是一台由运行Windows的PC控制的机器。 该特定机器使用连接到机器的数字input和输出的联网设备。 我们的软件通过以太网发送命令来读写这个设备上的I / O点的值。 设备使用UDP协议进行通信。
我们使用的PC通常有两个或更多的网卡(NIC)。 其中一个NIC称为机器局域网,并被分配了一个私有地址192.168.1.49/24。 I / O设备的IP地址为192.168.1.11/24,192.168.1.12/24等
第二个NIC可以连接到工厂(客户)的通用networking,称为Mill LAN。 这通常configuration为DHCP寻址。
我们的应用程序使用I / O设备的IP地址进行configuration,从而为该地址生成UDP通信。 在正常情况下,我可以使用Wireshark监视这个stream量,并通过机器LAN接口看到UDP数据包来回传送到设备的IP地址。 我也可以ping通I / O设备,并通过机器LAN接口观察ICMP数据包在PC和I / O设备之间来回跳动。
因为这是一个工业应用程序,所以我们希望确保一切都尽可能健壮,并且我们的应用程序从networking故障等事件中恢复过来。 为此,我在我们的制造工厂进行testing,在那里将I / O设备从networking上断开,监视我们应用程序的行为,然后重新连接I / O设备,并确保应用程序再次开始与设备通话。 有时候一切都恢复了,有时却没有。 在我看来,有时进行这个testing会导致Windows开始通过Mill LAN接口发送192.168.1.11地址的stream量,而不是机器LAN接口。 发生这种情况时,显然没有来自I / O设备的响应,并且应用程序无法与设备交互。 我研究了PC的networkingconfiguration和路由表,并花了很多时间在互联网上寻找想法,但我无法确定这种行为的原因。
我已经确认Windows通过使用Wireshark观察stream量,将IPstream量发送到Mill LAN接口而不是机器LAN接口。 我可以用我的应用程序生成的UDP数据包和ping.exe生成的ICMP数据包来观察这一点,因此我认为这个问题在我们的应用程序之外。
我尝试过的一件事是操纵路由指标(接口和网关指标),试图强制Windows使用机器LAN接口。 这似乎没有帮助。 您会在下面的configuration列表中看到这些调整/夸大的指标。
当症状发生时,如果我明确告诉ping.exe要使用哪个接口,我仍然可以成功ping I / O设备:
C:\>ping -S 192.168.1.49 192.168.1.11 Pinging 192.168.1.11 from 192.168.1.49 with 32 bytes of data: Reply from 192.168.1.11: bytes=32 time=6ms TTL=16 Reply from 192.168.1.11: bytes=32 time=7ms TTL=16 Reply from 192.168.1.11: bytes=32 time=7ms TTL=16 Reply from 192.168.1.11: bytes=32 time=7ms TTL=16 Ping statistics for 192.168.1.11: Packets: Sent = 4, Received = 4, Lost = 0 (0% loss), Approximate round trip times in milli-seconds: Minimum = 6ms, Maximum = 7ms, Average = 6ms
症状有时会在短时间后自行消失,但通常会持续很长一段时间(我无限期地假设)。 我也可以通过禁用Mill LAN接口使症状消失; 这是有道理的,因为Windows现在只有一个接口来路由所有stream量。 我也可以通过删除I / O设备的ARP条目来让症状消失(我不知道为什么会这样):
C:\>arp -d 192.168.1.11
当症状发生时,我仍然可以ping机器局域网上的其他设备,所以通过适当的接口路由数据包似乎一般工作(只是不是一个特定的地址)。 不pipe现象是什么,它似乎都与一个IP地址有关。 由于删除该地址的ARPlogging使得症状消失,所以我怀疑与ARP有关,但我并不确定。
出现症状时,似乎192.168.1.11的ARP条目将消失。 症状开始之前,有一个条目(使用正确的MAC地址):
C:\>arp -a | findstr 192.168.1.11 192.168.1.11 00-50-8e-00-26-e2 dynamic
引起症状后,入场消失:
C:\>arp -a | findstr 192.168.1.11 C:\>
不pipe出于什么原因,删除不存在的ARP条目似乎会恢复通信。
另外一个观察:我监视连续ping的输出(ping -t 192.168.1.11)。 在这种情况下,我可以拔下电缆几秒钟,插上电源,ping就能恢复通话:
Reply from 192.168.1.11: bytes=32 time=9ms TTL=16 Reply from 192.168.1.11: bytes=32 time=6ms TTL=16 Request timed out. Request timed out. Reply from 192.168.1.11: bytes=32 time=2005ms TTL=16 Reply from 192.168.1.11: bytes=32 time=6ms TTL=16 Reply from 192.168.1.11: bytes=32 time=6ms TTL=16
看来,症状开始时(通信不能恢复),我看到“目标主机不可达”消息:
Reply from 192.168.1.11: bytes=32 time=9ms TTL=16 Reply from 192.168.1.11: bytes=32 time=6ms TTL=16 Request timed out. Request timed out. Reply from 192.168.1.49: Destination host unreachable. Request timed out. Request timed out.
我不是100%肯定的,情况总是如此。
这里是接口(注意我手动分配的度量):
C:\>netsh interface ip show config Configuration for interface "Machine LAN" DHCP enabled: No IP Address: 192.168.1.49 Subnet Prefix: 192.168.1.0/24 (mask 255.255.255.0) Default Gateway: 0.0.0.0 Gateway Metric: 1 InterfaceMetric: 1 Statically Configured DNS Servers: None Register with which suffix: Primary only Statically Configured WINS Servers: None Configuration for interface "Mill LAN" DHCP enabled: Yes IP Address: ***.16.1.31 Subnet Prefix: ***.16.0.0/20 (mask 255.255.240.0) Default Gateway: ***.16.0.58 Gateway Metric: 500 InterfaceMetric: 500 DNS servers configured through DHCP: ***.16.6.20 ***.16.16.131 Register with which suffix: Primary only WINS servers configured through DHCP: ***.16.6.20 ***.16.16.131 Configuration for interface "Loopback Pseudo-Interface 1" DHCP enabled: No IP Address: 127.0.0.1 Subnet Prefix: 127.0.0.0/8 (mask 255.0.0.0) InterfaceMetric: 50 Statically Configured DNS Servers: None Register with which suffix: None Statically Configured WINS Servers: None
这里是路由表(由netsh和路由命令呈现):
C:\>netsh int ip show route Publish Type Met Prefix Idx Gateway/Interface Name ------- -------- --- ------------------------ --- ------------------------ No Manual 100 0.0.0.0/0 3 ***.16.0.58 No Manual 1 0.0.0.0/0 4 Machine LAN No System 256 ***.16.0.0/20 3 Mill LAN No System 256 ***.16.1.31/32 3 Mill LAN No System 256 ***.16.15.255/32 3 Mill LAN No Manual 1 192.168.1.0/24 4 Machine LAN No System 256 192.168.1.49/32 4 Machine LAN No System 256 192.168.1.255/32 4 Machine LAN No System 256 224.0.0.0/4 3 Mill LAN No System 256 224.0.0.0/4 4 Machine LAN No System 256 255.255.255.255/32 3 Mill LAN No System 256 255.255.255.255/32 4 Machine LAN C:\>route print =========================================================================== Interface List 4...00 40 05 10 4e 9c ......D-Link DFE-530TX+ PCI Adapter 3...00 1a a0 e8 72 59 ......Intel(R) 82566DM-2 Gigabit Network Connection 1...........................Software Loopback Interface 1 5...00 00 00 00 00 00 00 e0 Microsoft ISATAP Adapter 7...00 00 00 00 00 00 00 e0 Microsoft ISATAP Adapter #2 =========================================================================== IPv4 Route Table =========================================================================== Active Routes: Network Destination Netmask Gateway Interface Metric 0.0.0.0 0.0.0.0 ***.16.0.58 ***.16.1.31 600 0.0.0.0 0.0.0.0 On-link 192.168.1.49 2 ***.16.0.0 255.255.240.0 On-link ***.16.1.31 756 ***.16.1.31 255.255.255.255 On-link ***.16.1.31 756 ***.16.15.255 255.255.255.255 On-link ***.16.1.31 756 192.168.1.0 255.255.255.0 On-link 192.168.1.49 2 192.168.1.49 255.255.255.255 On-link 192.168.1.49 257 192.168.1.255 255.255.255.255 On-link 192.168.1.49 257 224.0.0.0 240.0.0.0 On-link ***.16.1.31 756 224.0.0.0 240.0.0.0 On-link 192.168.1.49 257 255.255.255.255 255.255.255.255 On-link ***.16.1.31 756 255.255.255.255 255.255.255.255 On-link 192.168.1.49 257 =========================================================================== Persistent Routes: Network Address Netmask Gateway Address Metric 0.0.0.0 0.0.0.0 192.168.1.49 1 ===========================================================================
我已经在XP,Windows 7和Windows 8 PC上看到了相同的症状,尽pipe我只使用Wireshark观察Windows 8上错误接口的stream量。
忏悔时间:机器局域网上没有任何地址为192.168.1.1的节点,但是我通过Mill LAN接口从那个地址得到了ping响应。 磨坊局域网(或访问)的地方有这个地址。 这是一个tracert,显示它只有一跳,可能在我公司的内部networking上:
C:\>tracert 192.168.1.1 Tracing route to 192.168.1.1 over a maximum of 30 hops 1 <1 ms <1 ms <1 ms ***.16.0.58 2 12 ms 47 ms 24 ms 192.168.1.1 Trace complete.
我假设这个192.168.1.1设备的存在可能构成了一个错误configuration的networking,我应该调查为什么它对我的PC可见(我不认为这些私有地址应该是可路由的)。 在任何情况下,我想弄清楚如何使事情的工作,因为在我的经验有192.168.1。*地址的设备偶尔会出现在客户现场(磨坊局域网),我希望我们的系统继续即使他们工作也是如此。 换句话说,我想让我的电脑只使用机器LAN接口进行192个地址的通讯。 如果任何人有任何想法我可以做到,我很乐意听到他们!
我首先要说的是,这个问题会在超级用户或者Serverfault上得到更好的回答,但是我想解决一个战略问题:
你select使用192.168.0.0作为你的“私人”局域网。 不幸的是,您select了最常用的专用networking地址,而且您可能经常遇到地址冲突 – 您似乎在此处这样做了。
192.168.0.0地址不能被路由是不正确的。 他们可以并且一直在公司networking中路由。 然而,他们不能通过互联网路由。 您可能正在考虑“本地链接”networking169.254.0.0/16。 这个networking根本不是(应该是)路由的,所以你不会遇到你遇到的地址冲突。
您应该使用169.254.0.0/16地址范围内的地址。 从该范围中select一个小型子网,以获得您拥有的设备数量( 例如 ,169.254.55.64/28less于10个I / O设备)。
两个字: 路由caching
UDP是无状态的,所以系统会build立一个“连接”来给它状态。 只要您不断发送数据包,该连接的caching将保持有效。 因此,当机器LAN断开时,您的stream量将默认为Mill LAN。 直到不正确的路由caching过期(由于不活动),该应用程序将无法正常工作。
有两种方法可以解决这个问题:1)将代码添加到您的应用程序,以直接绑定正确的接口,和/或2)添加防火墙规则,防止192.168.1.0/24使用Mill LAN接口。
(正如@Ron指出的,192.168.1.0/24是一个很差的networkingselect。)
注意:
netsh interface ip show destinationcache和
netsh interface ip delete destinationcache
此外,机器局域网不应该是您的默认网关,它的指标永远不应该是“1”。