TCP/IP詳解卷一之ICMPv4和ICMPv6:Internet 控制報文協議
1 處理ICMP報文
—一般來說,傳入的資訊類請求報文將被作業系統自動處理;而差錯類報文傳遞給使用者程序或傳輸層協議,如TCP。
—處理傳入的ICMPv6報文將應用以下規則:
· 如果可能的話,未知的ICMPv6差錯報文必須傳遞給上層產生差錯報文的程序;
· 未知的ICMPv6資訊類報文被丟棄;
· ICMPv6差錯報文將會盡可能多地包含導致差錯的原始(”違規“)IPv6報文,當然最終的差錯報文大小不能超過最小的IPv6MTU;
· 在處理ICMPv6差錯報文時,需要提取原始(或”違規“)資料包的上層協議型別,用於選擇適當的上層程序,如果這是不可能的,在任何IPv6層處理完後將無聲地丟棄差錯報文;
· 存在處理差錯的特殊規則;
· IPv6節點必須限制它傳送ICMPv6差錯報文的速率:令牌桶法。
2 ICMP差錯報文
—ICMP差錯報文不會對以下報文進行響應:
· 另一個ICMP差錯報文;
· 頭部損壞的資料報,如校驗和錯誤;
· IP層的廣播和組播資料報;
· 封裝在鏈路層廣播或者組播幀中的資料報;
· 無效或者網路為零的源地址的資料報,即源地址不能為零地址、廣播地址、組播地址或環回地址;
· 除第一個之外的其他分片。
—需要限制傳送ICMP差錯報文的速率,方法如:令牌桶法。
—當傳送一個ICMP差錯報文,它包含了一個完整的源自”違規“或”原始“資料報的IP頭部副本,再加上原始資料報的IP有效載荷區中的任何其他資料,同時要確保生成的ICMP資料報的大小不會超過一個特定的值(對於IPv4,該值為576位元組;對於IPv6,該值為IPv6的最小MTU)。
(1)ICMP目的不可達或資料包太大
1)ICMPv4主機不可達和ICMP6地址不可達
—ICMPv4主機不可達報文由是主機或路由器產生的,出現在當它被要求使用直接交付方法傳送一個IP資料報到一個主機,但由於某些原因無法到達目的地時。
—對於ICMPv6,它使用一個有點不同的機制來檢測無響應的主機,該報文可能是因為ND過程失敗而產生的。
2)ICMPv6目的無路由
—此報文對ICMPv4中的主機不可達報文進行了細分,將直接交付失敗導致的和沒有路由導致的區分開來。
—此報文出現在當到達的資料報不必採用直接交付的方式來轉發,但卻沒有路由條目來指定下一跳該用哪個路由器時的情況下。
3)ICMPv4管理禁止通訊和ICMPv6目的管理禁止通訊
—此報文表明一個管理禁令正阻止到目的地的成功通訊。
—通常是由一個防火牆故意丟棄流量導致的。
4)ICMPv4埠不可達和ICMPv6埠不可達
—當傳入的資料報的目的應用程式還沒準備好接受它時,就會生成一個埠不可達報文。
—最常出現在和UDP一起使用,當一個報文被髮往的埠號並未被任何伺服器程序使用時。
5)ICMPv4 PTB
—如果一個IPv4路由器收到一個打算轉發的資料報,如果資料報大於選定的傳出網路介面的MTU,則資料報需要分片。如果到達的資料報在IP頭部中設定了不分片位欄位,那麼它將被丟棄而不是轉發,此時將產生ICMPv4目的不可達(PTB)報文。
—此報文既可用於診斷網路,又可用於路徑MTU發現。
6)ICMPv6 PTB
—該報文不是一個目的不可達報文。
—在IPv6中只有資料報的傳送者才能執行資料報分片,且總是採用MTU發現機制。
—該報文主要是被IPv6的PMTUD機制使用,但是偶爾也用在當一個到達的資料報對下一跳來說太大了導致不能傳輸的情況。
(2) ICMP重定向報文
—當一個路由器收到一個來自主機的資料報,並發現存在一個比自己更好的下一跳路由,則該路由器傳送一個重定向報文到傳送主機並將該報文傳送到正確的路由器或者主機上,傳送主機會根據接收到的重定向報文更新其轉發表。以後目的地一樣的流量就會被定向到新的節點中。
(3)ICMP超時報文
—每個IPv4資料報在頭部中都有一個生存週期(TTL)欄位,而每個IPv6資料報在頭部中都有一個跳數限制欄位。
—當由於TTL或跳數限制欄位值太小致使路由器丟棄報文時,會產生ICMP超時報文。
—應用:traceroute工具。traceroute工具被用於確定從傳送者到目的地路徑上的路由器。方法如下:
· 首先,傳送IPv4 TTL欄位設定為1的資料報,到期的資料報促使沿途路由器傳送ICMPv4超時報文;
· 然後,每一輪發送的資料報的TTL值增加1,導致資料報在更遠一跳的路由器處超時,併產生一個ICMP超時報文。
(4)ICMP引數問題報文
—當一個主機或者路由器接收到一個IP資料報,其IP頭部存在不可修復的問題時便會產生一個ICMP引數問題報文。
—當一個數據報不能夠被處理,且沒有其他的ICMP報文來描述這個問題時,這個報文充當了一個“包羅永珍”的錯誤狀態指示器。
3 ICMP 查詢/資訊類報文
(1)回顯請求/應答
—ICMP的回顯請求報文大小几乎是任意的(受限於最終封裝的IP資料報的大小)。
—收到ICMP回顯請求報文後,ICMP應答將任何接收到的資料返回給傳送者,即使涉及多個IP分片。
—應用:ping程式。該程式通常被用於確定Internet上的一臺主機是否可達。(注:和防火牆一起使用時,不能完全確定)
· 在ping的實現中,將ICMP報文的識別符號欄位設定為某個數,傳送主機能夠利用它來分離返回的應答。例如,在Unix系統中,使用傳送程序的程序ID作為識別符號欄位。
· 當一個新的ping例項執行時,序列號欄位從0開始,並且每傳送一個回顯請求報文便增加1。ping打印出每個返回的資料報的序列號,方便使用者檢視資料報是否丟失、重排或者重複了。
· ping程式也在傳出的回顯請求中的可選資料區域中包含了一份本地時間拷貝,這個時間和資料區域中剩餘的內容均包含在返回的回顯應答報文中。當接收到應答報文時,ping程式用當前時間減去應答中的時間,便得到了一個到達被ping的主機的RRT估計值。
(2)路由器發現:路由器請求和通告(ICMPv4)
—通告由路由器通過兩種方法傳送:
· 路由器定期對本地網路的所有主機組播地址(224.0.0.1)進行組播,並提供給有需要的主機。
· 使用組播將路由器請求報文傳送到所有路由器組播地址上(224.0.0.2)。
—路由器發現的目的:讓一臺主機學習到它所在的本地子網中的所有路由器,因此它能從中選擇一臺作為預設路由。它也被用於發現那些願意充當移動IP代理的路由器。
(3)組播路由器發現(IGMP、ICMPv6)
—可以和ICMPv6和IGMP一起使用,用來發現能夠轉發組播資料報和它們的一些配置引數的路由器。
—組播路由器發現(MRD)報文傳送時總是將IPv4的TTL或IPv6的跳數限制欄位設為1,並設有路由器警告選項,可能是如下型別之一:
· 通告:在配置的時間間隔定期地傳送通告,表明路由器願意轉發組播流量。
· 請求:可用於請求路由器傳送通告報文。
· 終止:表明路由器不再願意轉發組播流量了。
4 IPv6中的鄰居發現
—IPv6中的鄰居發現協議(ND)的兩個主要部分是:
· 鄰居請求/通告:在網路層和鏈路層地址之間提供類似於ARP的對映功能。
· 路由器請求/通告:提供的功能包括路由器發現、移動IP代理髮現、重定向以及一些對自動配置的支援。
—ND報文就是ICMPv6報文,只是傳送時IPv6的跳數限制欄位值被設定為255。接收者通過驗證進來的ND報文有這個值,以防止被非本鏈路上的傳送者嘗試傳送假冒ICMPv6報文欺騙。
(1)ICMPv6路由器請求和通告
—路由器通告(RA)報文是由路由器傳送到所有節點的組播地址(FF02::1)的,或者是傳送到請求主機的單播地址——如果該通告是為了響應一個請求。
—RA報文通知本地主機和其他路由器關於本地鏈路的有關配置細節。
—路由器請求(RS)報文用於請求鏈路上的路由器傳送RA報文。RS報文被髮送到所有路由器組播地址ff02::2。
(2)ICMPv6鄰居請求和通告
—ICMPv6中的鄰居請求(NS)報文有效地取代了IPv4中的ARP請求報文。其主要目的是將IPv6地址轉換為鏈路層地址。
—NS報文也被用於檢測附近的節點是否可達,它們是否可以雙向到達。
—當NS報文用於確定地址對映時,它被髮送到目標地址欄位中包含的IPv6地址所對應的請求節點的組播地址;當NS報文被用於確定到鄰居的連線性時,它被髮送到該鄰居的IPv6單播地址。
—ICMPv6鄰居通告(NA)報文和IPv4中的ARP響應報文的目的一樣,還能夠用於鄰居不可達檢測。
—NA報文要麼作為NS報文的響應被髮送,要麼當一個節點的IPv6地址變化時被非同步傳送。
—NA報文要麼被髮送到請求節點的單播地址,要麼當請求節點使用未指定的地址作為源地址時,被髮送到所有節點的組播地址。
(3)ICMPv6反向鄰居發現請求和通告
—主要功能是確定一個已知的鏈路層地址對應的網路層地址。
—反向鄰居發現(IND)請求報文被髮送到IPv6層的所有節點的組播地址,但是卻封裝在一個單播鏈路層地址中。