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