IP協(xié)議并不是一個(gè)可靠的協(xié)議,它不保證數(shù)據(jù)被送達(dá),那么,自然的,保證數(shù)據(jù)送達(dá)的工作應(yīng)該由其他的模塊來(lái)完成。其中一個(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ì),這也就是為什么說(shuō)建立在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)文(出IMCP查詢報(bào)文)(防止IMCP的無(wú)限產(chǎn)生和傳送)
目的地址是廣播地址或多播地址的IP數(shù)據(jù)報(bào)。
作為鏈路層廣播的數(shù)據(jù)報(bào)。
不是IP分片的第一片。
源地址不是單個(gè)主機(jī)的數(shù)據(jù)報(bào)。這就是說(shuō),源地址不能為零地址、環(huán)回地址、廣播地 址或多播地址。
雖然里面的一些規(guī)定現(xiàn)在還不是很明白,但是所有的這一切規(guī)定,都是為了防止產(chǎn)生ICMP報(bào)文的無(wú)限傳播而定義的。
ICMP協(xié)議大致分為兩類,一種是查詢報(bào)文,一種是差錯(cuò)報(bào)文。其中查詢報(bào)文有以下幾種用途:
ping查詢(不要告訴我你不知道ping程序)
子網(wǎng)掩碼查詢(用于無(wú)盤工作站在初始化自身的時(shí)候初始化子網(wǎng)掩碼)
時(shí)間戳查詢(可以用來(lái)同步時(shí)間)
而差錯(cuò)報(bào)文則產(chǎn)生在數(shù)據(jù)傳送發(fā)生錯(cuò)誤的時(shí)候。就不贅述了。
2.ICMP的應(yīng)用--ping
ping可以說(shuō)是ICMP的最著名的應(yīng)用,當(dāng)我們某一個(gè)網(wǎng)站上不去的時(shí)候。通常會(huì)ping一下這個(gè)網(wǎng)站。ping會(huì)回顯出一些有用的信息。一般的信息如下:
Reply from 10.4.24.1: bytes=32 time<1msTTL=255
Reply from 10.4.24.1: bytes=32 time<1msTTL=255
Reply from 10.4.24.1: bytes=32 time<1msTTL=255
Reply from 10.4.24.1: bytes=32 time<1ms TTL=255
Ping statistics for 10.4.24.1:
Packets:Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum =0ms, Maximum = 0ms, Average = 0ms
ping這個(gè)單詞源自聲納定位,而這個(gè)程序的作用也確實(shí)如此,它利用ICMP協(xié)議包來(lái)偵測(cè)另一個(gè)主機(jī)是否可達(dá)。原理是用類型碼為0的ICMP發(fā)請(qǐng)求,受到請(qǐng)求的主機(jī)則用類型碼為8的ICMP回應(yīng)。ping程序來(lái)計(jì)算間隔時(shí)間,并計(jì)算有多少個(gè)包被送達(dá)。用戶就可以判斷網(wǎng)絡(luò)大致的情況。我們可以看到,ping給出來(lái)了傳送的時(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)椋?a target="_blank" href="http://m.opto-elec.com.cn/renzheng/187.htm">ICMP的ping請(qǐng)求數(shù)據(jù)報(bào)在每經(jīng)過(guò)一個(gè)路由器的時(shí)候,路由器都會(huì)把自己的ip放到該數(shù)據(jù)報(bào)中。而目的主機(jī)則會(huì)把這個(gè)ip列表復(fù)制到回應(yīng)icmp數(shù)據(jù)包中發(fā)回給主機(jī)。但是,無(wú)論如何,ip頭所能紀(jì)錄的路由列表是非常的有限。如果要觀察路由,我們還是需要使用更好的工具,就是要講到的Traceroute(windows下面的名字叫做tracert)。
3.ICMP的應(yīng)用--Traceroute
Traceroute是用來(lái)偵測(cè)主機(jī)到目的主機(jī)之間所經(jīng)路由情況的重要工具,也是最便利的工具。前面說(shuō)到,盡管ping工具也可以進(jìn)行偵測(cè),但是,因?yàn)閕p頭的限制,ping不能完全的記錄下所經(jīng)過(guò)的路由器。所以Traceroute正好就填補(bǔ)了這個(gè)缺憾。
Traceroute的原理是非常非常的有意思,它受到目的主機(jī)的IP后,首先給目的主機(jī)發(fā)送一個(gè)TTL=1(還記得TTL是什么嗎?)的UDP(后面就知道UDP是什么了)數(shù)據(jù)包,而經(jīng)過(guò)的第一個(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的問(wèn)題。