热门问题
时间线
聊天
视角
互聯網控制訊息協定
互联网协议族的核心协议之一。主要用于IPv4网络,以指示网络操作中的错误消息 来自维基百科,自由的百科全书
Remove ads
互聯網控制訊息協定(英語:Internet Control Message Protocol,縮寫:ICMP)是互聯網協定套組的核心協定之一。它用於網際網絡協定(IP)中傳送控制訊息,提供可能發生在通訊環境中的各種問題反饋。通過這些資訊,使管理者可以對所發生的問題作出診斷,然後採取適當的措施解決。
![]() | 此條目翻譯自英語維基百科,需要相關領域的編者協助校對翻譯。 |
ICMP [1]依靠IP來完成它的任務,它是IP的主要部分。它與傳輸協定(如TCP和UDP)顯著不同:它一般不用於在兩點間傳輸數據。它通常不由網絡程式直接使用,除了 ping 和 traceroute 這兩個特別的例子。 IPv4中的ICMP被稱作ICMPv4,IPv6中的ICMP則被稱作ICMPv6。
技術細節
ICMP是在 RFC 792 中定義的互聯網協定套組之一。通常用於返回的錯誤資訊或是分析路由。ICMP錯誤訊息總是包括了源數據並返回給傳送者。 ICMP錯誤訊息的例子之一是TTL值過期。每個路由器在轉發數據報的時候都會把IP包頭中的TTL值減1。如果TTL值為0,「TTL在傳輸中過期」的訊息將會回報給源地址。 每個ICMP訊息都是直接封裝在一個IP封包中的,因此,和UDP一樣,ICMP是不可靠的。
雖然ICMP是包含在IP封包中的,但是對ICMP訊息通常會特殊處理,會和一般IP封包的處理不同,而不是作為IP的一個子協定來處理。在很多時候,需要去檢視ICMP訊息的內容,然後傳送適當的錯誤訊息到那個原來產生IP封包的程式,即那個導致ICMP訊息被傳送的IP封包。
很多常用的工具是基於ICMP訊息的。traceroute 是通過傳送包含有特殊的TTL的包,然後接收ICMP超時訊息和目標不可達訊息來實現的。 ping 則是用ICMP的"Echo request"(類別代碼:8)和"Echo reply"(類別代碼:0)訊息來實現的。
Remove ads
ICMP封包結構
ICMP報頭從IP報頭的第160位元開始(IP首部20位元組)(除非使用了IP報頭的可選部分)。
- Type - ICMP的類型,標識生成的錯誤封包;
- Code - 進一步劃分ICMP的類型,該欄位用來尋找產生錯誤的原因.;例如,ICMP的目標不可達類型可以把這個位設為1至15等來表示不同的意思。
- Checksum - Internet校驗和(RFC 1071),用於進行錯誤檢查,該校驗和是從ICMP頭和以該欄位替換為0的數據計算得出的。
- Rest of Header - 報頭的其餘部分,四位元組欄位,內容根據ICMP類型和代碼而有所不同。
填充的數據緊接在ICMP報頭的後面(以8位元為一組):
封包類型
Remove ads
源站抑制封包旨在請求傳送方降低發往路由器或主機的封包傳送速率。在接收的過程中,當接收方沒有足夠的接收緩衝區來處理接收到的封包,或者接收這個封包會導致臨近其本身的緩衝區限制時,就會觸發源站抑制封包。
數據被從一個或一群主機高速地發往網絡上的一個路由器,雖然路由器有緩衝機制,但是路由器的緩衝區大小通常(由於實體記憶體有限的原因)被限制。因此,如果路由器的通訊量過大,路由器最終會(由於主記憶體耗盡,導致必須丟棄掉接收到的數據報)無法繼續處理超過輸入緩衝區限制的部分數據,直到路由器緩衝佇列有空餘空間可以存放新的數據報。但是由於網絡層(Network Layer)缺乏確認訊息(ACK)機制,因此客戶端無法獲知數據是否成功抵達接收方。所以研究者提出了源站抑制這一補救措施來解決這一問題:當路由器發現流入數據速率遠遠高於流出數據速率時,會傳送ICMP源站抑制封包給源站,通知源站應該降低其數據傳輸速度或等待一定時間後再嘗試傳送更多數據。當源站接收到ICMP源站抑制封包時會減慢數據傳送的速度,或者在再次嘗試傳送數據前等待一定的時間,使得路由器能夠(在處理完當前接收到的數據之後)清空輸入緩衝佇列。
但是因為有研究表明「源站抑制是一種無效的(不公平的)補救措施「,所以路由的源站抑制封包已在1995年被RFC 1812 (頁面存檔備份,存於互聯網檔案館)棄用。此外,(路由)轉發和回應任何形式的源站抑制封包已在2012年被RFC 6633 (頁面存檔備份,存於互聯網檔案館)棄用
00 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
類型(Type) = 4 | 代碼(Code) = 0 | 核對和(Checksum) | |||||||||||||||||||||||||||||
未使用 | |||||||||||||||||||||||||||||||
IP數據報頭部和源數據報數據的前8個位元組 |
其中:
- 類型(Type) 必須設置為4
- 代碼(Code) 必須設置為0
- IP數據報頭部 和其附加的數據用於傳送端根據回應封包匹配對應的請求封包
Remove ads

重新導向 封包是閘道器發出的,用於要求主機或路由器改變量據報的傳輸路徑的ICMP封包。ICMP 重新導向是路由器將路由資訊傳達給主機的機制。這種類型的封包通知主機更新它的路由資訊(請求主機改變其路由)。如果一個主機在通訊時將數據報傳送給了路由器R1,而R1將這個數據報轉發給了另一個路由器R2,且主機到路由器R2之間有一條直連的路徑(也就是說,此主機和路由器R2處於同一乙太網路段上),那麼路由器R1會傳送一條重新導向封包給主機,來通知它到路由器R2可用路徑里有一條更短、更最佳化的路徑。這個主機在接收到這個重新導向封包之後應該改變其路由至這個最佳化版本的路由資訊,來將抵達這個目的地的數據報直接傳送到路由器R2,並且路由器仍將原始數據報傳送到預期目的地。[2]但是,如果一個數據報攜帶有路由資訊,那麼即使有更加最佳化的路徑,路由器也不會傳送重新導向封包。並且,RFC 1122 指出,重新導向封包應該只由閘道器傳送,而不應該由互聯網主機傳送。[3]
00 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
類型(Type) = 5 | 代碼(Code) | 核對和(Checksum) | |||||||||||||||||||||||||||||
路由器的IP 地址 | |||||||||||||||||||||||||||||||
激發重新導向封包的數據報IP首部及其數據的前8位元組 |
其中:
- 類型(Type) 必須設置為 5.
- 代碼(Code) 指定重新導向的原因,見下表
- 路由器的IP 地址(IP address) 是一個32位元的閘道器IP位址,該地址指明了該數據報應該被重新導向到的路由器地址。
- 激發重新導向封包的數據報IP首部及其數據的前8位元組(IP header) 用於收到重新導向封包的主機根據回應封包匹配對應的請求封包,來確定該數據報的目的站地址。
Remove ads
逾時 封包是閘道器產生並行送給源站的ICMP封包,用於通知源站有數據報因為存活時間遞減至0而被此閘道器丟棄。當主機等待數據報分片的過程中逾時而無法重新組裝數據報分片時也會產生該封包。
逾時封包也用於traceroute工具來辨識兩個主機之間的路徑上的閘道器。
00 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
類型(Type) = 11 | 代碼(Code) | 校驗和(Checksum) | |||||||||||||||||||||||||||||
路由器的IP 地址 | |||||||||||||||||||||||||||||||
激發逾時封包的數據報IP首部及其數據的前8位元組 |
其中:
- 類型(Type) 必須設置為 11
- 代碼(Code) 指定重逾時的原因,見下表
Remove ads
時間戳請求 封包主要用於互聯網機器(包括路由器和主機)之間同步時鐘。起始時間戳是傳送端最後一次改動該數據報的時間戳(為世界標準時午夜開始計算的毫秒數)。在該類型的封包中,接收時間戳和傳輸時間戳未被使用。
00 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
類型(Type) = 13 | 代碼(Code) = 0 | 核對和(Checksum) | |||||||||||||||||||||||||||||
識別碼(Identifier) | 序號(Sequence number) | ||||||||||||||||||||||||||||||
起始時間戳(Originate timestamp) | |||||||||||||||||||||||||||||||
接收時間戳(Receive timestamp) | |||||||||||||||||||||||||||||||
傳輸時間戳(Transmit timestamp) |
其中:
時間戳回答 封包是對時間戳請求封包的回答封包。 時間戳回答封包由接收到的時間戳請求封包其中的起始時間戳和接收時間戳(回應端主機接收到請求封包並建立時間戳回應封包的時間,單位為毫秒)、傳輸時間戳(時間戳回答封包被傳送出去的時間,單位為毫秒)組成。
00 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
類型(Type) = 14 | 代碼(Code) = 0 | 核對和(Checksum) | |||||||||||||||||||||||||||||
識別碼(Identifier) | 序號(Sequence number) | ||||||||||||||||||||||||||||||
起始時間戳(Originate timestamp) | |||||||||||||||||||||||||||||||
接收時間戳(Receive timestamp) | |||||||||||||||||||||||||||||||
傳輸時間戳(Transmit timestamp) |
其中:
- 類型(Type) 必須設置為 14
- 代碼(Code) 必須設置為 0
- 識別碼(Identifier) 和 序號(Sequence number) 用於在時間戳請求封包和時間戳回答封包之間建立關聯。
- 起始時間戳(Originate timestamp) 是傳送端最後一次改動該數據報的時間戳。
- 接收時間戳(Receive timestamp) 是回應端主機接收到請求封包並建立時間戳回應封包的時間,單位為毫秒。
- 傳輸時間戳(Transmit timestamp) 是最後一次修改回應封包並將其傳送出去的時間,單位為毫秒。
- 所有的時間戳都是世界標準時午夜起始的毫秒數。如果這個時間不能表示為毫秒或者沒有可用的世界標準時參考值,則可以使用任何格式的時間值並將最高有效位設置為1以指示這是一個非標準時間值。
Remove ads
地址遮罩請求 封包是主機為了得到一個合適的子網絡遮罩而傳送到路由器的ICMP請求封包。
接收到此請求封包的機器應當傳送一個地址遮罩回答封包給源站。
00 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
類型(Type) = 17 | 代碼(Code) = 0 | 核對和(Checksum) | |||||||||||||||||||||||||||||
識別碼(Identifier) | 序號(Sequence number) | ||||||||||||||||||||||||||||||
地址遮罩(Address mask) |
其中:
- 類型(Type) 必須設置為 17
- 代碼(Code) 必須設置為 0
- 地址遮罩(Address mask) 可以為0
由於ICMP 地址遮罩請求可能會被用於嗅探攻擊來收集特定網絡的資訊,因此該封包預設情況下被Cisco IOS禁用。[4]
Remove ads
地址遮罩回答 封包攜帶有地址遮罩資訊,用於回答地址遮罩請求封包。
00 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
類型(Type) = 18 | 代碼(Code) = 0 | 校驗和(Checksum) | |||||||||||||||||||||||||||||
識別碼(Identifier) | 序號(Sequence number) | ||||||||||||||||||||||||||||||
地址遮罩(Address mask) |
其中:
- 類型(Type) 必須設置為 18
- 代碼(Code) 必須設置為 0
- 地址遮罩(Address mask) 為待回答的地址遮罩
源站不可達 封包是由主機或入站閘道器用於通知客戶端出於目的站無法連接的封包。這些原因可能包括:物理連接失效(也即網絡距離無限大),或指定的地址或埠處於非啟用狀態,或者數據報長度過長而導致必須分片但是IP首部指定了「不分片」選項導致無法分片。如果是TCP埠不可達,則會返回TCP RST,而不會返回此封包。如果是IP多播的情況,也不會返回此封包。
00 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
類型(Type) = 3 | 代碼(Code) | 核對和(Checksum) | |||||||||||||||||||||||||||||
未使用 | 下一跳的MTU值 | ||||||||||||||||||||||||||||||
激發ICMP地址不可達封包的數據報IP首部及其數據的前8位元組 |
其中:
- 類型(Type) 必須設置為 3
- 代碼(Code) 欄位用於指示具體導致源站不可達的原因。見下表。
- Next-hop MTU 當需要分片但是DF(Do not Fragment)置位的錯誤發生時,包含了下一跳網絡的MTU的值。
- IP header 用於源站根據收到的源站不可達封包來確定具體哪個數據報引起了源站不可達錯誤。
參考
外部連結
Wikiwand - on
Seamless Wikipedia browsing. On steroids.
Remove ads