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