ICMP協議工作流程詳解
ICMP協議是網絡協議中重要的協議之一,它進行了一些有效的消息控制,來完成一些傳輸當中錯誤的一些修改。那么我們應該如何理解這個協議呢?它的工作流程又是如何呢?
既然IP網絡不可靠并且不能保證信息傳遞,因此當發生問題時通知發送人是很重要的.ICMP協議是一種提供有關阻止數據包傳遞的網絡故障問題反饋信息的機制. 它讓TCP等上層協議能夠意識到數據包沒有送達目的地,ICMP協議提供一種查出災難性問題的方法.這些災難性的問題包括"TTL exceeded"(超過生存時間)和"需要分更多的數據段"等.ICMP協議不報告IP校驗失敗等常見的問題.這是因為我們假定TCP或者其它可靠的協議能夠處理這類數據包損壞的問題.而且,如果我們使用UDP等不可靠的協議,我們就不應理會較小數量的數據損失.
反之,網絡問題需要立即報告.例如,如果IP TTL值(IP生存時間)將達到零,這就可能是網絡的某個部分發生了路由環路問題,這樣將沒有任何數據包能發送到目的地.端點系統需要了解這些類型的故障.ICMP是一種發送各種消息報告網絡狀態的協議,而非僅僅是簡單的ping(聯通性測試程序).回應請求(echo request)僅是ICMP協議提供的眾多消息之一.Ping信息可以被過濾掉.但是,大多數ICMP消息類型是IP、TCP和其它協議正常運行所需要的.永遠不要相信ICMP協議是邪惡的并且簡單的封鎖這個協議.
ICMP協議本身非常復雜.每一種類型的ICMP消息也稱"主要類型(major type)"擁有自己的"子類型編碼(minor codes)".ICMP協議工作在第3層,因此,它能夠在互聯網上路由.一個ICMP數據包實際上就是一個IP數據部分包含ICMP協議數據的IP數據包.每一個ICMP消息都將包含引發這條ICMP消息的數據包的完全IP包頭,這樣,端點系統就會知道實際上哪一個數據包沒有發送到目的地.另外引發此ICMP消息的數據包的前8個字節也將包括在內,這通常是TCP或者UDP包頭.
簡略的說,ICMP協議消息包含永遠不會變化的三個字段,隨后是ICMP數據,然后是引發此消息的源IP數據包包頭.不會變化的三個字段中,前8個字節包含ICMP類型(主要類型)、第二個字段包含了類型代碼、第三個字段是ICMP消息校驗值.
我們需要認識到,ICMP協議在某些情況下不會發送錯誤信息.ICMP不會對ICMP信息做出響應.如果ICMP回應其它ICMP消息,這些消息的數量會爆炸性增長而演變為一場ICMP消息風暴.為了防止出現廣播風暴,ICMP消息也不會回應一個廣播或者多播地址.
最有用的ICMP數據包類型"目標不可達"(類型三)的消息.錯誤消息一般由路由器生成,并且發送給數據包的來源.大多數錯誤信息還將發送給與發送的數據包有關的應用程序.在這種情況下,TCP協議將廣泛使用ICMP協議.我們在后面將很快看到這種情況.
在IPv4協議中最常用的ICMP消息類型有以下幾種:
回顯應答(類型0)和回顯請求(類型8):這是Ping程序發送的信息.
目標不可達(類型3)
源抑制(類型4):這是一種用于通知發送者路由器或者主機出現阻塞現象的ICMP消息,發送者需要降低發送速度.
重定向(類型5):這個消息用來向可以訪問兩臺路由器的主機說"請使用另一臺路由器".我們在此系列講座中未來的路由問題中再詳細討論這個問題.
路由器信息應答(類型9)和路由器信息請求(類型10)
超時(類型11):這個消息有兩種用途.***,當超過IP生存期時向發送系統發出錯誤信息.第二,如果分段的IP數據報沒有在某種時限內重新組合,這個消息將通知發送系統.
當然,上述各種類型的消息中都包含子類型代碼.類型三消息"目標不可達"本身有15個子類型代碼.我們就不提供每一項的細節了.但是,ICMP協議中有一項非常重要的應用要依靠類型三的消息.
路徑***傳輸單元(PMTU)是各種協議用來尋找整條路徑中支持的***的MTU(***傳輸單元)的機制,小于此限制的數據可以不用分段.發送者在其本地接口設置***的數據包規格,然后,在IP包頭中使用DF(不要分段)的標記發出數據包.如果有問題發送者就會收到第三種類型的ICMP錯誤信息,其子類型代碼是"要求分段,但是已經設置了DF標記".當發生這種情況是,發送者知道它必須要減小發送數據的規格.如果沒有返回錯誤信息,這就表明MTU的設置沒有問題.
在查找PMTU時的主要問題是人們常封鎖ICMP協議,阻止這個報錯信息傳遞到發送數據的主機.這種情況很多時候發生在你設法連接的遠程站點.假如你向一臺Web服務器發送一個請求,但是,一個空白頁卻不斷出現.在虛擬專用網連接上的人們經常會看到這種情況,這是因為由于有的虛擬專用網封裝的額外的文件頭,它們的MTU比通常的容量要小一些.當遠程Web服務器向虛擬專用網用戶發送其要求的內容時,如果數據包太大,用戶前面***的路由跳數需要為這個數據分段.如果發送方設置DF標記之后,它能做的一切就是通知發送者必須發送較小的數據包.但是,發送者封鎖了ICMP協議,因此這個網站將永遠不會看到這種ICMP信息.不過一個好消息是大多數TCP協議的執行都是智能化的.如果它們一直得不到發送數據的許可,它們會自己以較小的分段尺寸發送數據.但是,如果你使用某些流行的、操作方便的操作系統,這種機制并沒實現.
簡言之,封鎖ICMP協議對于成功地運行網絡是有害的.這不僅會破壞ping,事實上,如果ICMP協議不工作,許多協議都將不能完全發揮作用.
小結
ICMP包括許多種類型的用于各種用途的數據包,每一種類型都有子類型代碼,用于指明這些消息類型的具體內容.
查找路徑***傳輸單元能夠讓規格正確的數據包在各種數據包容量的鏈路上傳送.
ICMP對于恰當的路由和數據包傳遞是非常重要的,你只能封鎖你不需要的那一些消息.