天天看點

TCP/IP協定族——網際控制封包協定ICMP

一 引入目的

IP協定沒有差錯報告或差錯糾正機制;IP協定還缺少主機和管理查詢所需要的機制。ICMP是設計來彌補上述兩個缺憾的。

備注:ICMP本身是一個網絡層協定,但是ICMP封包首先要封裝成IP資料報(協定字段是1),然後才被傳遞到下一層。

二 封包

2.1 分類
ICMP封包可劃分為兩大類:差錯報告封包和查詢封包。
差錯報告封包:報告了路由器或主機在處理IP資料報時可能遇到的問題:
3    終點不可達
4    源點抑制
11  逾時
12  參數問題
5    改變路由
查詢封包:幫助主機或網絡管理者從某個路由器或對方主機那裡擷取特定的資訊。
8或0:     回送請求或回答
13或14: 時間戳請求或回答
2.2 封包格式
TCP/IP協定族——網際控制封包協定ICMP

8位元組首部,前4位元組對所有類型均相同,首部的其餘部分對于每一種類型的封包都是特有的。

資料部分:

差錯封包:用于找出引起差錯的原始分組的資訊。

查詢封包:基于查詢類型的額外資訊。

2.3 差錯報告封包

ICMP隻能報告差錯,差錯糾正留給高層協定去做,差錯封包總是發送給最初資料源,因為資料報中唯一可用的資訊就是源IP和目的IP。

一些要點:

(1)對于攜帶ICMP差錯封包的資料報,不再産生ICMP差錯封包。

(2)對于分片的資料報,如果不是第一個分片,則不産生ICMP差錯封包。

(3)對于具有多點傳播位址的資料報,不産生ICMP差錯封包。

(4)對于具有特殊位址的資料報(如127.0.0.0),不産生ICMP差錯封包。

所有差錯封包都包含一個資料部分,它包括的是原始資料報的IP首部再加上該資料報資料的前8個位元組。

加上首部原因:為了向接收差錯封包的原始信源給出關于資料報本身的資訊。

包含資料前8位元組:這8位元組提供了關于端口号(UDP和TCP)和序号(TCP)的資訊。為了讓源點能夠通知這些協定就需要這些資訊。

2.3.1 終點不可達

原因:路由器無法為一個資料報找到路由,或者主機無法傳遞一個資料報。

産生位置:協定不可達和端口不可達隻能由目的主機建立,其餘的終點不可達封包隻能由路由器建立。

注意:即使路由器沒有發送終點不可達封包,也不一定表示資料報已經被傳遞了。

2.3.2 源點抑制

IP協定中沒有流量控制或擁塞控制機制,ICMP源點抑制封包是為了給IP協定增加某種程度的流量控制和擁塞控制而設計的。

源點抑制封包通知源點,由于路由器或目的主機的擁塞,資料報已經被丢棄,源點必須放慢資料報的發送,直到擁塞得到緩解為止。

注意:必須為每一個丢棄的資料報向源主機發送一個源點抑制封包;沒有一種機制可以告訴源點,擁塞已得到緩解,源點隻是不斷地降低發送速率,直到不再收到更多的源點抑制封包為止;在多對一的通信中,源點抑制封包不一定有用。

2.3.3 逾時
逾時封包産生情況:(1)生存時間為0,代碼0,僅供路由器使用;(2)一個封包的所有分片未能在某一時限内全部到達目的主機,代碼1,僅供目的主機。
2.3.4 參數問題
代碼0表示首部的某個字段中有差錯或二義性,代碼1表示缺少所需的選項部分。路由器或目的主機都可以産生參數問題封包。
2.3.5 改變路由
主機通常使用靜态路由選擇,為了更新主機中的路由表,路由器要向主機發送一個改變路由封包。這種情況下路由器不會丢棄資料報,而是将資料報發送給合适的路由器。該封包由路由器向主機發送。
2.4 查詢
2.4.1 回送請求與回答
用來确定兩個系統之間能否彼此通信。回送請求封包可由主機或路由器發送。收到回送請求封包的主機或路由器發送回答封包。因為ICMP封包被封裝成資料報,發送回送請求的機器在收到回送回答封包時,就證明了發送方和接收方之間能用IP資料報進行通信。
2.4.2 時間戳請求和回答
用來确定IP資料報在這兩個機器之間來回所需的往返時間,也可用于同步兩個機器的時鐘。

發送時間=接收時間戳-原始時間戳;

接收時間=分組傳回的時間-發送時間戳;

往返時間=發送時間+接收時間。

若二者時鐘不同步,則發送時間和接收時間是不準确的,往返時間是準确的。

三 排錯工具

3.1 ping
原理:在ICMP回送請求和回送回答封包中設定了辨別符字段,并使序号從0開始,每發送一個新封包序号就遞增1,并且它在封包的資料部分插入了發送時間,當分組到達時,用到達時間-出發時間=往返時間RTT
3.2 traceroute

原理:使用ICMP封包和IP分組的TTL(生存時間)字段找出路由,步驟如下:

a.主機A上的traceroute使用UDP向終點B發送一個分組,這個封包被封裝成IP分組,其TTL值為1,這個程式記下發送該分組的時間。

b.路由器R1收到這個分組,把TTL值減到0,路由器R1就丢棄這個分組,同時路由器R1要發送一個ICMP逾時封包,表示因TTL值為0而丢棄該分組。

c.主機A的程式traceroute收到這個ICMP封包,利用封裝ICMP的IP分組的源位址找出R1的位址,并記錄該分組的到達時間,步驟a的時間與該時間隻差就是往返時間。

d.将TTL值設為2,重複上述步驟找下一個路由器的位址。

問題:主機B如何傳回ICMP分組?

分組到達主機B時,已經到達終點,是以并不丢棄該封包,traceroute将UDP的目的端口設定為UDP協定不支援的一個端口,當主機B收到這個分組時,它找不到可以接受傳遞的應用程式,于是就丢棄該分組,并向主機發送ICMP終點不可達封包(類型3,代碼3标志着整個路由已經查找完畢)。

繼續閱讀