http://blog.csdn.net/chenhanzhun/article/details/41510629
2014
ICMP 協(xié)議概述
ICMP 經(jīng)常被認為是 IP 層的一個組成部分,它傳遞差錯報文以及其他需要注意的信息。ICMP 報文通常被 IP 層或更高層協(xié)議(TCP 或 UDP)使用。ICMP 報文是在 IP 數(shù)據(jù)報內(nèi)部傳輸?shù)?。IP 協(xié)議是不可靠協(xié)議,不能保證 IP 數(shù)據(jù)報能夠成功的到達目的主機,無法進行差錯控制,而 ICMP 協(xié)議能夠協(xié)助 IP 協(xié)議完成這些功能。下面是 ICMP 報文的數(shù)據(jù)結(jié)構(gòu):
- 類型:一個 8 位類型字段,表示 ICMP 數(shù)據(jù)包類型;
- 代碼:一個 8 位代碼域,表示指定類型中的一個功能,如果一個類型中只有一種功能,代碼域置為 0;
- 檢驗和:數(shù)據(jù)包中 ICMP 部分上的一個 16 位檢驗和;
ICMP 報文類型
ICMP 報文大致可分為兩類:差錯報文、查詢報文。具體消息類型如下表所示:
ICMP 差錯報文
當發(fā)送一份差錯報文時,報文始終包含 IP 的首部和產(chǎn)生 ICMP 差錯報文的 IP 數(shù)據(jù)報的前 8 位字節(jié)。這樣,接收 ICMP 差錯報文的模塊就會把它與某個特定的協(xié)議(根據(jù) IP 數(shù)據(jù)報首部中的協(xié)議字段來判斷)和用戶進程(根據(jù)包含在 IP 數(shù)據(jù)報前 8 個字節(jié)中的 TCP 或 UDP 報文首部中的 TCP 或 UDP 端口號來判斷)聯(lián)系起來。
下面各種情況不會導致產(chǎn)生 ICMP 差錯報文:
- ICMP 報文差錯(ICMP查詢報文可能會產(chǎn)生ICMP差錯報文);
- 目的地址是廣播地址或多播地址的 IP 數(shù)據(jù)報;
- 作為鏈路層廣播的數(shù)據(jù)報;
- 不是 IP 分片的第一片;
- 源地址不是單個主機的數(shù)據(jù)報,也就是說,源地址不可能是零地址、環(huán)回地址、廣播地址或多播地址;
以下針對 ICMP 差錯報文的類型進行分析:
- ICMP 目標不可達消息:IP 路由器無法將 IP 數(shù)據(jù)報發(fā)送給目的地址時,會給發(fā)送端主機返回一個目標不可達 ICMP 消息,并在這個消息中顯示不可達的具體原因。
- ICMP 重定向消息:如果路由器發(fā)現(xiàn)發(fā)送端主機使用次優(yōu)的路徑發(fā)送數(shù)據(jù)時,那么它會返回一個 ICMP 重定向消息給這個主機,這個消息包含了最合適的路由信息和源數(shù)據(jù)。主要發(fā)生在路由器持有更好的路由信息的情況下,路由器會通過這個 ICMP 重定向消息給發(fā)送端主機一個更合適的發(fā)送路由。
- ICMP 超時消息:IP 數(shù)據(jù)包中有一個字段 TTL(Time to live,生存周期),它的值隨著每經(jīng)過一個路由器就會減 1,直到減到 0 時該 IP 數(shù)據(jù)包被丟棄。此時,IP 路由器將發(fā)送一個 ICMP 超時消息給發(fā)送端主機,并通知該包已被丟棄。
- 源抑制消息:當 TCP/IP 主機發(fā)送數(shù)據(jù)到另一主機時,如果速度達到路由器或者鏈路的飽和狀態(tài),路由器發(fā)出一個 ICMP 源抑制消息。
ICMP 查詢報文
----ICMP 回送消息:用于進行通信的主機或路由之間,判斷發(fā)送數(shù)據(jù)包是否成功到達對端的消息??梢韵?qū)Χ酥鳈C發(fā)送回送請求消息,也可以接收對端主機回來的回送應答消息。
----ICMP 地址掩碼消息:主要用于主機或路由想要了解子網(wǎng)掩碼的情況??梢韵蚰切┲鳈C或路由器發(fā)送 ICMP 地址掩碼請求消息,然后通過接收 ICMP 地址掩碼應答消息獲取子網(wǎng)掩碼信息。
----ICMP 時間戳消息:可以向那些主機或路由器發(fā)送 ICMP 時間戳請求消息,然后通過接收 ICMP 時間戳應答消息獲取時間信息。
Ping 程序
Ping 程序利用 ICMP 回顯請求報文和回顯應答報文(而不用經(jīng)過傳輸層)來測試目標主機是否可達。它是一個檢查系統(tǒng)連接性的基本診斷工具。
ICMP 回顯請求和 ICMP 回顯應答報文是配合工作的。當源主機向目標主機發(fā)送了 ICMP 回顯請求數(shù)據(jù)包后,它期待著目標主機的回答。目標主機在收到一個 ICMP 回顯請求數(shù)據(jù)包后,它會交換源、目的主機的地址,然后將收到的 ICMP 回顯請求數(shù)據(jù)包中的數(shù)據(jù)部分原封不動地封裝在自己的 ICMP 回顯應答數(shù)據(jù)包中,然后發(fā)回給發(fā)送 ICMP 回顯請求的一方。如果校驗正確,發(fā)送者便認為目標主機的回顯服務正常,也即物理連接暢通。
例如:在終端上 Ping 下谷歌的地址,神奇的發(fā)現(xiàn)谷歌地址既然不用翻墻都能上了,而且丟包率 0%。
- $ ping www.google.com
- PING www.google.com (173.194.127.148) 56(84) bytes of data.
- 64 bytes from hkg03s13-in-f20.1e100.net (173.194.127.148): icmp_req=1 ttl=48 time=11.0 ms
- 64 bytes from hkg03s13-in-f20.1e100.net (173.194.127.148): icmp_req=2 ttl=48 time=10.8 ms
- 64 bytes from hkg03s13-in-f20.1e100.net (173.194.127.148): icmp_req=3 ttl=48 time=11.1 ms
- 64 bytes from hkg03s13-in-f20.1e100.net (173.194.127.148): icmp_req=4 ttl=48 time=10.8 ms
- 64 bytes from hkg03s13-in-f20.1e100.net (173.194.127.148): icmp_req=5 ttl=48 time=11.1 ms
- 64 bytes from hkg03s13-in-f20.1e100.net (173.194.127.148): icmp_req=6 ttl=48 time=11.0 ms
- 64 bytes from hkg03s13-in-f20.1e100.net (173.194.127.148): icmp_req=7 ttl=48 time=10.5 ms
- 64 bytes from hkg03s13-in-f20.1e100.net (173.194.127.148): icmp_req=8 ttl=48 time=9.96 ms
- 64 bytes from hkg03s13-in-f20.1e100.net (173.194.127.148): icmp_req=9 ttl=48 time=10.9 ms
- ^C
- --- www.google.com ping statistics ---
- 9 packets transmitted, 9 received, 0% packet loss, time 8009ms
- rtt min/avg/max/mdev = 9.963/10.830/11.123/0.368 ms
Traceroute 程序
Traceroute 程序主要用來偵測源主機到目的主機之間所經(jīng)過的路由的情況。
Traceroute 使用 ICMP 報文和 IP 首部中的 TTL 字段,它充分利用了 ICMP 超時消息。其原理很簡單,開始時發(fā)送一個 TTL 字段為 1 的 UDP 數(shù)據(jù)報,而后每次收到 ICMP 超時蕭后,按順序再發(fā)送一個 TTL 字段加 1 的 UDP 數(shù)據(jù)報,以確定路徑中的每個路由器,而每個路由器在丟棄 UDP 數(shù)據(jù)報時都會返回一個 ICMP 超時報文,而最終到達目的主機后,由于 ICM P選擇了一個不可能的值作為 UDP 端口(大于30000)。這樣目的主機就會發(fā)送一個端口不可達的 ICMP 差錯報文。
參考資料:
《TCP/IP 詳解》
《圖解 TCP/IP》
《ICMP協(xié)議、Ping、Traceroute》
本站僅提供存儲服務,所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請
點擊舉報。