官术网_书友最值得收藏!

1.4.4 ICMP協議

ICMP協議是網絡層的一個協議,用于探測網絡是否連通、主機是否可達、路由是否可用等。簡單來說,它是用來查詢診斷網絡的。

雖然和IP協議同處網絡層,但ICMP報文卻是作為IP數據報的數據,然后加上IP報頭后再發送出去的,如圖1-13所示。

圖1-13

IP首部的長度為20字節。ICMP報文作為IP數據報的數據部分,當IP首部的協議字段取值1時其數據部分是ICMP報文。ICMP報文格式如圖1-14所示。

圖1-14

其中,最上面的(0、8、16、31)指的是比特位,所以前3個字段(類型、代碼、校驗和)一共占了32個比特(類型占8位,代碼占8位,檢驗和占16位),即4字節。所有ICMP報文前4字節的格式都是一樣的,即任何ICMP報文都含有類型、代碼和校驗和這3個字段,8位類型和8位代碼字段一起決定了ICMP報文的種類。緊接著后面4字節取決于ICMP報文種類。前面8字節就是ICMP報文的首部,后面的ICMP數據部分的內容和長度也取決于ICMP報文種類。16位的檢驗和字段是對包括選項數據在內的整個ICMP數據報文的檢驗和,其計算方法和IP頭部檢驗和的計算方法一樣。

ICMP報文可分為2大類別:差錯報告報文和查詢報文。每一條(或稱每一種)ICMP報文要么屬于差錯報告報文,要么屬于查詢報文,如圖1-15所示。

圖1-15

1.ICMP差錯報告報文

我們從圖1-15中可以發現屬于差錯報告報文的ICMP報文很多,為了歸納方便,根據其類型的不同,可以將這些差錯報告報文分為5種類型:目的不可達(類型為3)、源端被關閉(類型為4)、重定向(類型為5)、超時(類型為11)和參數問題(類型為12)。

代碼字段不同的取值進一步表明了該類型ICMP報文的具體情況,比如類型為3的ICMP報文都是表明目的不可達,但目的不可達的原因可用代碼字段進一步說明,比如代碼為0表示網絡不可達、代碼為1表示主機不可達等。

ICMP協議規定,ICMP差錯報文必須包括產生該差錯報文的源數據報的IP首部,還必須包括跟在該IP(源IP)首部后面的前8個字節,這樣ICMP差錯報文的IP數據報長度=本IP首部(20字節)+本ICMP首部(8字節)+源IP首部(20字節)+源IP數據報的IP首部后的8個字節=56字節。ICMP差錯報文如圖1-16所示。

圖1-16

如圖1-17所示為一個具體的UDP端口不可達的差錯報文。

圖1-17

從圖1-17中可看到,IP數據報的長度是56字節。為了讓讀者更清晰地了解這五大類差錯報告報文格式,我們用圖形來表示每一類報文。

(1)ICMP目的不可達報文

目的不可達也稱終點不可達,可分為網絡不可達、主機不可達、協議不可達、端口不可達、需要分片但DF比特已置為1,以及源站選路失敗等16種報文,其代碼字段分別置為0至15。當出現以上16種情況時就向源站發送目的不可達報文。該類報文格式如圖1-18所示。

(2)ICMP源端被關閉報文

也稱源站抑制,當路由器或主機由于擁塞而丟棄數據報時,就向源站發送源站抑制報文,使源站知道應當將數據報的發送速率放慢。該類報文格式如圖1-19所示。

(3)ICMP重定向報文

當IP數據報應該被發送到另一個路由器時,收到該數據報的當前路由器就要發送ICMP重定向差錯報文給IP數據報的發送端。重定向一般用來讓具有很少選路信息的主機逐漸建立更完善的路由表。ICMP重定向報文只能有路由器產生。該類報文格式如圖1-20所示。

圖1-18

圖1-19

圖1-20

(4)ICMP超時報文

當路由器收到生存時間為零的數據報時,除丟棄該數據報外,還要向源站發送超時報文。當目的站在預先規定的時間內不能收到一個數據報的全部數據報片時,就將已收到的數據報片都丟棄,并向源站發送時間超時報文。該類報文格式如圖1-21所示。

圖1-21

(5)ICMP參數問題

當路由器或目的主機收到的數據報的首部中的字段的值不正確時,就丟棄該數據報,并向源站發送參數問題報文。該類報文格式如圖1-22所示。

圖1-22

2.ICMP查詢報文

根據功能的不同,ICMP查詢報文可以分為4大類:請求回顯(Echo)或應答、請求時間戳(Timestamp)或應答、請求地址掩碼(Address Mask)或應答、請求路由器或通告。種類由類型和代碼字段決定,其類型和代碼,如表1-3所示。

表1-3 ICMP查詢報文的種類

關于回顯請求和應答,Echo的中文翻譯為回聲,有的文獻用回送或回顯,本書用回顯。請求回顯的含義就好比請求對方回復一個應答。Linux或Windows下有個ping命令,值得注意的是,Linux下ping命令產生的ICMP報文大小是64字節(56+8=64,56是ICMP報文數據部分長度,8是ICMP報頭部分長度),而Windows(如XP)下ping命令產生的ICMP報文大小是40字節(32+8=40)。該命令就是本機向一個目的主機發送一個請求回顯(類型Type=8)的ICMP報文,如果途中沒有異常(例如被路由器丟棄、目標不回應ICMP或傳輸失?。?,則目標返回一個回顯應答的ICMP報文(類型Type=0),表明這臺主機存在。

為了讓讀者更清晰地了解這四類查詢報文格式,用圖表示每一類報文,如圖1-23~圖1-27所示。

(1)ICMP請求回顯和應答報文格式

圖1-23

(2)ICMP時間戳請求和應答報文格式

圖1-24

(3)ICMP地址掩碼請求和應答報文格式

圖1-25

(4)ICMP路由器請求報文和通告報文格式

圖1-26

圖1-27

例1.1】 抓包查看來自Windows的ping包。

(1)啟動VMware下的虛擬機XP,設置網絡連接方式為NAT,則虛擬機XP會連接到虛擬交換機VMnet8上。

(2)在Windows 7安裝并打開抓包軟件Wireshark,選擇要捕獲網絡數據報的網卡是VMware Virtual Ethernet Adapter for VMnet8,如圖1-28所示。

圖1-28

雙擊圖1-28中選中的網卡,就開始在該網卡上捕獲數據。此時在虛擬機XP(192.168.80.129)下ping宿主機(192.168.80.1),可以在Wireshark下看到捕獲到的ping包,如圖1-29所示為回顯請求,可以看到ICMP報文的數據部分是32字節,如果加上ICMP報頭(8字節),則為40字節。

圖1-29

如圖1-30所示為回顯應答,ICMP報文的數據部分長度依然是32字節。

圖1-30

例1.2】 抓包查看來自Linux的ping包。

(1)啟動VMware下的虛擬機Linux,設置網絡連接方式為NAT,則虛擬機Linux會連接到虛擬交換機VMnet8上。

(2)在Windows 7安裝并打開抓包軟件Wireshark,選擇要捕獲網絡數據報的網卡是VMware Virtual Ethernet Adapter for VMnet8,圖片可以參考例1.1。

在虛擬機Linux(192.168.80.128)下ping宿主機(192.168.80.1),可以在Wireshark下看到捕獲到的ping包,如圖1-31所示為回顯請求,可以看到ICMP報文的數據部分是56字節,如果加上ICMP報頭(8字節),則為64字節。

圖1-31

如圖1-32所示為回顯應答,ICMP報文的數據部分長度依然是56字節。

圖1-32

主站蜘蛛池模板: 宝兴县| 山东省| 辽阳市| 清远市| 永济市| 新田县| 屯门区| 南投县| 武城县| 监利县| 万源市| 会理县| 安康市| 剑川县| 剑河县| 蓬莱市| 文成县| 阿巴嘎旗| 东山县| 永春县| 崇文区| 开远市| 阿拉善右旗| 池州市| 五常市| 吉隆县| 湖北省| 丹东市| 凤翔县| 吉安县| 兴化市| 石柱| 从化市| 高平市| 三台县| 武夷山市| 庆阳市| 虹口区| 彭州市| 苗栗市| 湾仔区|