ICMP
IP是盡力傳輸的網絡協議,提供的數據傳輸服務是不可靠的、無連接的,不能保證數據包能成功到達目的地。那么問題來了:如何確定數據包成功到達目的地?
這需要一個網絡層協議,提供錯誤檢測功能和報告機制功能,于是出現了ICMP(互聯網控制消息協議)。ICMP 的主要功能是,確認 IP 包是否成功送達目的地址,通知發送過程中 IP 包被丟棄的原因。有了這些功能,就可以檢查網絡是否正常、網絡配置是否正確、設備是否異常等信息,方便進行網絡問題診斷。
舉個栗子:如果在傳輸過程中,發生了某個錯誤,設備便會向源設備返回一條 ICMP 消息,告訴它發生的錯誤類型。
ICMP 消息是通過 IP 進行傳輸,但它的目的并不是讓 IP 成為一種可靠的協議,而是對傳輸中發生的問題進行反饋。ICMP 消息的傳輸同樣得不到可靠性保證,也有可能在傳輸過程中丟失。因此 ICMP 不是傳輸層的補充,應該把它當做網絡層協議。
ICMP 消息封裝
ICMP 消息使用 IP 來封裝,封裝格式如下圖。
其中type(類型)字段表示 ICMP 消息的類型,code(代碼)字段表示 ICMP 消息的具體含義。例如:type 值為 3 表示目的不可達消息( Destination Unreachable Message ),若 code 值為 0 表示目的網絡不可達( Network Unreachable )。常見的 ICMP 消息類型如下圖。
從功能上,ICMP 的消息可分為兩類:一類是通知出錯原因的錯誤消息,另一類是用于診斷的查詢消息。
常見的 ICMP 消息類型
回送請求消息( Echo Request ):是由源設備(主機或路由器等)向一個指定的目的設備發出的請求。這種消息用來測試目的地是否可達。
回送響應消息( Echo Reply ):對 Echo Request 的響應。目的設備發送 Echo Reply 來響應收到的 Echo Request 。最常用的 ping 命令就是使用 Echo Request 和 Echo Reply 來實現的。
目的不可達( Destination Unreachable ):路由器無法將 IP 包發送給目的地址時,會給源設備返回一個 Destination Unreachable 消息,并在消息中顯示不可達的具體原因。
實際情況下,經常會遇到的錯誤代碼是 1 ,表示主機不可達,它是指路由表中沒有目的設備的信息,或目的設備沒有連接到網絡。
參數問題( Parameter Problem ):路由器發現 IP 包頭出現錯誤或非法值后,向源設備發送一個 Parameter Problem 消息。這個消息包含有問題的 IP 頭,或錯誤字段的提示信息。
重定向( Redirect ):如果路由器發現一條更優的路徑發送數據,那么它就會返回一個 Redirect 消息給主機。這個消息包含了最合適的路由信息和源數據。
實際情況下,這種 Redirect 消息會引發路由問題,所以不進行這種設置。比如:路由器的路由表不準確時,ICMP 有可能就無法正常工作。
超時( Time Exceeded ):IP 包中有一個字段是 TTL(生存周期),它的值每經過一次路由器就減 1 ,直到減到 0 時 IP 包會被丟棄。這時,路由器會發送一個 Time Exceeded 消息給源設備,并通知 IP 包已被丟棄。
設置 TTL 的主要目的,是當路由發生環路時,避免 IP 包無休止的在網絡上轉發。還可以用 TTL 控制 IP 包的可達范圍,比如設置一個較小的 TTL 值。
時間戳請求/時間戳響應( Timestamp Request / Timestamp Reply ):時間戳可以記錄 ICMP 消息一次往返所需的時間。源設備發送一個帶有發送時間的 Timestamp Request 消息,目的設備收到后,發送一個帶有原設備發送時間、目的設備接收時間以及目的設備發送時間的 Timestamp Reply 消息。源設備收到 Timestamp Reply 時,并同時記錄到達時間。這些時間戳可以估計網絡上的傳輸時間。
ICMP 的應用
ICMP 被廣泛應用于網絡測試,最常用的ping和tracert網絡測試工具,都是使用 ICMP 協議實現的。
ping
ping 是 ICMP 最著名的一個應用,通過 ping 可以測試網絡的可達性,即網絡上的報文能否成功到達目的地。使用 ping 命令時,源設備向目的設備發送 Echo request 消息,目的地址是目的設備的 IP 地址。目的設備收到 Echo request 消息后,向源設備回應一個 Echo reply 消息,可知目的設備是可達的。也可以通過 ping 命令來判斷目標主機是否啟用。
如果中間某個路由器沒有到達目的網絡的路由,便會向源設備回應一個 Destination Unreachable 消息,告知目的設備不可達。
如果源主機在一定時間內無法收到回應報文,就認為目的設備不可達,并顯示超時。
需要注意的是 ping 過程是雙向的消息通信,只有雙向都成功傳輸時,才能說明通信是正常的。另外主機也可能因為防火墻攔截,導致 ping 不通。
tracert
ping 工具只能測試目的設備的連通性,但是看不到數據包的傳輸路徑。所以在網絡不通的情況下,無法知道網絡問題發生在哪個位置。tracert 工具可以查看數據包的整條傳輸路徑,包括途中經過的中間設備。
IP 頭部的TTL字段是為避免數據包循環轉發而設計的。每經過一個路由器,數據包頭中的 TTL 值減 1 。如果 TTL 值為 0 則丟棄報文,并向源設備回應一個 Time Exceeded 消息,告知錯誤類型。tracert 就是基于 TTL 字段和 ICMP 協議實現的。在 Windows 中命令是tracert,在 Unix 、MacOS 中命令是traceroute。
使用 tracert 命令時,源設備的 tracert逐跳發送數據包,并等待每一個響應報文。發送第一個數據包時,TTL 值設為 1 。第一個路由器收到數據包后 TTL 值減 1 ,隨即丟棄數據包,并返回一個 Time Exceeded 消息。源設備的 tracert 收到響應報文后,取出源 IP 地址,即路徑上的第一個路由器地址。然后 tracert 發送一個 TTL 值為 2 的數據包。第一個路由器將 TTL 值減 1 ,并轉發數據包。第二個路由器再將 TTL 值減 1 ,丟棄數據包并返回一個 Time Exceeded 消息。tracert 收到響應報文后,取出源 IP 地址,即路徑上的第二個路由器地址。類似步驟,tracert 逐跳獲得每一個路由器的地址,并探測到目的設備的可達性。
tracert 過程也是雙向的消息通信,只有雙向都成功傳輸時,才能正確探測路徑。另外主機安裝了防火墻,也可能造成路徑探測失敗。
網絡實戰
ping
在 Windows 電腦上使用ping命令,并查看返回信息。
同步抓包進行驗證。
還可以直接使用 ping 命令,查看 ping 命令的使用方法。
tracert
在 Windows 電腦上使用tracert命令,并查看返回信息。
同步抓包進行驗證。
也可以直接使用 tracert 命令,查看 tracert 命令的使用方法。
-
網絡協議
+關注
關注
3文章
267瀏覽量
21534 -
ICMP
+關注
關注
0文章
52瀏覽量
14923 -
Ping
+關注
關注
0文章
69瀏覽量
15974
原文標題:24 張圖搞定 ICMP :最常用的網絡命令 ping 和 tracert
文章出處:【微信號:LinuxHub,微信公眾號:Linux愛好者】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論