網(wǎng)絡(luò)協(xié)議檔案之ICMP、Ping、Traceroute
ICMP協(xié)議
ICMP經(jīng)常被認(rèn)為是IP層的一個(gè)組成部分,它是網(wǎng)絡(luò)層的一個(gè)協(xié)議,它傳遞差錯(cuò)報(bào)文以及其他需要注意的信息,ICMP報(bào)文通常被IP層或更高層(TCP、UDP等)使用,它是在IP數(shù)據(jù)報(bào)內(nèi)傳輸?shù)摹?/p>
ICMP報(bào)文大致分為兩類:查詢報(bào)文和差錯(cuò)報(bào)文。
先來(lái)看差錯(cuò)報(bào)文。當(dāng)傳送IP數(shù)據(jù)報(bào)發(fā)生錯(cuò)誤時(shí)(比如主機(jī)不可達(dá)、網(wǎng)絡(luò)不可達(dá)等),ICMP協(xié)議將會(huì)發(fā)送一個(gè)ICMP差錯(cuò)報(bào)文給源主機(jī),好讓主機(jī)做出相應(yīng)的處理,也因此IP層以上的一些協(xié)議有可能做到可靠傳輸。書中給出了ICMP差錯(cuò)報(bào)文中的一些組合(類型和代碼的組合)描述:如網(wǎng)絡(luò)不可達(dá)、網(wǎng)絡(luò)不可達(dá)、協(xié)議不可達(dá)、端口不可達(dá)等。這里說(shuō)下端口不可達(dá)的意思:UDP的規(guī)則之一是,如果收到一份UDP數(shù)據(jù)報(bào)而目的端口與某個(gè)正在使用的進(jìn)程不相符,那么UDP返回一個(gè)ICMP不可達(dá)報(bào)文,將報(bào)文中的類型和代碼的組合設(shè)定為端口不可達(dá)。Traceroute程序就是利用端口不可達(dá)來(lái)產(chǎn)生ICMP差錯(cuò)報(bào)文的。
另外,在大多數(shù)情況下,傳送IP數(shù)據(jù)報(bào)發(fā)生錯(cuò)誤,會(huì)產(chǎn)生一個(gè)ICMP錯(cuò)誤報(bào)文,但下面各種情況都不會(huì)導(dǎo)致產(chǎn)生ICMP差錯(cuò)報(bào)文:
* ICMP差錯(cuò)報(bào)文不會(huì)產(chǎn)生差錯(cuò)報(bào)文(ICMP查詢報(bào)文可能會(huì)產(chǎn)生ICMP差錯(cuò)報(bào)文);
* 目的地址是廣播地址和多播地址的IP數(shù)據(jù)報(bào);
* 作為鏈路層廣播的數(shù)據(jù)報(bào);
* 不是IP分片的***片
* 源地址不是單個(gè)主機(jī)的數(shù)據(jù)報(bào)。
這些規(guī)則是為了防止過(guò)去允許ICMP差錯(cuò)報(bào)文對(duì)廣播分組影響所帶來(lái)的廣播風(fēng)暴。
再來(lái)看ICMP查詢報(bào)文,查詢報(bào)文主要用途有:
* 子網(wǎng)掩碼查詢;
* 時(shí)間戳查詢;
* ping查詢。
ping程序
ping是ICMP的一個(gè)很著名的應(yīng)用。ping程序時(shí)對(duì)兩個(gè)TCP/IP系統(tǒng)連通性進(jìn)行測(cè)試的基本工具,它只利用ICMP回顯請(qǐng)求和回顯應(yīng)答報(bào)文,而不用經(jīng)過(guò)傳輸層,ping服務(wù)器一般在內(nèi)核中試下ICMP的功能。當(dāng)某一個(gè)網(wǎng)站訪問(wèn)不了時(shí),我們就可以ping一下這個(gè)網(wǎng)站,看下連通情況。比如下圖:
這里先ping到google的服務(wù)器,我們可以看到連通性不是很好,丟包率為50%,而我們又ping了下Github的服務(wù)器,連通性比較好,丟包率為0%。
Traceroute程序
Traceroute是ICMP協(xié)議的另一個(gè)重要應(yīng)用,主要用來(lái)偵測(cè)源主機(jī)到目的主機(jī)之間所經(jīng)過(guò)的路由的情況。Traceroute使用ICMP報(bào)文和IP首部中的TTL字段,其原理很簡(jiǎn)單,開始時(shí)發(fā)送一個(gè)TTL字段為1的UDP數(shù)據(jù)報(bào),而后每次收到ICMP超時(shí)報(bào)文后,再發(fā)送一個(gè)TTL字段加1的UDP數(shù)據(jù)報(bào),以確定路徑中的每個(gè)路由器,而每個(gè)路由器在丟棄UDP數(shù)據(jù)報(bào)時(shí)都會(huì)返回一個(gè)ICMP超時(shí)報(bào)文,最終到達(dá)目的主機(jī)后,由于ICMP選擇了一個(gè)不可能的值作為UDP端口(大于30000)。這樣目的主機(jī)就會(huì)發(fā)送一個(gè)端口不可達(dá)的ICMP差錯(cuò)報(bào)文。