作者:Vamei 出處:http://www.cnblogs.com/vamei 嚴禁任何形式轉載。
到現在為止,我們講解了網絡層中最重要的IP協議(參考協議森林)。IP協議的一個重要補充是是ICMP協議。
ICMP協議
ICMP(Internet Control Message Protocol)是介於網絡層和傳輸層的協議。它的主要功能是傳輸網絡診斷信息。
ICMP傳輸的信息可以分為兩類,一類是錯誤(error)信息,這一類信息可用來診斷網絡故障。我們已經知道,IP協議的工作方式是“Best Effort”,如果IP包沒有被傳送到目的地,或者IP包發生錯誤,IP協議本身不會做進一步的努力。但上游發送IP包的主機和接力的路由器並不知道下游發生了錯誤和故障,它們可能繼續發送IP包。通過ICMP包,下游的路由器和主機可以將錯誤信息匯報給上游,從而讓上游的路由器和主機進行調整。需要注意的是,ICMP只提供特定類型的錯誤匯報,它不能幫助IP協議成為“可靠”(reliable)的協議。另一類信息是咨詢(Informational)性質的,比如某台計算機詢問路徑上的每個路由器都是誰,然后各個路由器同樣用ICMP包回答。
(ICMP基於IP協議。也就是說,一個ICMP包需要封裝在IP包中,然后在互聯網傳送。ICMP是IP套裝的必須部分,也就是說,任何一個支持IP協議的計算機,都要同時實現ICMP。)
ICMP包的結構:
A bunch of Types
ICMP包都會有Type, Code和Checksum三部分。Type表示ICMP包的大的類型,而Code是一個Type之內細分的小類型。針對不同的錯誤信息或者咨詢信息,會有不同的Type和Code。從上面我們可以看到,ICMP支持的類型非常多,就好像瑞士軍刀一樣,有各種各樣的功能。Checksum與IP協議的header checksum相類似,但與IP協議中checksum只校驗頭部不同,這里的Checksum所校驗的是整個ICMP包(包括頭部和數據)。
余下的ICMP包格式根據不同的類型不同。另一方面,ICMP包通常是由某個IP包觸發的。這個觸發IP包的頭部和一部份數據會被包含在ICMP包的數據部分。
ICMP協議是實現ping命令和traceroute命令的基礎。這兩個工具常用於網絡排錯。
常見的ICMP包類型
回音
回音(Echo)屬於咨詢信息。ping命令就是利用了該類型的ICMP包。當使用ping命令的時候,將向目標主機發送Echo-詢問類型的ICMP包,而目標主機在接收到該ICMP包之后,會回復Echo-回答類型的ICMP包,並將詢問ICMP包包含在數據部分。ping命令是我們進行網絡排查的一個重要工具。如果一個IP地址可以通過ping命令收到回復,那么其他的網絡協議通信方式也很有可能成功。
源頭冷卻
源頭冷卻(source quench)屬於錯誤信息。如果某個主機快速的向目的地傳送數據,而目的地主機沒有匹配的處理能力,目的地主機可以向出發主機發出該類型的ICMP包,提醒出發主機放慢發送速度(請溫柔一點吧)。
目的地無法到達
目的地無法到達(Destination Unreachable)屬於錯誤信息。如果一個路由器接收到一個沒辦法進一步接力的IP包,它會向出發主機發送該類型的ICMP包。比如當IP包到達最后一個路由器,路由器發現目的地主機down機,就會向出發主機發送目的地無法到達(Destination Unreachable)類型的ICMP包。目的地無法到達還可能有其他的原因,比如不存在接力路徑,比如不被接收的端口號等等。
超時
超時(Time Exceeded)屬於錯誤信息。IPv4中的Time to Live(TTL)和IPv6中的Hop Limit會隨着經過的路由器而遞減,當這個區域值減為0時,就認為該IP包超時(Time Exceeded)。Time Exceeded就是TTL減為0時的路由器發給出發主機的ICMP包,通知它發生了超時錯誤。
traceroute就利用了這種類型的ICMP包。traceroute命令用來發現IP接力路徑(route)上的各個路由器。它向目的地發送IP包,第一次的時候,將TTL設置為1,引發第一個路由器的Time Exceeded錯誤。這樣,第一個路由器回復ICMP包,從而讓出發主機知道途徑的第一個路由器的信息。隨后TTL被設置為2、3、4,...,直到到達目的主機。這樣,沿途的每個路由器都會向出發主機發送ICMP包來匯報錯誤。traceroute將ICMP包的信息打印在屏幕上,就是接力路徑的信息了。
重新定向
重新定向(redirect)屬於錯誤信息。當一個路由器收到一個IP包,對照其routing table,發現自己不應該收到該IP包,它會向出發主機發送重新定向類型的ICMP,提醒出發主機修改自己的routing table。比如下面的網絡:
假如145.1發送到145.15的IP包,結果被中間的路由器通過145.17的NIC收到。那么路由器會發現,根據自己的routing table,這個IP包要原路返回。那么router就可以判斷出145.1的routing table可能有問題。所以路由器會向145.1發送redirect類型的ICMP包。
IPv6的Neighbor Discovery
ARP協議用於發現周邊的IP地址和MAC地址的對應。然而,ARP協議只用於IPv4,IPv6並不使用ARP協議。IPv6包通過鄰居探索(ND, Neighbor Discovery)來實現ARP的功能。ND的工作方式與ARP類似,但它基於ICMP協議。ICMP包有Neighbor Solicitation和Neighbor Advertisement類型。這兩個類型分別對應ARP協議的詢問和回復信息。
總結
ICMP協議是IP協議的排錯幫手,它可以幫助人們及時發現IP通信中出現的故障。基於ICMP的ping和traceroute也構成了重要的網絡診斷工具。然而,需要注意的是,盡管ICMP的設計是出於好的意圖,但ICMP卻經常被黑客借用進行網絡攻擊,比如利用偽造的IP包引發大量的ICMP回復,並將這些ICMP包導向受害主機,從而形成DoS攻擊。而redirect類型的ICMP包可以引起某個主機更改自己的routing table,所以也被用作攻擊工具。許多站點選擇忽視某些類型的ICMP包來提高自身的安全性。
歡迎繼續閱讀“協議森林”系列