基本功能
- 協助解決故障。ICMP支持Echo功能,即在兩個主機間一個往返路徑上傳送一個包。Ping是一種基於這種特性的通用網路管理工具,它將傳輸一系列的包,測量平均往返次數並計算丟失百分比。
- 通告逾時。如果一個IP包的TTL降低到零,路由器就會丟棄此包,這時會生成一個 ICMP 包通告這一事實。TraceRoute是一個工具,它通過傳送小TTL值的包及監視ICMP逾時通告可以顯示網路路由。
報文
封裝
IPv6基本首部 | 擴展首部…… | ICMPv6報文首部 | ICMPv6報文體 |
格式
類型(1位元組) | 代碼(1位元組) | 校驗和(2位元組) |
ICMP報文體(可變長) |
- 類型:標識ICMPv6報文類型,它的值根據報文的內容來確定。
- 代碼:用於確定ICMPv6進一步的信息,對同一類型的報文進行了更詳細的分類。
- 校驗和:用於檢測ICMPv6的報文是否正確傳送。
- 報文體:用於返回出錯的參數和記錄出錯報文的片段,幫助源節點判斷錯誤的原因或是其它參數。
報文源地址的測定
- 如果報文是對發往該節點的某一單目地址進行回響的,那應答報文的源地址必須是這個單目地址。
- 如果報文是對發往該節點為組員的多播組或任意播組的報文進行回響的,那么應答報文的源地址必須是一個屬於接收到多播或任意播包接口的單目地址。
- 如果報文是對發往一個並不屬於該節點地址的報文進行回響的,那么源地址必須是屬於該節點且最有利於診斷錯誤的那個單目地址。比如,如果報文是對一個不能正常轉發包的行為進行回響的,源地址就是那個屬於轉發包失敗的接口的單目地址。
- 另外,在轉發報文到目的地時,必須使用節點的路由表來決定由哪個接口轉發報文。
校驗和的計算
- ICMPv6報文。
- IPv6偽首部(偽首部中下一首部欄位的值為58)。
源地址(16位元組) | |
目的地址(16位元組) | |
有效載荷長度(4位元組) | |
0(3位元組) | 下一首部(=58,1位元組) |
- 校驗和欄位被設定為0。
- ICMPv6對校驗範圍內的數據以16bit為單位,做1的補碼的加法運算。
- 在ICMPv6首部校驗和欄位中,置入此16bit的和。
報文處理規則
- 當接收到ICMPv6差錯報告報文時,如果無法識別具體的類型,必須將它交給上層協定模組進行處理。
- 當接收到ICMPv6信息報文時,如果無法識別具體的類型,必須將它丟棄。
- 所有的ICMPv6差錯報告報文,都應該在IPv6所要求的最小MTU允許範圍內,儘可能多地包括引發該ICMPv6差錯報文的IPv6分組片段,以便給IPv6分組的源節點提供儘可能多的診斷信息。
- 在需要將ICMPv6報文上傳給其上層協定模組處理的情況下,上層協定的具體類型,應該從封裝該ICMPv6報文的IPv6分組的下一首部欄位中獲取。但是,如果該IPv6分組攜帶有很多擴展首部,則可能會導致有關上層協定類型的信息沒有被包含在ICMPv6報文中。這時,只能將該差錯報告報文在IP層處理完後丟棄掉。
- 不能產生ICMPv6差錯報告報文的傳送情況:1、一個ICMPv6差錯報告報文。這主要是為了避免無休止地產生ICMPv6報文而引起網路擁塞。2、一個發往多播地址的IPv6分組。但有兩個例外:當使用IPv6多播地址進行路徑MTU探測時,可以傳送“報文過長”差錯報告報文;允許使用參數錯誤報文報告:存在不可識別的TLV可選項。3、鏈路層的多播報文。對這類報文也具有與上面第二類情況相同的例外。4、鏈路層的廣播報文。對這類報文也具有與上面第二類情況相同的例外。5、IPv6分組的源地址無法唯一確定一個單獨節點時,這種情況也不能夠引起ICMPv6差錯報告報文的傳送。例如,IPv6不明確地址等。
- 最後,為了限制在傳送ICMPv6差錯報告報文時對網路頻寬和轉發處理的消耗,一個IPv6節點必須限制其傳送ICMPv6差錯報告報文的速率。但是,這樣可能會導致一個差錯報告報文的源節點因為沒有及時收到報文出錯的報告而不斷地重發該錯誤報文。目前有幾種提供限制ICMPv6速率的方法,例如:1、基於計時器的方法。將發往某個源節點或所有源節點的ICMPv6差錯報告報文的速率,限制在每T時間段內只傳送一個差錯報告報文之內。2、基於頻寬的方法。將某個網路接口傳送的ICMPv6差錯報告報文所占用的頻寬限制在這個接口所在鏈路頻寬的某個比例F上。