《TCP/IP详解》学习笔记(四):ICMP 协议、ping 和 Traceroute
ICMP 協(xié)議介紹
前面講到了,IP 協(xié)議并不是一個(gè)可靠的協(xié)議,它不保證數(shù)據(jù)被成功送達(dá),那么自然的,保證數(shù)據(jù)送達(dá)的工作應(yīng)該由其他的模塊來完 成。其中一個(gè)重要的模塊就是 ICMP(網(wǎng)絡(luò)控制報(bào)文)協(xié)議。
當(dāng)傳送 IP 數(shù)據(jù)包發(fā)生錯(cuò)誤--比如主機(jī)不可達(dá),路由不可達(dá)等等,ICMP 協(xié)議將會(huì)把錯(cuò)誤信息封包,然后傳送回給主機(jī)。給主機(jī) 一個(gè)處理錯(cuò)誤的機(jī)會(huì),這也就是為什么說建立在 IP 層以上的協(xié)議是可以做到安全的原因。ICMP 數(shù)據(jù)包由8bit 的錯(cuò)誤類型和8bit 的代碼和16bit 的校驗(yàn)和組成。而前 16bit 就組成了 ICMP 所要傳遞的信息。書上的圖6-3清楚的給出了錯(cuò)誤類型和代碼的組合代表的意思。
盡管在大多數(shù)情況下,錯(cuò)誤的包傳送應(yīng)該給出 ICMP 報(bào)文,但是在特殊情況下,是不產(chǎn)生 ICMP 錯(cuò)誤報(bào)文的。如下:
- ?ICMP 差錯(cuò)報(bào)文不會(huì)產(chǎn)生 ICMP 差錯(cuò)報(bào)文(防止 ICMP 的無限產(chǎn)生和傳送)。
- 目的地址是廣播地址或多播地址的IP數(shù)據(jù)報(bào)。
- 作為鏈路層廣播的數(shù)據(jù)報(bào)。
- 不是IP分片的第一片。
- ?源地址不是單個(gè)主機(jī)的數(shù)據(jù)報(bào)。這就是說,源地址不能為零地址、環(huán)回地址、廣播地址或多播地址。 雖然里面的一些規(guī)定現(xiàn)在還不是很明白,但是所有的這一切規(guī)定,都是為了防止產(chǎn)生 ICMP 報(bào)文的無限傳播而定義的。
- ICMP 協(xié)議大致分為兩類,一種是查詢報(bào)文,一種是差錯(cuò)報(bào)文。其中查詢報(bào)文有以下幾種用途:
- ping 查詢(不要告訴我你不知道 ping 程序)
- 子網(wǎng)掩碼查詢(用于無盤工作站在初始化自身的時(shí)候初始化子網(wǎng)掩碼)
- 時(shí)間戳查詢(可以用來同步時(shí)間)
而差錯(cuò)報(bào)文則產(chǎn)生在數(shù)據(jù)傳送發(fā)生錯(cuò)誤的時(shí)候。就不贅述了。
?
ICMP 的應(yīng)用--ping
ping 可以說是 ICMP 的最著名的應(yīng)用,當(dāng)我們?cè)谀骋粋€(gè)網(wǎng)站上不去的時(shí)候。通常會(huì) ping 一下這個(gè)網(wǎng)站。ping 會(huì)回顯出一些有用的信息。
一般的信息如下:
?
ping 這個(gè)單詞源自聲納定位,而這個(gè)程序的作用也確實(shí)如此,它利用 ICMP 協(xié)議包來偵測(cè)另一個(gè)主機(jī)是否可達(dá)。原理是用類型碼為0的 ICMP 發(fā)送請(qǐng)求,受到請(qǐng)求的主機(jī)則用類型碼為8的 ICMP 回應(yīng)。ping 程序來計(jì)算間隔時(shí)間,并計(jì)算有多少個(gè)包被送達(dá)。用戶就可 以判斷網(wǎng)絡(luò)大致的情況。我們可以看到,ping 給出來了傳送的時(shí)間和 TTL 的數(shù)據(jù)。我給的例子不太好,因?yàn)樽叩穆酚缮?有興趣地 可以 ping 一下國(guó)外的網(wǎng)站比如 sf.net,就可以觀察到一些 丟包的現(xiàn)象,而程序運(yùn)行的時(shí)間也會(huì)更加的長(zhǎng)。
ping 還給我們一個(gè)看主機(jī)到目的主機(jī)的路由的機(jī)會(huì)。這是因?yàn)?#xff0c;ICMP 的 ping 請(qǐng)求數(shù)據(jù)報(bào)在每經(jīng)過一個(gè)路由器的時(shí)候,路由器都會(huì)把 自己的 ip 放到該數(shù)據(jù)報(bào)中。而目的主機(jī)則會(huì)把這個(gè) ip 列表復(fù)制到回應(yīng) ICMP數(shù)據(jù)包中發(fā)回給主機(jī)。但是,無論如何,ip 頭所能紀(jì)錄的路由列表是非常的有限。如果要觀察路由, 我們還是需要使用更好的工具,就是要講到的 Traceroute(windows 下面的名字叫做 tracert)。
ICMP 的應(yīng)用--Traceroute程序
Traceroute 是用來偵測(cè)主機(jī)到目的主機(jī)之間所經(jīng)路由情況的重要工具,也是最便利的工具。前面說到,盡管 ping 工具也可以進(jìn)行偵測(cè),但是,因?yàn)?ip 頭的限制,ping 不能完全的記錄下所經(jīng)過的路由器。所以 Traceroute 正好就填補(bǔ)了這個(gè)缺憾。
Traceroute 的原理是非常非常的有意思,它受到目的主機(jī)的 IP 后,首先給目的主機(jī)發(fā)送一個(gè) TTL=1(還記得 TTL 是什么嗎?)的 UDP(后面就 知道 UDP 是什么了)數(shù)據(jù)包,而經(jīng)過的第一個(gè)路由器收到這個(gè)數(shù)據(jù)包以后,就自動(dòng)把 TTL 減1,而 TTL 變?yōu)?以后,路由 器就把這個(gè)包給拋棄了,并同時(shí)產(chǎn)生 一個(gè)主機(jī)不可達(dá)的 ICMP 數(shù)據(jù)報(bào)給主機(jī)。主機(jī)收到這個(gè)數(shù)據(jù)報(bào)以后再發(fā)一個(gè) TTL=2的 UDP 數(shù)據(jù)報(bào)給目的主機(jī),然后刺激第二個(gè)路由器給主機(jī)發(fā) ICMP 數(shù)據(jù) 報(bào)。如此往復(fù)直到到達(dá)目的主機(jī)。這樣,traceroute 就拿到了所有的路由器 ip。從而避開了 ip 頭只能記錄有限路由 IP 的問題。
有人要問,我怎么知道 UDP 到?jīng)]到達(dá)目的主機(jī)呢? 這就涉及一個(gè)技巧的問題,TCP 和 UDP 協(xié)議有一個(gè)端口號(hào)定義,而普通的網(wǎng) 絡(luò)程序只監(jiān)控少數(shù)的幾個(gè)號(hào)碼較 小的端口,比如說80,比如說23,等等。而 traceroute 發(fā)送的是端口號(hào)>30000(真變態(tài))的 UDP 報(bào),所以到 達(dá)目的主機(jī)的時(shí)候,目的 主機(jī)只能發(fā)送一個(gè)端口不可達(dá)的 ICMP 數(shù)據(jù)報(bào)給主機(jī)。主機(jī)接到這個(gè)報(bào)告以后就知道,主機(jī)到了,所以,說 Traceroute 是一個(gè)騙子一點(diǎn)也不為過
Traceroute 程序里面提供了一些很有用的選項(xiàng),甚至包含了 IP 選路的選項(xiàng),請(qǐng)察看 man 文檔來了解這些,這里就不贅述了。
總結(jié)
以上是生活随笔為你收集整理的《TCP/IP详解》学习笔记(四):ICMP 协议、ping 和 Traceroute的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: “马踏飞燕”玩偶凭丑萌火出圈:半月卖出近
- 下一篇: 2.4万元!微星强袭GE67 HX图赏: