ICMP报文的格式和种类

作者在 2009-01-07 10:55:40 发布以下内容

ICMP报文的格式和种类

rague | 13 九月, 2007 16:41

--------------------------------格式-------------------------------------  
  各种ICMP报文的前32bits都是三个长度固定的字段:type类型字段(8位)、code代码字段(8位)、checksum校验和字段(16位)

8bits类型和8bits代码字段:一起决定了ICMP报文的类型。常见的有:
  
  类型8、代码0:回射请求。
  
  类型0、代码0:回射应答。
  
  类型11、代码0:超时。
  
  16bits校验和字段:包括数据在内的整个ICMP数据包的校验和,其计算方法和IP头部校验和的计算方法是一样的。

下图是一张ICMP回射请求和应答报文头部格式

ICMP回射请求和应答报文头部格式

对于ICMP回射请求和应答报文来说,接下来是16bits标识符字段:用于标识本ICMP进程。
  
最后是16bits序列号字段:用于判断回射应答数据报。

ICMP报文包含在IP数据报中,属于IP的一个用户,IP头部就在ICMP报文的前面

一个ICMP报文包括IP头部(20字节)、ICMP头部(8字节)和ICMP报文

IP头部的Protocol值为1就说明这是一个ICMP报文

ICMP头部中的类型(Type)域用于说明ICMP报文的作用及格式

此外还有代码(Code)域用于详细说明某种ICMP报文的类型

所有数据都在ICMP头部后面。RFC定义了13种ICMP报文格式,具体如下:

类型代码 类型描述

0 响应应答(ECHO-REPLY)

3 不可到达

4 源抑制

5 重定向

8 响应请求(ECHO-REQUEST)

11 超时

12 参数失灵

13 时间戳请求

14 时间戳应答

15 信息请求(*已作废)

16 信息应答(*已作废)

17 地址掩码请求

18 地址掩码应答

其中代码为15、16的信息报文已经作废。

下面是几种常见的ICMP报文:

1.响应请求

我们日常使用最多的ping,就是响应请求(Type=8)和应答(Type=0),一台主机向一个节点发送一个Type=8的ICMP报文,如果途中没有异常(例如被路由器丢弃、目标不回应ICMP或传输失败),则目标返回Type=0的ICMP报文,说明这台主机存在,更详细的tracert通过计算 ICMP报文通过的节点来确定主机与目标之间的网络距离。

2.目标不可到达、源抑制和超时报文

这三种报文的格式是一样的,目标不可到达报文(Type=3)在路由器或主机不能传递数据报时使用,例如我们要连接对方一个不存在的系统端口(端口号小于 1024)时,将返回Type=3、Code=3的ICMP报文,它要告诉我们:“嘿,别连接了,我不在家的!”,常见的不可到达类型还有网络不可到达(Code=0)、主机不可到达(Code=1)、协议不可到达(Code=2)等。源抑制则充当一个控制流量的角色,它通知主机减少数据报流量,由于 ICMP没有恢复传输的报文,所以只要停止该报文,主机就会逐渐恢复传输速率。最后,无连接方式网络的问题就是数据报会丢失,或者长时间在网络游荡而找不到目标,或者拥塞导致主机在规定时间内无法重组数据报分段,这时就要触发ICMP超时报文的产生。超时报文的代码域有两种取值:Code=0表示传输超时,Code=1表示重组分段超时。

3.时间戳

时间戳请求报文(Type=13)和时间戳应答报文(Type=14)用于测试两台主机之间数据报来回一次的传输时间。传输时,主机填充原始时间戳,接收方收到请求后填充接收时间戳后以Type=14的报文格式返回,发送方计算这个时间差。一些系统不响应这种报文。

--------------------------------种类-------------------------------------

ICMP报文格式
ICMP虽然是网络层的协议,但要将ICMP报文放入IP中发送。

ICMP报文的公共头标由1字节的类型(type)、1字节的
代码(code)和2字节的校验和(checksum)组成。
类型域和代码域用来标识各种ICMP报文。类型域表示ICMP报文的类型,目前已定义了14
种,从类型值来看ICMP报文可分为二大类。

第1 类是取值为1~127的差错报文,

第2类是取值128以上的是信息(informational)报文。


1不能到达信宿(Destination Unreachable)差错报文
2分组过大(Packet Too Big)差错报文
3超时(Time Exceeded)差错报文
4参数问题(Parameter Problem)差错报文
128返回请求(Echo Request)报文
129返回应答(Echo Reply)报文
130组成员查询(Group Membership Query)
131组成员报告(Group Membership Report)
132组成员结束(Group Membership Termination)
133路由器请求(Router Solicitation)
134路由器公告(Router Advertisement)
135邻机请求(Neighbor Solicitation)
136邻机公告(Neighbor Advertisement)
137 重定向(Redirect)

数据结构 | 阅读 8727 次
文章评论,共1条
vfdff(作者)
2009-01-07 11:05
1
注意:ICMP路由重定向报文正常情况下应该是 路由器 发出来,而非主机<br />
<br />
当I P数据报应该被发送到另一个路由器时,收到数据报的路由器就要发送ICMP重定向差错报文给I P数据报的发送端。这在概念上是很简单的,正如图9 - 3所示的那样。只有当主机可以选择路由器发送分组的情况下,我们才可能看到ICMP重定向报文(回忆我们在图7 - 6中看过的例子)<br />
&nbsp;&nbsp;&nbsp; 1) 我们假定主机发送一份I P数据报给R 1。这种选路决策经常发生,因为R 1是该主机的默认路由。<br />
&nbsp;&nbsp;&nbsp; 2) R1收到数据报并且检查它的路由表,发现R 2是发送该数据报的下一站。当它把数据报发送给R 2时,R 1检测到它正在发送的接口与数据报到达接口是相同的(即主机和两个路由器所在的L A N)。这样就给路由器发送重定向报文给原始发送端提供了线索。<br />
&nbsp;&nbsp;&nbsp; 3) R1 发送一份ICMP重定向报文给主机,告诉它以后把数据报发送给R 2而不是R 1。<br />
<br />
&nbsp;&nbsp;&nbsp; 重定向一般用来让具有很少选路信息的主机逐渐建立更完善的路由表。主机启动时路由表中可以只有一个默认表项(在图9 - 3所示的例子中,为R 1或R 2)。一旦默认路由发生差错,默认路由器将通知它进行重定向,并允许主机对路由表作相应的改动。ICMP重定向允许TCP/IP主机在进行选路时不需要具备智能特性,而把所有的智能特性放在路由器端。显然,在我们的例子中,R 1和R2 必须知道有关相连网络的更多拓扑结构的信息,但是连在LAN上的所有主机在启动时只需一个默认路由,通过接收重定向报文来逐步学习。<br />
9.5.1 一个例子<br />
&nbsp;&nbsp;&nbsp; 可以在我们的网络上观察到ICMP重定向的操作过程(见封二的图)。尽管在拓扑图中只画出了三台主机(aix,solaris和gemini和两台路由器(gateway和netb),但是整个网络有超过150台主机和10台另外的路由器。大多数的主机都把gateway指定为默认路由器,因为它提供了Internet的入口。<br />
&nbsp;&nbsp;&nbsp; 子网140.252.1上的主机是如何访问作者所在子网(图中底下的四台主机)的呢?首先,如果在SLIP链路的一端只有一台主机,那么就要使用代理ARP(4.6节)。这意味着位于拓扑图顶部的子网(140.252.1)中的主机不需要其他特殊条件就可以访问主机sun(140.252.1.29)。位于netb上的代理A R P软件处理这些事情。<br />
&nbsp;&nbsp;&nbsp; 但是,当网络位于SLIP链路的另一端时,就要涉及到选路了。一个办法是让所有的主机和路由器都知道路由器netb是网络140.252.13的网关。这可以在每个主机的路由表中设置静态路由,或者在每个主机上运行守护程序来实现。另一个更简单的办法(也是实际采用的方法)是利用ICMP重定向报文来实现。<br />
&nbsp;&nbsp;&nbsp; 在位于网络顶部的主机solaris上运行ping程序到主机bsdi(140.252.13.35)。由于子网号不相同,代理ARP不能使用。假定没有安装静态路由,发送的第一个分组将采用到路由器gateway的默认路由。下面是我们运行ping程序之前的路由表:<br />
<br />
&nbsp;&nbsp;&nbsp; (224.0.0.0所在的表项是IP广播地址。我们将在第12章讨论)。如果为ping程序指定-v选项,可以看到主机接收到的任何ICMP报文。我们需要指定该选项以观察发送的重定向报文。<br />
<br />
&nbsp;&nbsp;&nbsp; 在收到ping程序的第一个响应之前,主机先收到一份来自默认路由器gateway发来的ICMP重定向报文。如果这时查看路由表,就会发现已经插入了一个到主机bsdi的新路由(该表项如以下黑体字所示)。<br />
<br />
&nbsp;&nbsp;&nbsp; 这是我们第一次看到D标志,表示该路由是被ICMP重定向报文创建的。G标志说明这是一份到达gateway(netb)的间接路由,H标志则说明这是一个主机路由(正如我们期望的那样),而不是一个网络路由。<br />
&nbsp;&nbsp;&nbsp; 由于这是一个被主机重定向报文增加的主机路由,因此它只处理到达主机bsdi的报文。如果我们接着访问主机svr4,那么就要产生另一个ICMP重定向报文,创建另一个主机路由。类似地,访问主机slip也创建另一个主机路由。位于子网上的三台主机(bsdi,svr4和slip)还可以由一个指向路由器sun的网络路由来进行处理。但是ICMP重定向报文创建的是主机路由,而不是网络路由,这是因为在本例中,产生ICMP重定向报文的路由器并不知道位于140.252.13网络上的子网信息。<br />
9.5.2 更多的细节<br />
&nbsp;&nbsp;&nbsp; ICMP重定向报文的格式如图9 - 4所示。<br />
<br />
&nbsp;&nbsp;&nbsp; 有四种不同类型的重定向报文,有不同的代码值,如图9 - 5所示。<br />
<br />
&nbsp;&nbsp;&nbsp; ICMP重定向报文的接收者必须查看三个I P地址:( 1 )导致重定向的I P地址(即ICMP重定向报文的数据位于I P数据报的首部); ( 2 )发送重定向报文的路由器的I P地址(包含重定向信息的I P数据报中的源地址;( 3 )应该采用的路由器I P地址(在ICMP报文中的4 ~ 7字节)。<br />
&nbsp;&nbsp;&nbsp; 关于ICMP重定向报文有很多规则。首先,重定向报文只能由路由器生成,而不能由主机生成。另外,重定向报文是为主机而不是为路由器使用的。假定路由器和其他一些路由器共同参与某一种选路协议,则该协议就能消除重定向的需要(这意味着在图9 - 1中的路由表应该消除或者能被选路守护程序修改,或者能被重定向报文修改,但不能同时被二者修改)。<br />
&nbsp;&nbsp;&nbsp; 在4 . 4 BSD系统中,当主机作为路由器使用时,要进行下列检查。在生成ICMP重定向报文之前这些条件都要满足。<br />
&nbsp;&nbsp;&nbsp; 1) 出接口必须等于入接口。<br />
&nbsp;&nbsp;&nbsp; 2) 用于向外传送数据报的路由不能被ICMP重定向报文创建或修改过,而且不能是路由器的默认路由。<br />
&nbsp;&nbsp;&nbsp; 3) 数据报不能用源站选路来转发。<br />
&nbsp;&nbsp;&nbsp; 4) 内核必须配置成可以发送重定向报文。<br />
&nbsp;&nbsp;&nbsp; 内核变量取名为ip_sendredirects或其他类似的名字(参见附录E)。大多数当前的系统(例如BSD、SunOS 4.1.x、Solaris 2.x 及AIX 3.2.2)在默认条件下都设置该变量,使系统可以发送重定向报文。其他系统如SVR4则关闭了该项功能。<br />
&nbsp;&nbsp;&nbsp; 另外,一台4 . 4 BSD主机收到ICMP重定向报文后,在修改路由表之前要作一些检查。这是为了防止路由器或主机的误操作,以及恶意用户的破坏,导致错误地修改系统路由表。<br />
&nbsp;&nbsp;&nbsp; 1) 新的路由器必须直接与网络相连接。<br />
&nbsp;&nbsp;&nbsp; 2) 重定向报文必须来自当前到目的地所选择的路由器。<br />
&nbsp;&nbsp;&nbsp; 3) 重定向报文不能让主机本身作为路由器。<br />
&nbsp;&nbsp;&nbsp; 4) 被修改的路由必须是一个间接路由。<br />
&nbsp;&nbsp;&nbsp; 关于重定向最后要指出的是,路由器应该发送的只是对主机的重定向(代码1或3,如图9 - 5所示),而不是对网络的重定向。子网的存在使得难于准确指明何时应发送对网络的重定向而不是对主机的重定向。只当路由器发送了错误的类型时,一些主机才把收到的对网络的重定向当作对主机的重定向来处理。
游客请输入验证码
浏览1970328次