ICMP是(Internet Control Message Protocol)Internet控制報文協議。它是TCP/IP協議簇的一個子協議,用於在IP主機、路由器之間傳遞控制消息。控制消息是指網絡通不通、主機是否可達、路由是否可用等網絡自己的消息。這些控制消息雖然並不傳輸用戶數據,可是對於用戶數據的傳遞起着重要的做用。linux
它是TCP/IP協議族的一個子協議,屬於網絡層協議,主要用於在主機與路由器之間傳遞控制信息,包括報告錯誤、交換受限控制和狀態信息等。當遇到IP數據沒法訪問目標、IP路由器沒法按當前的傳輸速率轉發數據包等狀況時,會自動發送ICMP消息。ICMP報文在IP幀結構的首部協議類型字段(Protocol 8bit)的值=1.windows
在IP通訊中,常常有數據包到達不了對方的狀況。緣由是,在通訊途中的某處的一個路由器因爲不能處理全部的數據包,就將數據包一個一個丟棄了。或者,雖然到達了對方,可是因爲搞錯了端口號,服務器軟件可能不能接受它。在IP 網絡上,因爲數據包被丟棄等緣由,爲了控制將必要的信息傳遞給發信方。ICMP 協議是爲了輔助IP 協議,交換各類各樣的控制信息而被製造出來的。安全
RFC792 的開頭部分裏寫着「ICMP 是IP 的不可缺乏的部分,全部的IP 軟件必須實現ICMP協議。也是,ICMP 是爲了分擔IP 一部分功能而被制定出來的。服務器
在RFC,將ICMP 大體分紅兩種功能:差錯通知和信息查詢。網絡
1. 確認IP包是否成功到達目標地址 ssh
2. 通知在發送過程當中IP包被丟棄的緣由 工具
注意點url
一、ICMP是基於IP協議工做的,可是它並非傳輸層的功能,所以仍然把它歸結爲網絡層協議 操作系統
二、ICMP只能搭配IPv4使用,若是是IPv6的狀況下, 須要是用ICMPv6 blog
ICMP 的內容是放在IP 數據包的數據部分裏來互相交流的。也就是,從ICMP的報文格式來講,ICMP 是IP 的上層協議。可是,正如RFC 所記載的,ICMP 是分擔了IP 的一部分功能。因此,被認爲是與IP 同層的協議。看一下RFC 規定的數據包格式和報文內容吧。
ICMP報文包含在IP數據報中,IP報頭在ICMP報文的最前面。一個ICMP報文包括IP報頭(至少20字節)、ICMP報頭(至少八字節)和ICMP報文(屬於ICMP報文的數據部分)。當IP報頭中的協議字段值爲1時,就說明這是一個ICMP報文。ICMP報頭以下圖所示。
以下圖:
上圖包含了IP首部以及ICMP,如下是ICMP部分
詳細地看一下數據包的格式吧。用來傳送ICMP 報文的IP 數據包上實際上有很多字段。可是實際上與ICMP 協議相關的只有7 個子段。
1)協議;2)源IP 地址;3)目的IP 地址;4)生存時間;這四個包含在IP 首部的字段。
5)類型;6)代碼;7)選項數據;這三個包含在ICMP數據部分的字段。
這裏面,1)協議字段值是1。2)和3)是用來交流ICMP 報文的地址信息,沒有特殊意義。對於理解ICMP 自己,重要的是5),6),7)三個字段。這裏面的能夠稱爲核心的重要字段是5)類型,6)代碼這兩個字段。全部ICMP 用來交流錯誤通知和信息詢問的報文,都是由類型和代碼的組合來表示的。RFC 定義了15種類型。「報文不可到達」這樣的錯誤通知和「回送請求」這樣的信息查詢是由類型字段來區分的。ICMP報文由類型來表達它的大概意義,須要傳遞細小的信息時由代碼來分類。進一步,須要向對方傳送數據的時候,用7)選項數據字段來放置。
可能的消息列表:
所謂路徑MTU 探索,是探索與通訊對方之間不用分片IP 數據包,就能交流的MTU 大小的功能。MTU大小是指計算機一次可以送出去的數據的最大長度,基本上由網路的種類來決定。例如,以太網的話一般是1500 字節,使用PPPoE 的ADSL 一般是1492 字節。爲了實現這個路徑MTU 探索,ICMP 被使用着。
路徑MTU 探索的原理自己是很是簡單的。首先,Windows 向通訊對方送IP 數據包時,先設置IP 首部的分片禁止標誌而後再送。這是路徑MTU 探索的基本。假如,Windows 將大於1000 字節的數據包送了出去,通訊路徑上有MTU 從1500 字節變成1000 字節的地方。所以,那個路由器將不容許超過1000 字節的數據包經過,而進入MTU 是1000 字節的網路。路由器嘗試着將IP 數據包分片。可是由於數據包的分片禁止標誌是有效的,因此不能分片。該路由器就將該IP 數據包丟棄,並用ICMP 通知送信方「想分片,但不能分片」。這時路由器發送的ICMP的類型字段是3,代碼字段爲4。這是「須要分片但不能分片,不能送至終點」的意思。並且,大多數路由器將在數據選項部裏填入不分片就能經過的MTU 大小。Windows 收到該ICMP 報文後就知道了不分片就可以傳送的數據大小,並暫時將MTU 大小更換掉,而後繼續通訊。
改變路由是指路由器向送信方計算機指示路徑改變這個功能。計算機根據本身的路由信息(路由表)來決定傳送目標。不知道發給誰好的時候,就將數據包發給設爲默認網關的路由器。被指定爲默認網關的路由器接收到數據包,發現將數據包發給局域網內的其它路由器會比較快的時候,將這一信息經過ICMP 通知發送方。這時使用的是,類型是5,代碼是1 的ICMP 改變路由報文。在選項數據部分裏寫着應該發送給的路由器IP 地址。Windows 收到這個報文後,重寫本身的路由表,與對方的通訊將在一段時間裏經由被指定的路由器來實行。
數據包集中到達某一路由器後,數據包由於來不及被處理,有可能被丟棄的狀況。這時候,向送信方發送的是ICMP 源點抑制報文,用來使送行方減慢發送速度。
ping 命令用來在IP 層次上調查與指定機器是否連通,調查數據包往復須要多少時間。爲了實現這個功能,ping 命令使用了兩個ICMP 報文。
注意, 此處 ping 的是域名,不是url,域名能夠經過DNS解析成IP地址
ping命令的功能
(1)能驗證網絡的連通性
(2)會統計響應時間和TTL(IP包中的Time To Live,生存週期)
那麼如何驗證的呢?
(1)ping命令會先發送一個 ICMP Echo Request給對端
(2)對端接收到以後, 會返回一個ICMP Echo Reply
(3)若沒有返回,就是超時了,會認爲指定的網絡地址不存在。
問題:
telnet是23端口,ssh是22端口,那麼ping是什麼端口?
答:ping命令是基於ICMP,是在網絡層。
而端口號,是傳輸層的內容。因此在ICMP中根本就不關注端口號這樣的信息。
用ping 命令不能肯定與對方連通的緣由大體有三個。
1)目標服務器不存在;
2) 花在數據包交流上的時間太長ping 命令認爲超時;
3)目標服務器不回答ping 命令。
若是是緣由2),經過ping 命令的選項來延長到超時的等待時間,就能正確顯示結果了。若是緣由是1)或3)的話,僅憑ping 命令的結果就不能判斷是哪方了。正如這樣,ping 命令不必定必定能判斷對方是否存在。
功能:打印出可執行程序主機,一直到目標主機以前經歷多少路由器。
linux、mac:traceroute www.baidu.com
windows:tracert www.baidu.com
2.六、端口掃描
端口掃描就是檢查服務器不須要的端口是否開着。服務器管理者用來檢查有沒有安全上有問題的漏洞開着。不是象ping 和traceroute 那樣是操做系統自帶的工具,須要利用網絡工具才行。
端口掃描大體分爲「UDP 的端口掃描」和「TCP 的端口掃描」兩種。這裏面,與ICMP 相關的是UDP一邊。使用TCP 的通訊,通訊以前一定要先遵循三向握手的程序。所以,只要邊錯開端口號邊嘗試TCP鏈接就能調查端口的開閉。不特別須要ICMP。與此相對,UDP 沒有這樣的鏈接程序。所以,調查端口是否打開須要想點辦法。這樣,被使用的是ICMP。根據ICMP 規格,UDP 數據包到達不存在的端口時,服務器須要返回ICMP 的「終點不可達」之一的「端口不可達」報文。