1. 程式人生 > 其它 >ICMP協議課本知識

ICMP協議課本知識

什麼是icmp協議

ICMP是(Internet Control Message Protocol)Internet控制報文協議。它是TCP/IP協議族的一個子協議,用於在IP主機、路由器之間傳遞控制訊息。控制訊息是指網路通不通、主機是否可達、路由是否可用等網路本身的訊息。這些控制訊息雖然並不傳輸使用者資料,但是對於使用者資料的傳遞起著重要的作用。

定義

ICMP協議是一種面向無連線的協議,用於傳輸出錯報告控制資訊。它是一個非常重要的協議,它對於網路安全具有極其重要的意義。

它是TCP/IP協議族的一個子協議,屬於網路層協議,主要用於在主機與路由器之間傳遞控制資訊,包括報告錯誤、交換受限控制和狀態資訊等。當遇到IP資料無法訪問目標、IP路由器無法按當前的傳輸速率轉發資料包等情況時,會自動傳送ICMP訊息。ICMP報文在IP幀結構的首部協議型別欄位(Protocol 8bit)的值=1.

如下圖所示,ICMP包有一個8位元組長的包頭,其中前4個位元組是固定的格式,包含8位型別欄位,8位程式碼欄位和16位的校驗和;後4個位元組根據ICMP包的型別而取不同的值。

Understanding Ping Command and ICMP with Examples
What is ICMP type?
Understanding ICMP Packets with Examples

ICMP提供一致易懂的出錯報告資訊。傳送的出錯報文返回到傳送原資料的裝置,因為只有傳送裝置才是出錯報文的邏輯接受者。傳送裝置隨後可根據ICMP報文確定發生錯誤的型別,並確定如何才能更好地重發失敗的資料包。但是ICMP唯一的功能是報告問題而不是糾正錯誤,糾正錯誤的任務由傳送方完成。

我們在網路中經常會使用到ICMP協議,比如我們經常使用的用於檢查網路通不通的Ping命令(Linux和Windows中均有),這個“Ping”的過程實際上就是ICMP協議工作的過程。還有其他的網路命令如跟蹤路由的Tracert命令也是基於ICMP協議的。

13fb8ad9562cfcfaa95f15a5fa34bd4d.png

ICMP協議到底屬於哪一層

icmp協議是IP層的附屬協議,是介於IP層和TCP層之間的協議,一般認為屬於IP層協議。IP協議用它來與其他主機或路由器交換錯誤報文和其他的一些網路情況。在ICMP包重攜帶了控制資訊和故障恢復資訊。主要用於路由器主機向其他路由器或者主機發送出錯報文的控制資訊​。

ICMP的功能特點

e33e4657fe4bd28f3aa407685d5be9a4.png

ICMP本身是網路層的一個協議;

ICMP差錯報告採用路由器-源主機的模式,路由器在發現數據報傳輸出現錯誤時只向源主機報告差錯原因;

ICMP並不能保證所有的IP資料報都能夠傳輸到目的主機;

ICMP不能糾正差錯,它只是報告差錯。差錯處理需要由高層協議去完成。

它是TCP/IP協議族的一個子協議,用於在IP主機、路由器之間傳遞控制訊息。控制訊息是指網路通不 通、主機是否可達、路由是否可用等網路本身的訊息。這些控制訊息雖然並不傳輸使用者資料,但是對於使用者資料的傳遞起著重要的作用。 ICMP的作用與特點 ICMP的特點: ICMP本身是網路層的一個協議; ICMP差錯報告採用路由器-源主機的模式,路由器在發現數據報傳輸出現錯誤時只向源主機報告差錯原因; ICMP並不能保證所有的IP資料報都能夠傳輸到目的主機; ICMP不能糾正差錯,它只是報告差錯。差錯處理需要由高層協議去完成。 ICMP報文型別 ICMP差錯控制 ICMP差錯報告報文: 目的站不可達: 源站抑制 超時 引數問題 改變路由 目的站不可到達 網路不可到達(net unreachable) 主機不可到達(host unreachable) 協議不可到達(protocol unreachable) 埠不可到達(port unreachable) 源路由選擇不能完成(source route failed) 目的網路不可知(unknown destination network) 目的主機不可知(unknown destination host)

Exploring ICMP Protocol with Examples
Exploring ICMP with Examples

ping命令是什麼協議?

維基百科介紹:

ping是一種電腦網路工具,用來測試資料包能否通過IP協議到達特定主機。ping的運作原理是向目標主機傳出一個ICMP echo@要求資料包,並等待接收echo迴應資料包。程式會按時間和成功響應的次數估算丟失資料包率(丟包率)和資料包往返時間(網路時延,Round-trip delay time)。

可以知道,ping基於ICMP協議。

ICMP屬於哪一層?

查閱書籍《TCP/IP協議族》,第9章“網路控制報文協議(ICMP)”,我們可以看到下面這一段話:

IP協議還缺少主機和管理查詢所需要的機制。主機有時候需要判斷某個路由器或者是對方主機是否活躍。有時網路管理員也需要來自其他主機或路由器的資訊。
網路控制報文協議(ICMP)是設計來彌補上述兩個遺憾的,它是IP協議的伴侶。圖9.1給出了ICMP協議在網路層中的位置,以及它與IP及其他協議之間的關係。

檢視《TCP/IP協議詳解卷1》,第6章“ICMP:Internet控制報文協議”:

ICMP經常被認為是IP層的一個組成部分。它傳遞差錯報文以及其他需要注意的資訊。
ICMP報文通常被IP層或更高層協議(TCP或UDP)使用。

由此可見,ICMP位於網路層,與IP屬於同一層。

進一步驗證
我們進一步檢視權威的資料,找到RFC 792文件:

The Internet Protocol (IP) [1] is used for host-to-host datagram
service in a system of interconnected networks called the
Catenet [2]. The network connecting devices are called Gateways.
These gateways communicate between themselves for control purposes
via a Gateway to Gateway Protocol (GGP) [3,4]. Occasionally a
gateway or destination host will communicate with a source host, for
example, to report an error in datagram processing. For such
purposes this protocol, the Internet Control Message Protocol (ICMP),
is used. ICMP, uses the basic support of IP as if it were a higher
level protocol, however, ICMP is actually an integral part of IP, and
must be implemented by every IP module
.

大意就是:

ICMP協議是用於host到host之間的資料報服務,目的host與源host進行通訊時,ICMP會用到,比如通過處理資料報報告一個錯誤。
ICMP基於IP,以至於它看起來像一個上層協議,但是實際上是IP的一部分,而且必須在每個IP模組中實現。

至於ICMP的詳細作用以及幀結構定義,這裡不再贅述,讀者自行了解。

Exploring ICMP Port Number with Example

ICMP差錯報文

報告IP資料報在傳輸中的差錯是ICMP報文最基本的功能,ICMP差錯報文有如下特點:

ICMP差錯報文都是由路由器傳送到源主機的,因為IP資料報中含有源主機的IP地址,報告給源主機是最可行的方案,另外,發出IP資料報的源主機最需要知道資料是否到達目標主機。
ICMP差錯報文只提供IP資料報在傳輸過程中的差錯報告,並不規定對各類差錯應採取什麼樣的處理措施。具體對差錯的處理,由收到ICMP差錯報文的源主機將相應的差錯與應用程式聯絡起來才能進行相應的差錯處理。
ICMP差錯報文不享受任何優先權,也沒有特別的可靠性保證措施,與普通的IP資料報一樣進行傳輸,傳輸過程中可能被丟失、損壞,甚至被拋棄。
ICMP差錯報文是伴隨著拋棄出錯的IP資料報而產生的。
當路由器傳送一份引數錯誤等的ICMP差錯報文時,ICMP報文資料區始終包含產生ICMP差錯報文的IP資料報的頭部和其資料區的前8個位元組(64位)。
在有些情況下,為了防止在網路中產生大量的ICMP差錯報文(廣播風暴),影響網路的正常工作,即使發生差錯,也不會產生ICMP差錯報文,這些情況包括:
●ICMP報文發生差錯。這是為了避免差錯報文無休止產生而規定的(但ICMP查詢報文可能會產生ICMP差錯報文)。
●目的地址是廣播地址或多播地址(D類地址)的IP資料報。
●作為鏈路層廣播的資料報。
●不是IP分片的第一片。
●源地址不是單個主機的資料報。這就是說,源地址不能為零地址、回送地址、廣播地址或多播地址。

Capture ICMP Packets With Tcpdump
Filtering ICMP ICMPv6 Packets with Tcpdump