“怎么沒網?Ping一下就好了!”您的Ping命令真的用對了嗎?
在對以太網網絡上的通信問題進行故障排除時,Ping命令是最廣泛使用的診斷工具之一。這種受歡迎程度是因為每個人都知道如何使用命令,執行起來非常簡單。
在對通信問題進行故障排除時,我們在無法正常工作時聽到的最常見的一句話是“但我可以ping通”,就好像這一點應該作為確切的證據,證明一切都按預期工作,通信服務器選擇不通信。
本文介紹了一些關于Ping命令的常見誤解,特別是如何有效地使用它,什么時候它可能不是任務的***工具,以及Ping的更好的替代方案(提供實際上可操作的數據)。
什么是Ping命令?
在命令提示符下鍵入ping 1.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命令相同的作用,并且只應用于確定在指定的IP地址處是否存在響應的內容,僅此而已。
如果您正在ping同一子網上的設備,則Tracert和Ping將執行完全相同的操作。當ping不在同一子網或網絡上的主機時,會發現Tracert的強大功能,因為它不僅會顯示終端設備是否響應,還會顯示到達該遠程主機的路由路徑。
如果Tracert在路徑中的任何特定點發生故障,則很容易識別通信中斷的特定位置。

Tracert通過發送與ping相同的ICMP Echo請求來完成此操作,但它使用“Time To Live”字段來控制消息可以跳轉的距離。***個數據包以TTL為1發送,路徑中的***個跳轉將減少為0,并以“Time to live exceeded in transit/運行中的超時時間”響應,這有助于我們的機器現在知道***個跳轉的IP地址路由路徑。
然后以TTL為2發送第二個回應請求,以便消息可以在超時之前到達路徑中的第二跳。然后是3的TTL,4的TTL,依此類推,直到我們得到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有三種可能的結果:
正在監聽 - 該實用程序得到了端口的積極回應
不監聽 - 該實用程序收到了端口的回復,告訴我們要離開
已過濾 - 該實用程序未收到來自端口的任何響應,無論是正面還是負面
現在讓我們在實驗室中使用本地Modbus PLC進行嘗試,我們知道這可以通過端口502(默認的Modbus端口)看到連接請求。
這次我掃描一系列端口502-503,仍然要求檢查TCP和UDP。

結果并不令人驚訝; 主機名稱解析失敗,因為它只是一個PLC(雖然它沒有超出PLC分配DNS名稱的可能性的范圍,大多數不是),并且查詢結果確實顯示有一個進程在端口502上偵聽傳入的TCP連接。
現在,顯然,我們實驗室中的Modbus PLC沒有任何通信問題。但是,您現在可以想象,當Portqry實用程序以“Not Listening”或“Filtered”響應端口和傳輸時,對于無響應的設備有多么有用,我們希望在正常通信情況下能夠得到肯定的響應。
但是,如果我們從Portqry得到積極響應但仍然沒有成功通信,我們還能做些什么呢?
什么是Netstat?
雖然Netstat命令不提供遠程設備接受連接的能力的信息,或者遠程主機是否可以在網絡上訪問,但在查看本地計算機上的套接字狀態時,它是非常寶貴的資源。

運行簡單的netstat枚舉本地套接字信息,顯示本地和遠程地址,套接字狀態以及與該主題關聯的進程ID(在想要跟蹤哪個應用程序正在使用端口時特別有用)。在對PLC的連接問題進行故障排除時,套接字狀態將是最有用的列,因為它可以深入了解發生問題的連接順序。過濾后(使用FIND)可以輕松過濾任何關鍵字的Netstat列表; 包括IP地址和端口:

在解釋Socket狀態時,至少在一般情況下 - 理解TCP狀態圖以查看錯誤發生在連接序列中的哪個位置。毫無疑問,這是有用的,只是觸及netstat能夠表達的表面,建議運行netstat /?查看所有可用選項。
什么是Wireshark?
如果所有其他方法都失敗了,并且上面的工具顯示一切都應該工作,那么Wireshark就是我們的***診斷工具。Wireshark將捕獲網卡上的所有流量,并將向我們顯示目標設備與我們的計算機之間究竟發生了什么。

因此,雖然Ping命令肯定有其作為一個非常基本的故障排除工具,但它不應該被誤認為是一個完成所有工作的工具。