Ping程序就是調用的就是ICMP報文。利用的是ICMP的應答和回顯請求。來看下具體的ping報文。 Request的報文類型為8
Reply的類型為0
通過具體的ping報文可以看到ping報文的大小為84字節。其中ICMP報文56個字節,再加上20個字節的IP首部和8個字節的ICMP首部。因此IP報文的總長度為84字節
我們也可以改變ICMP的報文大小,通過-s命令。Ping www.sina.com.cn –s 32. 將ICMP報文大小設置為32字節。加上20字節的IP首部以及8字節的ICMP首部,總共60個字節
Ping程序中還可以通過設置ping的次數,通過-c。ping www.sina.com.cn –c 3.在ping了3次以后,ping程序自動停止
其他ping的字段設置可以通過man ping查看,一般用的最多的就是-s和-c。
IP記錄路由選項:ping程序還可以記錄所經過路徑的IP地址。這個通過-R的方法來實現。Ping程序在發送出去的IP數據報中設置IP RR選項。這樣每個處理該數據報的路由器都把它的IP地址放入選項字段中。當數據包達到目的端時,IP地址清單就復制到ICMP回顯應答中。當ping程序收到回顯應答時,它就打印出這份IP地址清單。
數據格式如下:由於IP首部中的首部長度字段只有4bit,因此IP首部最長只能包含15個32bit的字=60字節。IP首部為20個字節。RR選項用去3個字節。這樣只剩下37個字節來存放IP地址清單,一個IP地址為4個字節,因此最大也就只能存放9個IP地址。在當前的互聯網場景下,9個IP地址太少了。一半情況下都滿足不了要求
結果顯示如下,我們用ping局域網192.168.0.1的例子來看,首先顯示的是去的路徑192.168.0.8->192.168.0.1然后是回來的路徑192.168.0.1->192.168.0.8
Traceroute:
前面講到IP可以記錄路由選項。但是IP首部中留給選項空間有限,不可能存放太多的路徑,最多只能存放9個地址,對於現在的網絡來說遠遠不夠,那么如果我們想探究網絡路徑可以用traceroute命令。
Traceroute主要運用的是ttl原理
1 首先第一個包發出,ttl為1. 由於目的路由器為將ttl減一,因此返回ICMP超時給主機,記錄返回的路由地址
2 然后主機繼續發出ICMP報文,設置ttl為2,這樣在經過第二個路由器的時候,返回ICMP超時給主機。記錄返回的路由地址
.。。。。。。
一直重復這個過程,每次都將ttl在上一次的基礎上加一,直到達到目的地。這樣就可以記錄所有經過的路由地址
但是在windows和linux下命令名稱不一樣,而且實現方式也不太一樣
Windows下用的命令是tracert,linux下用的是traceroute
實現方式來說:
Windows下使用的是ICMP報文,而linux下使用的是UDP報文。這個有什么區別呢
看下windows下的結果:
Linux下的結果:
從最終的執行結果來看,看不出什么差異,
繼續看下報文的結果,首先來看windows下的
從報文中可以看出ttl不斷的在增長。
而且主機發出的報文全都是ICMP報文。
Linux下的報文可以看到主機發出的報文都是UDP報文,而且每個報文都帶有一個目的端口,端口每次都在增長。
帶的是一個UDP報文,而非ICMP報文
但是從對端反饋回的報文都是ICMP報文。且最終目的地址反饋一個port unreachable的報文。這個端口不可達的報文在windows系統中並沒有找到。
從上面的報文對比可以看到windows下和linux下的traceroute報文是不一樣的。Windows下是純粹使用ICMP報文。直到找到目的地址,並記錄經過的路徑
而linux下是發出一個UDP報文。且同樣也設置TTL時長,但選擇一個不可能的值作為UDP端口(大於30000),使目的主機的任何一個應用程序都不可能使用這個端口。最終目的主機會產生一份端口不可達的錯誤。此時就判斷結束。具體流程參考下圖