- ICMP常常被認爲是IP層的一個組成部分。它傳遞差錯報文以及其餘須要注意的信息。
- ICMP報文一般被IP層或更高層協議TCP或UDP使用。
- 一些ICMP報文把差錯報文返回給用戶進程
ICMP報文是在IP數據報內部被傳輸的,如:
ICMP報文的類型
ping--類型8,代碼0-->請求回顯
回顯應答<--類型0,代碼0--ping
不一樣類型由類型字段和代碼字段共同決定;
分類
不會產生ICMP差錯報文:
- ICMP差錯報文(可是, ICMP查詢報文可能會產生 ICMP差錯報文)。
- 目的地址是廣播地址(見圖3 - 9)或多播地址(D類地址,見圖1 - 5)的IP數據報。
- 做爲鏈路層廣播的數據報
- 不是IP分片的第一片(將在11 . 5節介紹分片)。
- 源地址不是單個主機的數據報。這就是說,源地址不能爲零地址、環回地址、廣播地
址或多播地址。
ICMP地址掩碼請求與應答
ICMP地址掩碼請求用於無盤系統在引導過程當中獲取本身的子網掩碼
ICMP地址掩碼請求和應答報文的格式如圖:
ICMP報文中的標識符和序列號字段由發送端任意選擇設定,這些值在應答中將被返回。
這樣,發送端就能夠把應答與請求進行匹配。
ICMP時間戳請求與應答
- ICMP時間戳請求容許系統向另外一個系統查詢當前的時間
-
- 返回的建議值是自午夜開始計算的毫秒數
- 協調的統一時間(Coordinated Universal Time, UTC)
- ICMP報文的好處是它提供了毫秒級的分辨率
-
- 如某些Unix系統提供的rdate命令只能提供秒級的分辨率。
- 缺陷
-
- 返回的時間是從午夜開始計算的,所以調用者必須經過其餘方法獲知當時的日期
請求端填寫發起時間戳,而後發送報文。應答系統收到請求報文時填寫接收時間戳,在
發送應答時填寫傳送時間戳。可是,實際上,大多數的實現把後面兩個字段都設成相同的值
(提供三個字段的緣由是可讓發送方分別計算髮送請求的時間和發送應答的時間)。
請求與應答報文:
- ICMP報文中都有標識符和序列號。
- 發送端應用程序在標識字段內存入一個惟一的數值,以區別於其餘進程的應答。
- 序列號字段使得客戶程序能夠在區分哪一個請求對應哪一個應答。
ICMP端口不可達差錯
ICMP差錯報文, 端口不可達報文,它是 ICMP目的不可到達報文中的一種,以此來看一看ICMP差錯報文中所附加的信息。
用例:
- UDP
- UDP的規則之一是,若是收到一份UDP數據報而目的端口與某個正在使用的進程不相符,
那麼UDP返回一個ICMP不可達報文。
- TFTP
對於 TFTP服務器來講, UDP的公共端口號是 69。可是大多數的 TFTP客戶程序容許用
connect命令來指定一個不一樣的端口號。這裏,咱們就用它來指定 8888端口:
connect命令首先指定要鏈接的主機名及其端口號,接着用 get命令來取文件。敲入 get
命令後,一份 UDP數據報就發送到主機 svr4上的8 8 8 8端口。 tcpdump命令引發的報文交換結果:
過程分析:
- 在UDP數據報送到 svr4以前,要先發送一份ARP請求來肯定它的硬件地址(第1行)。
- 接着返回ARP應答(第2行)
- 而後才發送UDP數據報(第3行)
- 一個ICMP端口不可達差錯是馬上返回的(第 4行)
- 可是, TFTP客戶程序看上去彷佛忽略了這個ICMP報文,而在5秒鐘以後又發送了另外一份 UDP數據報(第 5行)。
- 在客戶程序放棄以前重發了三次
- 跟在每一個 UDP後面的數字 20指的是UDP數據報中的數據長度。
注意:
- 在tcpdump的輸出中保留ARP請求和應答是爲了提醒咱們,這些報文交換可能在第一個IP數據報從一個主機發送到另外一個主機以前是必需的
- ICMP報文是在主機之間交換的,而不用目的端口號,而每一個20字節的UDP數據報
則是從一個特定端口2924發送到另外一個特定端口8888。
UDP端口不可達中ICMP報文:
ICMP規則:
- ICMP差錯報文必須包含生成該差錯報文的數據報IP首部(包含任何選項)以及後續8個字節(如UDP首部)
-
- 這個信息對於 ICMP差錯的接收方來講是必要的,能夠更多地瞭解致使差錯的緣由。
- 這是由於TCP和UDP都在它們的首部前8個字節中存入源端口號和目的端口號
- 儘管ICMP規則容許系統返回多於8個字節的產生差錯的IP數據報中的數據,但通常只返回8個字節。
ICMP不可達報文的通常格式:
IP首部:獲得源地址和目的地址
前8個字節:源端口號和目的端口號
tcpdump輸出時間序列圖:
當ICMP差錯報文返回時,爲啥應用程序(tftp)一直重發?
- 網絡編程中,BSD系統不把socket接收到的ICMP報文中的UDP數據通知TFTP
- 即應用程序根本就不知道ICMP差錯報文存在?
ICMP報文的處理
icmp覆蓋範圍很廣,從致命差錯到信息差錯。
所以應用程序對每一個ICMP報文的處理都是不同的。
ping程序
該程序發送一份 ICMP回顯請求報文給主機,並等待返回 ICMP回顯應答.
回顯
ping做用:
- 能夠做爲診斷工具查看網絡問題
- 還能測出往返時間,
- 檢測IP記錄路由和時間戳選項
ICMP回顯請求和回顯應答報文
Unix系統在實現ping程序時是把 ICMP報文中的標識符字段置成發送進程的id號。
序列號從0開始,每發送一次新的回顯請求就加 1。
ping輸出
zane@zane-V:~$ ping zane-V
PING zane-V (127.0.1.1) 56(84) bytes of data.
64 bytes from zane-V (127.0.1.1): icmp_seq=1 ttl=64 time=0.022 ms
64 bytes from zane-V (127.0.1.1): icmp_seq=2 ttl=64 time=0.023 ms
64 bytes from zane-V (127.0.1.1): icmp_seq=3 ttl=64 time=0.023 ms
64 bytes from zane-V (127.0.1.1): icmp_seq=4 ttl=64 time=0.023 ms
64 bytes from zane-V (127.0.1.1): icmp_seq=5 ttl=64 time=0.025 ms
64 bytes from zane-V (127.0.1.1): icmp_seq=6 ttl=64 time=0.025 m
當返回ICMP回顯應答時,打印出 序列號 和 TTL(位於IP首部中的生存時間字段),並計算往返時間;
IP記錄路由選項
過程:
- 使得ping程序在發送出去的IP數據報中設置IP的RR選項(該IP數據報包含ICMP回顯請求報文)。
- 每一個處理該數據報的路由器都把它的IP地址放入選項字段中
- 當數據報到達目的端時,IP地址清單應該複製到ICMP回顯應答中,
- 這樣返回途中所通過的路由器地址也被加入清單中。
- 當 ping程序收到回顯應答時,它就打印出這份IP地址清單
問題:ip首部中只有有限的空間來存放IP地址。
答:路由的IP地址不是放在IP報文首部中,而是放在IP報文中的選項字段中
咱們從圖 3 - 1能夠看到,IP首部中的首部長度字段只有 4 bit,所以整個IP首部最長只能包括 15個32 bit長的字(即60個字
節)。因爲 IP首部固定長度爲 20字節, RR選項用去 3個字節(下面咱們再討論),這樣只剩下37個字節(60-20-3)來存放
IP地址清單,也就是說只能存放9個IP地址。
[root@zane1 ~]# ping -R 192.168.56.12
PING 192.168.56.12 (192.168.56.12) 56(124) bytes of data.
64 bytes from 192.168.56.12: icmp_seq=1 ttl=64 time=1.19 ms
RR: 192.168.56.10
192.168.56.12
192.168.56.12
192.168.56.10
64 bytes from 192.168.56.12: icmp_seq=2 ttl=64 time=0.250 ms (same route)
64 bytes from 192.168.56.12: icmp_seq=3 ttl=64 time=0.190 ms (same route)
64 bytes from 192.168.56.12: icmp_seq=4 ttl=64 time=0.248 ms (same route)
64 bytes from 192.168.56.12: icmp_seq=5 ttl=64 time=0.208 ms (same route)
64 bytes from 192.168.56.12: icmp_seq=6 ttl=64 time=0.331 ms (same route)
64 bytes from 192.168.56.12: icmp_seq=7 ttl=64 time=0.274 ms (same route)
64 bytes from 192.168.56.12: icmp_seq=8 ttl=64 time=0.250 ms (same route)
- ping程序是對兩個 TCP/IP系統連通性進行測試的基本工具。
- 它只利用ICMP回顯請求和回顯應答報文,而不用通過傳輸層(TCP/UDP)
- Ping服務器通常在內核中實現 ICMP的功能。
Traceroute程序
- Traceroute程序可讓咱們看到 IP數據報從一臺主機傳到另外一臺主機所通過的路由。
- Traceroute程序還可讓咱們使用 IP源路由選項
Traceroute程序使用
- ICMP報文
- IP首部中的TTL字段(生存週期)。
原理:
當路由器收到一份IP數據報,若是其TTL字段是0或1,則路由器不轉發該數據報
相反,路由器將該數據報丟棄,並給信源機發一份ICMP「超時」信息。
Traceroute程序的關鍵在於包含這份 ICM 信息的IP報文的信源地址是該路由器的IP地址
Traceroute 操做過程
- 它發送一份 TTL字段爲1的IP數據報給目的主機
-
- 處理這份數據報的第一個路由器將 TTL值減1,丟棄該數據報併發回一份超時ICMP報文
- 這樣就獲得了該路徑中的第一個路由器的地址
- 而後 Traceroute程序發送一份TTL值爲2的數據報,這樣咱們就能夠獲得第二個路由器的地址。
- 繼續這個過程直至該數據報到達目的主機。
-
- 可是目的主機哪怕接收到TTL值爲1的IP數據報,也不會丟棄該數據報併產生一份超時ICMP報文,這是由於數據報已經到達其最終目的地。
- 那麼咱們該如何判斷是否已經到達目的主機了呢?
-
- Traceroute程序發送一份UDP數據報給目的主機,但它選擇一個不可能的值做爲UDP端口號(大於 30 000),使目的主機的任何一個應用程序都不可能使用該端口。
- 由於,當該數據報到達時,將使目的主機的 UDP模塊產生一份「端口不可達」錯誤的 ICMP報文。
- Traceroute程序所要作的就是區分接收到的ICMP報文是超時仍是端口不可達,以判斷何時結束。
Traceroute輸出
[root@zane1 ~]# traceroute www.baidu.com
traceroute to www.baidu.com (180.97.33.108), 30 hops max, 60 byte packets
1 10.0.2.2 (10.0.2.2) 0.135 ms 0.054 ms 0.050 ms
2 10.0.2.2 (10.0.2.2) 1.918 ms 1.833 ms 1.766 ms
- 輸出第1個無標號的行給出了
- 主機名及其IP地址
- TTL字段最大值
- 發送的數據報大小
- 輸出的後面兩行:
- TTL值+主機名或路由器名稱+主機/路由器IP
- 對於每一個TTL值發送3分數據報,打印往返時間
ICMP超時報文
類型:11
注意事項
- 並不能保證如今的路由也是未來所要採用的路由,甚至兩份連續的 IP數據報均可能採用不一樣的路由。
- 第二,不能保證 ICMP報文的路由與traceroute程序發送的UDP數據報採用同一路由。
- 第三,返回的 ICMP報文中的信源 IP地址是UDP數據報到達的路由器接口的 IP地址。