關於ping與traceroute的工作原理及注意事項


1.ping命令

ping作為網絡相關命令中使用頻率最高的程序之一,主要用於確定網絡間的連通性,這對確定網絡是否連接,以及網絡連接的狀況十分有用。簡單來說,ping就是一個測試程序,如果運行正確,大體上就可以排除網絡訪問層、網卡、Modem的輸入輸出線路、電纜和路由器等存在的故障,從而縮小問題的范圍。

ping以毫秒為單位顯示發送到返回應答之間的時間量。如果應答時間短,表示數據報不必通過太多的路由器或網絡,連接速度比較快

 

1)命令格式

 

一般情況下,用戶可以通過使用一系列的ping命令來查找問題出在什么地方,或檢驗網絡運行的情況。

①ping 127.0.0.1

如果測試成功,表明網卡、TCP/IP協議的安裝、IP地址、子網掩碼的設置正常。如果測試不成功,就表示TCP/IP的安裝或設置存在有問題。

②ping 本機IP

如果測試不成功,則表示本地配置或安裝存在問題,應當對網絡設備和通訊介質進行測試、檢查並排除。

③ping局域網內其他IP

如果測試成功,表明本地網絡中的網卡和載體運行正確。但如果收到0個回送應答,那么表示子

④ping 網關IP

這個命令如果應答正確,表示局域網中的網關路由器正在運行並能夠做出應答。

⑤ping 遠程IP

如果收到正確應答,表示成功的使用了缺省網關。對於撥號上網用戶則表示能夠成功的訪問Internet.

如果上面所列出的所有ping命令都能正常運行,那么計算機進行本地和遠程通信基本上就沒有問題了。網掩碼不正確或網卡配置錯誤或電纜系統有問題。

例如在上圖中我ping了百度的服務器(如果是windows則默認獲取4次),64代表數據包的大小,單位字節(byte),icmp_seq指ICMP報文的序列號,ttl即Time To Live,生存時間的意思,該字段指定IP包被路由器丟棄之間允許通過的最大網段數量,因為現在絕大多數路由器的消耗時間都小於1s,而時間小於1s就當1s計算,所以數據包每經過一個路由器節點TTL都減一,后面講到traceroute時還要提到。

 

2)工作原理

ping作為定位網絡通不通的一個重要手段,是基於ICMP協議來工作的。

ICMP即Internet控制報文協議(Internet Control Message Protocol),是TCP/IP協議簇的一個子協議,用於在IP主機、路由器之間傳遞控制信息,具體有網絡通不通、主機是否可達、路由是否可用等網絡本身的消息,這些控制消息雖然並不傳輸用戶數據,但是對於用戶數據的傳遞起着重要的作用。簡單來說,ping命令會發送一份ICMP回顯請求報文給目標主機,並等待主機返回ICMP回顯應答。因為ICMP協議會要求目標主機在收到消息之后,必須返回ICMP應答消息給源主機,如果源主機在一定時間內收到了目標主機的應答,則表明兩台主機之間網絡是可達的。

舉個例子,假設有兩台主機A和B,現在我們要監測兩台主機網絡是否可達,那么我們在主機A上那么我們在主機A上輸入命令:ping B的IP,此時,ping命令會在主機A上構建一個 ICMP的請求數據包,然后 ICMP協議會將這個數據包以及目標IP等信息一同交給IP層協議。

IP層協議得到這些信息后,將源IP地址、目標IP地址、再加上一些其它的控制信息,構建成一個IP數據包。IP數據包構建完成后,還需要加上MAC地址,因此,還需要通過ARP映射表找出目標IP所對應的MAC地址。

當拿到了目標主機的MAC地址和本機MAC后,一並交給數據鏈路層,組裝成一個數據幀,依據以太網的介質訪問規則,將它們傳送出去。

當主機B收到這個數據幀之后,會首先檢查它的目標MAC地址是不是本機,如果是就接收下來處理,接收之后會檢查這個數據幀,將數據幀中的IP數據包取出來,交給本機的IP層協議,然后IP層協議檢查完之后,再將ICMP數據包取出來交給ICMP協議處理,當這一步也處理完成之后,就會構建一個ICMP應答數據包,回發給主機A。

在一定的時間內,如果主機A收到了應答包,則說明它與主機B之間網絡可達,如果沒有收到,則說明網絡不可達。除了監測是否可達以外,還可以利用應答時間和發起時間之間的差值,計算出數據包的延遲耗時。

 

3)單向ping通問題

我們知道,主機A收到了主機B的一個應答包,說明兩台主機之間的去、回通路正常,也就是說,無論由A到B還是由B到A,都是正常的,可是有的時候我們可能會遇到一些特殊原因導致只能單方面ping通的情況,這可能是由於:

①對方確實存在,但設置了ICMP數據包過濾(比如防火牆設置)

在共享上網的機器中,出於安全考慮,大部分作為服務器的主機都安裝了個人防火牆軟件,而其他作為客戶機的機器則一般不安裝。幾乎所有的個人防火牆軟件,默認情況下是不允許其他機器Ping本機的。一般的做法是將來自外部的ICMP請求報文濾掉,但它卻對本機出去的ICMP請求報文,以及來自外部的ICMP應答報文不加任何限制。這樣,從本機Ping其他機器時,如果網絡正常,就沒有問題。但如果從其他機器Ping這台機器,即使網絡一切正常,也會出現“Request timed out”的錯誤。大部分的單方向Ping通現象源於此。解決的辦法也很簡單,根據你自己所用的不同類型的防火牆,調整相應的設置即可。

②錯誤設置IP地址

正常情況下,一台主機應該有一個網卡,一個IP地址,或多個網卡,多個IP地址(這些地址一定要處於不同的IP子網)。但對於在公共場所使用的電腦,特別是網吧,曾有一次兩台電腦也出現了這種單方向Ping通的情況,經過仔細檢查,發現其中一台電腦的“撥號網絡適配器”(相當於一塊軟網卡)的TCP/IP設置中,設置了一個與網卡IP地址處於同一子網的IP地址,這樣,在IP層協議看來,這台主機就有兩個不同的接口處於同一網段內。當從這台主機Ping其他的機器時,會存在這樣的問題: 
(1)主機不知道將數據包發到哪個網絡接口,因為有兩個網絡接口都連接在同一網段; 
(2)主機不知道用哪個地址作為數據包的源地址。因此,從這台主機去Ping其他機器,IP層協議會無法處理,超時后,Ping 就會給出一個“超時無應答”的錯誤信息提示。但從其他主機Ping這台主機時,請求包從特定的網卡來,ICMP只須簡單地將目的、源地址互換,並更改一些標志即可,ICMP應答包能順利發出,其他主機也就能成功Ping通這台機器了。

 

2.traceroute命令

上面提到發送數據包要經過多少個路由器,那么路由器是什么意思呢?這里就不得不說到traceroute命令(windows下為tracert)了,通過這個命令我們可以知道信息從你的計算機到互聯網另一端的主機是走的什么路徑。當然每次數據包由某一同樣的出發點到達某一同樣的目的地走的路徑可能會不太一樣,但基本上來說大部分時候所走的路由是相同的。

traceroute利用ICMP協議定位您的計算機和目標計算機之間所有的路由器,TTL值可以反映數據包經過的路由器或網關的數量,通過操縱獨立ICMP請求報文的TTL值和觀察該報文被拋棄的返回信息,traceroute命令能夠遍歷到數據包傳輸路徑上的所有路由器。另外,traceroute是一條緩慢的命令,因為每經過一台路由器都要花去大約10s到15s的時間。

 

1)命令格式

traceroute [options] <IP-address or domain-name> [data size]

 由於traceroute的option眾多,這里只列出幾條常用命令:

Options:

-4                                   IPv4

-n                                   用數字顯示地址

-v                                   長輸出     

-p                                   UDP端口設置

-q                                   設置TTL測試數目(缺省為3)

-t                                    設置測包的服務類型

 

2)工作原理

traceroute是用來偵測主機到目的主機之間所經路由情況的重要工具,也是最便利的工具。盡管ping工具也可以進行偵測,但是,因為ip頭的限制,ping不能完全的記錄下所經過的路由器,所以traceroute正好就填補了這個缺憾。traceroute首先給目的主機發送一個TTL=1的UDP數據包,而經過的第一個路由器收到這個數據包以后,就自動把TTL減1,而TTL變為0以后,路由器就把這個包給拋棄了,並同時產生 一個主機不可達的ICMP數據報給主機。主機收到這個數據報以后再發一個TTL=2的UDP數據報給目的主機,然后刺激第二個路由器給主機發ICMP數據報。如此往復直到到達目的主機。這樣,traceroute就拿到了所有的路由器ip。從而避開了ip頭只能記錄有限路由IP的問題。有人要問,我怎么知道UDP到沒到達目的主機呢?這就涉及一個技巧的問題,TCP和UDP協議有一個端口號定義,而普通的網絡程序只監控少數的幾個號碼較小的端口,比如說80,比如說23,等等。而traceroute發送的是端口號大於30000的UDP報文,所以到達目的主機的時候,目的主機只能發送一個端口不可達的ICMP數據報給主機。主機接到這個報告以后就知道,主機到了。

 

3)注意事項

正如前面提到的單向ping通問題一樣,並不是所有網關都會如實返回ICMP超時報文。出於安全性考慮,大多數防火牆以及啟用了防火牆功能的路由器缺省配置為不返回各種ICMP報文,其余路由器或交換機也可能被管理員主動修改配置變為不返回 ICMP報文。因此traceroute程序不一定能拿到所有的沿途網關地址。所以,當某個TTL值的數據包得不到響應時,並不能停止這一追蹤過程,程序仍然會把TTL遞增而發出下一個數據包。這個過程將一直持續到數據包發送到目標主機,或者達到默認或用參數指定的追蹤限制(maximum_hops)才結束追蹤。依據上述原理,利用了UDP數據包的traceroute程序在數據包到達真正的目的主機時,就可能因為該主機沒有提供UDP服務而簡單將數據包拋棄,並不返回任何信息。為了解決這個問題,traceroute故意使用了一個大於30000的端口號,因UDP協議規定端口號必須小於30000,所以目標主機收到數據包后唯一能做的事就是返回一個“端口不可達”的ICMP報文,於是主叫方就將端口不可達報文當作跟蹤結束的標志。

使用UDP的traceroute,失敗還是比較常見的。這常常是由於,在運營商的路由器上,UDP與ICMP的待遇大不相同。為了利於troubleshooting,ICMP ECHO Request/Reply 是不會封的,而UDP則不同。UDP常被用來做網絡攻擊,因為UDP無需連接,因而沒有任何狀態約束它,比較方便攻擊者偽造源IP、偽造目的端口發送任意多的UDP包,長度自定義。所以運營商為安全考慮,對於UDP端口常常采用白名單ACL,就是只有ACL允許的端口才可以通過,沒有明確允許的則統統丟棄。比如允許DNS/DHCP/SNMP等。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM