Ping命令是解决以太网通信问题时使用最广泛的诊断工具之一。这种流行是因为每个人都知道如何使用该命令并且执行起来非常简单。在对通信问题进行故障排除时,当事情不正常时我们听到的最常见的短语是“但我可以ping”,好像这应该作为一切都按预期工作的决定性证据,通信服务器选择不通信。本文介绍了有关Ping命令的一些常见误解,特别是如何有效地使用它,当它可能不是完成任务的最佳工具时,以及提供实际可操作数据的更好的Ping替代品。什么是Ping命令?当您在命令提示符下键入ping1.1.1.1时会发生什么?Ping旨在告诉用户主机在IP网络上是否可达,它通过发送ICMP(Internet控制消息协议)回显请求来实现,远程主机(我们正在ping的IP地址)将在收到时回显.虽然这无疑很有用,但Ping命令能告诉我们的信息也非常有限,因为ICMP位于IP协议之上(毕竟它是Internet控制消息协议)并且不需要像TCP这样的传输协议或UDP。为什么这很重要?Internet协议描述主机之间的通信,而TCP或UDP等传输协议描述在这些主机上运行的进程之间的通信。如果没有传输层,Ping命令将永远无法为我们提供有关远程主机的信息:正在侦听连接具有一个开放接口,该接口将为我们的进程接受连接,甚至是我们希望与Ping命令通信的合适主机只会告诉我们主机响应指定IP地址的echo请求。因此,Ping命令的缺点可以概括为该命令没有为我们提供足够的信息来巧妙地推断出控制器或网络节点无法通信的原因。那么,在这种情况下,Ping命令的哪些替代方案值得考虑呢?什么是Tracert命令?Tracert命令在很大程度上与Ping命令的用途相同,应该只用于确定是否有响应的内容,仅此而已。如果您对同一子网上的设备执行ping操作,Tracert和Ping将执行完全相同的操作。当对不在同一子网或网络上的主机执行ping操作时,Tracert被发现功能强大,因为它不仅会显示终端设备是否响应,还会显示到该远程主机的路由路径。如果Tracert在路径中的任何特定点发生故障,则很容易识别通信中断的具体位置。Tracert通过发送与ping相同的ICMPEcho请求来做到这一点,但它使用“生存时间”字段来控制消息可以跳转多远。发送的第一个TTL为1的数据包,路径中的第一跳将减少为0并响应“Timetoliveexceededintransit”,这有助于我们的机器现在知道第一跳的IP地址路由路径。然后发送TTL为2的第二个回显请求,以便消息可以在超时之前到达路径中的第二跳。然后TTL为3,TTL为4,依此类推,直到我们收到Echo响应并且我们知道“ping”数据包已到达我们试图到达的目标节点。就像ping一样,Tracert结果告诉我们远程主机上是否运行了能够与我们通信的应用程序/固件/通信模块——只是远程主机支持IP并且可以访问。因此,我们现在已经确定,在许多情况下,Ping和Tracert命令在解决通信问题方面的有效性基本相同。我们还能尝试什么?什么是Portqry实用程序?如果Ping命令没有给我们任何可操作的数据,并且Tracert命令没有给我们任何可操作的数据,我们如何获得可用于确定设备是否正在侦听连接的信息以及通信可能是什么问题?这个问题将我们带到了PortQryUI-一种可从Microsoft下载的实用程序。虽然它没有预装在Windows中,但PortQryUI是一个非常轻量级的实用程序,它不仅可以用来识别主机是否可达,还可以确定在该主机上运行的进程是否可达和/或愿意接受连接。知道1.1.1.1是我们之前建立的DNS服务器,让我们针对DNS端口53运行Portqry。我们可以看到,首先,Portqry在使用TCP和UDP查询端口之前尝试将IP地址解析为DNS主机名(在这里成功完成-“one.one.one.one”),因为该实用程序知道53是DNS端口,它还会向该端口发送DNS查询。Portqry有三种可能的结果:侦听-实用程序从端口得到肯定响应未侦听-实用程序收到端口的回复,告诉我们离开让我们在实验室中使用本地ModbusPLC进行尝试,我们知道这可以通过端口502(默认Modbus端口)查看连接请求。这次我扫描了一系列端口502-503,仍然要求检查TCP和UDP。结果并不令人惊讶;主机名解析失败,因为它只是一个PLC(虽然PLC不排除分配DNS名称的可能性,但大多数不是),并且查询结果确实显示有一个进程在侦听端口502。监听传入的TCP连接。现在,显然,我们实验室中的ModbusPLC没有任何通信问题。但是,您现在可以想象Portqry实用程序在使用“未侦听”或“已过滤”响应端口和传输时对无响应设备的作用有多大,我们希望在正常通信情况下得到积极响应。但是如果我们得到了Portqry的积极回应,但仍然没有沟通成功,我们还能做什么呢?什么是网络统计?虽然Netstat命令不提供有关远程设备接受连接的能力或远程主机是否可通过网络访问的信息,但在查看本地计算机上的套接字状态时,它是一个非常宝贵的资源。运行一个简单的netstat枚举本地套接字信息,显示本地和远程地址、套接字状态以及与该主题关联的进程ID(在想要跟踪哪个应用程序正在使用端口时特别有用)。套接字状态将是解决PLC连接问题时最有用的列,因为它提供了对发生问题的连接顺序的深入了解。过滤(使用FIND)后,可以轻松地为任何关键字过滤Netstat列表;包括IP地址和端口:在解释Socket状态时,至少在一般情况下-了解TCP状态图以查看连接序列中发生错误的位置。毫无疑问,这很有用,但只是粗略地了解了netstat能够表达的内容,建议运行netstat/?查看所有可用选项。什么是Wireshark?如果一切都失败了,并且上面的工具显示一切正常,那么Wireshark就是我们的首选诊断工具。Wireshark将捕获网卡上的所有流量,并向我们展示目标设备和我们的计算机之间到底发生了什么。因此,尽管Ping命令作为一种非常基本的故障排除工具肯定有其一席之地,但不应将其误认为是一种可以完成所有工作的工具。
