ICMP概念:
由圖可知ICMP其實比IP層是要高一級的,但是此處將其放在IP層
ICMP種類由八位類型決定有的還需要8位代碼
ICMP報文分類:
1:差錯報文
為了避免過去允許ICMP差錯保溫對廣播分組相應所帶來的廣播風暴
1.1 ICMP端口不可達
類型(類型3:代表不可達差錯報文)|代碼(0-15)|校驗和(與IP首部校驗和計算方法相同)|未用(必須為0)|
IP首部(包括選項)+原始IP數據報中數據的前八字節
舉一個例子,在tftp中,UDP的公共端口號通常是69,但是tftp允許利用connect鏈接到一個不同的端口,當利用此端口號去找目的主機的端口的時候,就會發生端口不可達的錯誤,此時利用ICMP報文,傳達一個端口不可達的信息
列如
會發現並沒有這個報文(在這里其實百度並沒有tftp)
並且利用tcpdump觀看會看到
返回的ICMP差錯報文
1.2ICMP主機與網絡不可達
sun % netstat -rn
Rounting tables
Destination gateway Flags Refcnt Use Interface
140.252.13.65 140.252.13.35 UGH (正在使用該路由的進程) (發送的分組) 接口
127.0.0.1 127.0.0.1 UH
140.252.1.183(注意這是點對點的另一端IP) 140.252.1.29(這就是本機的另一個端口) UH(分析,可用U,用H是因為目的端是一個主機,而沒有G是因為140.252.1.29是一個接口不是網關)
default 140.252.1.183 UG
140.252.13.32(以太網)140.252.13.33(出口) U
在這里當SLIP線路被拔掉的時候3,4行就會消失(因為這兩行是SLIP軟件啟動的時候自動創建的,當SLIP不存在的時候自動取消)
所以當有
svr4% ping gemini
svr4>gemini:icmp:echo request
sun>svr4:icmp:host gemini unreachable
主機不可達,因為找不到路由
類型(類型3:代表目的不可達)|代碼(1,代表主機不可達)|校驗和(與IP首部校驗和計算方法相同)|未用(必須為0)|
IP首部(包括選項)+原始IP數據報中數據的前八字節
1.3ICMP不可達報文(需要分片)
類型(類型3:代表目的不可達)|代碼(4,因為設置了IP層不允許分片位,所以對超過了MTU的IP報文不能進行分片,所以發生不可達)|校驗和(與IP首部校驗和計算方法相同)|未用(必須為0。4個字節)|下一站網絡MTU|IP首部(包括選項)+原始IP數據報中數據的前八字節
列如在solaris上面對bsdi發送600字節的數據報(ICMP請求回顯報文),可以利用ping程序指定發送字節數,
列如在solaris上面發送數據
solaris > bsdi:icmp:echo request(DF)設置了不分片標志
bsdi > solaris:icmp :echo reply(DF)
sun>bsdi:icmp :solaris unreachable - need to frag mtu = 0(DF)
在bsid上面利用tcpdump上面觀察
1.4ICMP重定向錯誤
類型(類型5:重定向)|代碼(0默認)|校驗和(與IP首部校驗和計算方法相同)|應該使用的路由器IP地址|
IP首部(包括選項)+原始IP數據報中數據的前八字節
概念
重定向是如何發生的:比如主機要發送一份文檔給R2,但是R1是主機的默認路由,發給R1后,R1將數據報發送給R2,在發送的時候會發現,數據報接受的端口和發送時候的端口是一致的,因此R1發送ICMP重定向報文
比如說本來有這么一條
Destination gateway Flags Refcnt Use Interface
default 140.252.1.4 UG (正在使用該路由的進程) (發送的分組) 接口
本來只有這一條默認的,現在則應該加上一條重定向的路由表項
140.252.13.35 140.252.1.183 UGHD
D:表示是一個ICMP重定向的路由條目
1.5ICMP源站抑制差錯
類型(類型4:ICMP源站抑制差錯)|代碼(0)|校驗和(與IP首部校驗和計算方法相同)|未用(4字節)|IP首部(包括選項)+原始IP數據報中數據的前八字節
概念,比如說從一個以太網局域網中發送數據給internet上面主機數據,途中經過點對點鏈路,由於點對點鏈路速度緩慢,發送的速度小於接受的速度,這就可能造成接受的路由器發送ICMP源站抑制差錯報文
2:查詢報文
2.1ICMP地址掩碼請求與應答
類型(類型17:ICMP地址掩碼請求/類型18:ICMP地址掩碼應答)|代碼(0)|校驗和(與IP首部校驗和計算方法相同)|標志符|序列號|32位地址掩碼
假定icmpaddrmask能夠發送ICMP地址掩碼請求
icmpaddrmask 140.252.13.63(是一個廣播地址)
received mask=ffffffe0,from 140.252.13.33 來自本機
received mask=ffffffe0,from 140.252.13.35 來自bsdi
其中發送是廣播發送的,但是應答不是廣播發送的
2.2CMP時間戳請求於應答
類型(類型13:時間戳請求/類型14:ICMP時間戳應答)|代碼(0)|校驗和(與IP首部校驗和計算方法相同)|標志符|序列號|發起時間戳(請求端填寫發起時間戳)|接收時間戳(應答系統收到的時候填寫)|傳送時間戳(應答系統發送的時候填寫,不過經常傳送和接收時間戳相同)
作用可以獲得時間
2.3PING程序
類型(類型0:回顯應答/類型8:回顯請求)|代碼(0)|校驗和(與IP首部校驗和計算方法相同)|標志符(設置成發送進程ID這樣運行多個ping程序也可以識別)|序列號(每發送一次新的回顯就加1)|選項數據
2.3.1概念:PING並不是一個用戶進程,他是在內核中直接實現的,他是一種盡力而為的數據報傳送服務,因此可能發生分組的丟失,重復,失序
2.3.2PING程序實際操作
第二張圖為tcpdump抓取指令所收到的,分析,ICMP請求報文,id2761,序列號27,length 98=以太網頭部14個字節+ip數據報頭部20個字節+ICMP報文64個字節(8字節的頭部和56字節的數據)
56byte of data是指ICMP有56個數據,下面加上8個字節即為ICMP數據報長度,所以發送的是64個字節
icmp_seq指的是ICMP回顯的序列,27(同一個請求和回顯序列號相同),長度是64
time是指的往返時間,在發送的時候PING程序會在ICMP報文中存放發送時間,當接到回顯應答的時候,將此刻的時間減去發送時間即能得到往返時間
注意當緩存中沒有ARP緩存的時候,會在ping程序發送ICMP請求回顯報文之前發送一份ARP請求報文,所以按照PING時間計算方法,時間會加長
2.3.2 ping記錄路由選項功能 是開啟IP數據報的RR選項
ping -R www.baidu.com 顯示所經過的路由器
記錄選項格式
code(指明IP選項類型)|len(選項長度,一般是39,可以記錄9個IP記錄)|ptr(指針指向第幾個IP路由)|(IP addr #1)|(IP addr #2)|IP addr #3(<-ptr=12).......|(IP addr #4)<-ptr=40
解釋10:31:11.497395 0c:8b:fd:34:db:86 > 58:44:98:f8:a0:0c, ethertype IPv4 (0x0800), length 138
138是指ip數據報加上以太網頭部總長度
(tos 0x0, ttl 64, id 8146, offset 0, flags [DF], proto ICMP (1), length 124:長度是指以IP數據報長度
options (NOP,RR 192.168.43.146, 0.0.0.0 0.0.0.0 0.0.0.0 0.0.0.0 0.0.0.0 0.0.0.0 0.0.0.0 0.0.0.0)RR選項記錄詳細
192.168.43.146 > 112.80.248.73: ICMP echo request, id 3918, seq 22, length 64:64是指ICMP保溫長度
注意只能記錄9個,ping外網沒用,內網ok!!!!
2.4ICMP路由器發現報文
類型(10:路由器請求報文)|代碼(0)|校驗和|(未用,設置為0)->為總共八個字節
一般認為主機在引導以后要廣播或者多播一份路由器請求報文
2.5ICMP路由器應答報文
類型(9:路由器應答報文)|代碼(0)|校驗和|地址數(后續有多少個地址)|地址項長度(默認為2)|生存時間(秒數)|路由器地址【1】|優先級【1】(表示作為默認地址的優先級。。。都是默認地址!!!!)
一般情況下,路由器會隨機發送路由器應答報文!!!!