icmp协议协议基础详解

网络/协议

44人已加入

描述

   什么是ICMP协议

  ICMP全称Internet Control Message Protocol(网际控制信息协议)

  提起ICMP,一些人可能会感到陌生,实际上,ICMP与我们息息相关。在网络体系结构的各层次中,都需要控制,而不同的层次有不同的分工和控制内容,IP层的控制功能是最复杂的,主要负责差错控制、拥塞控制等,任何控制都是建立在信息的基础之上的,在基于IP数据报的网络体系中,网关必须自己处理数据报的传输工作,而IP协议自身没有内在机制来获取差错信息并处理。为了处理这些错误,TCP/IP设计了ICMP协议,当某个网关发现传输错误时,立即向信源主机发送ICMP报文,报告出错信息,让信源主机采取相应处理措施,它是一种差错和控制报文协议,不仅用于传输差错报文,还传输控制报文。

  ICMP报文格式

  IC M P所有报文的前4个字节都是一样的,但是剩下的其他字节则互不相同。。

  类型字段可以有1 5个不同的值,以描述特定类型的I C M P报文。某些I C M P报文还使用代码字段的值来进一步描述不同的条件。

  表示ICMP头部的数据结构

  typedefstruct icmp_hdr

  { unsigned char icmp_type; //消息类型

  unsigned char icmp_code; //代码

  unsigned short icmp_checksum; //校验和

  unsigned short icmp_id; //ID号

  unsigned short icmp_sequence; //序列号

  unsigned long icmp_timestamp; //时间戳

  } ICMP_HDR,*PICMP_HDR;

     ICMP报文的类型

  ICMP 经常被认为是 IP 层的一个组成部分,它传递差错报文以及其他需要注意的信息。ICMP 报文通常被 IP 层或更高层协议(TCP 或 UDP)使用。ICMP 报文是在 IP 数据报内部传输的。IP 协议是不可靠协议,不能保证 IP 数据报能够成功的到达目的主机,无法进行差错控制,而 ICMP 协议能够协助 IP 协议完成这些功能。下面是 ICMP 报文的数据结构:

  类型:一个 8 位类型字段,表示 ICMP 数据包类型;

  代码:一个 8 位代码域,表示指定类型中的一个功能,如果一个类型中只有一种功能,代码域置为 0;

  检验和:数据包中 ICMP 部分上的一个 16 位检验和;

  ICMP

  ICMP 差错报文

  当发送一份差错报文时,报文始终包含 IP 的首部和产生 ICMP 差错报文的 IP 数据报的前 8 位字节。这样,接收 ICMP 差错报文的模块就会把它与某个特定的协议(根据 IP 数据报首部中的协议字段来判断)和用户进程(根据包含在 IP 数据报前 8 个字节中的 TCP 或 UDP 报文首部中的 TCP 或 UDP 端口号来判断)联系起来。

  下面各种情况不会导致产生 ICMP 差错报文:

  ICMP 报文差错(ICMP查询报文可能会产生ICMP差错报文);

  目的地址是广播地址或多播地址的 IP 数据报;

  作为链路层广播的数据报;

  不是 IP 分片的第一片;

  源地址不是单个主机的数据报,也就是说,源地址不可能是零地址、环回地址、广播地址或多播地址;

  以下针对 ICMP 差错报文的类型进行分析:

  1、ICMP 目标不可达消息:IP 路由器无法将 IP 数据报发送给目的地址时,会给发送端主机返回一个目标不可达 ICMP 消息,并在这个消息中显示不可达的具体原因。

  2、ICMP 重定向消息:如果路由器发现发送端主机使用次优的路径发送数据时,那么它会返回一个 ICMP 重定向消息给这个主机,这个消息包含了最合适的路由信息和源数据。主要发生在路由器持有更好的路由信息的情况下,路由器会通过这个 ICMP 重定向消息给发送端主机一个更合适的发送路由。

  3、ICMP 超时消息:IP 数据包中有一个字段 TTL(Time to live,生存周期),它的值随着每经过一个路由器就会减 1,直到减到 0 时该 IP 数据包被丢弃。此时,IP 路由器将发送一个 ICMP 超时消息给发送端主机,并通知该包已被丢弃。

  4、源抑制消息:当 TCP/IP 主机发送数据到另一主机时,如果速度达到路由器或者链路的饱和状态,路由器发出一个 ICMP 源抑制消息。

  各种类型的I C M P报文如图所示,不同类型由报文中的类型字段和代码字段来共同决定。图中的最后两列表明I C M P报文是一份查询报文还是一份差错报文。因为对I C M P差错报文有时需要作特殊处理,因此我们需要对它们进行区分。例如,在对I C M P差错报文进行响应时,永远不会生成另一份I C M P差错报文(如果没有这个限制规则,可能会遇到一个差错产生另一个差错的情况,而差错再产生差错,这样会无休止地循环下去)。

  当发送一份I C M P差错报文时,报文始终包含I P的首部和产生I C M P差错报文的I P数据报的前8个字节。这样,接收I C M P差错报文的模块就会把它与某个特定的协议(根据I P数据报首部中的协议字段来判断)和用户进程(根据包含在I P数据报前8个字节中的T C P或U D P报文首部中的T C P或U D P端口号来判断)联系起来。6 。 5节将举例来说明一点。

  下面各种情况都不会导致产生I C M P差错报文:

  1) ICMP差错报文(但是,I C M P查询报文可能会产生I C M P差错报文)。

  2) 目的地址是广播地址或多播地址的I P数据报。

  3) 作为链路层广播的数据报。

  4) 不是I P分片的第一片。

  5) 源地址不是单个主机的数据报。这就是说,源地址不能为零地址、环回地址、广播地

  址或多播地址。

  这些规则是为了防止过去允许I C M P差错报文对广播分组响应所带来的广播风暴。

ICMP

  下面是几种常见的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 地址掩码消息:主要用于主机或路由想要了解子网掩码的情况。可以向那些主机或路由器发送 ICMP 地址掩码请求消息,然后通过接收 ICMP 地址掩码应答消息获取子网掩码信息。

  ----ICMP 时间戳消息:可以向那些主机或路由器发送 ICMP 时间戳请求消息,然后通过接收 ICMP 时间戳应答消息获取时间信息。

  Ping 程序

  Ping 程序利用 ICMP 回显请求报文和回显应答报文(而不用经过传输层)来测试目标主机是否可达。它是一个检查系统连接性的基本诊断工具。

  ICMP 回显请求和 ICMP 回显应答报文是配合工作的。当源主机向目标主机发送了 ICMP 回显请求数据包后,它期待着目标主机的回答。目标主机在收到一个 ICMP 回显请求数据包后,它会交换源、目的主机的地址,然后将收到的 ICMP 回显请求数据包中的数据部分原封不动地封装在自己的 ICMP 回显应答数据包中,然后发回给发送 ICMP 回显请求的一方。如果校验正确,发送者便认为目标主机的回显服务正常,也即物理连接畅通。

  例如:在终端上 Ping 下谷歌的地址,神奇的发现谷歌地址既然不用翻墙都能上了,而且丢包率 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 程序主要用来侦测源主机到目的主机之间所经过的路由的情况。

  Traceroute 使用 ICMP 报文和 IP 首部中的 TTL 字段,它充分利用了 ICMP 超时消息。其原理很简单,开始时发送一个 TTL 字段为 1 的 UDP 数据报,而后每次收到 ICMP 超时萧后,按顺序再发送一个 TTL 字段加 1 的 UDP 数据报,以确定路径中的每个路由器,而每个路由器在丢弃 UDP 数据报时都会返回一个 ICMP 超时报文,而最终到达目的主机后,由于 ICM P选择了一个不可能的值作为 UDP 端口(大于30000)。这样目的主机就会发送一个端口不可达的 ICMP 差错报文。

    ICMP协议的运用

  1 ICMP地址掩码请求与应答

  I C M P地址掩码请求用于无盘系统在引导过程中获取自己的子网掩码。系统广播

  它的I C M P请求报文(这一过程与无盘系统在引导过程中用R A R P获取I P地址是类似的)。无盘

  系统获取子网掩码的另一个方法是B O O T P协议。如图

  I C M P报文中的标识符和序列号字段由发送端任意选择设定,这些值在应答中将被返回。

  这样,发送端就可以把应答与请求进行匹配。

  我们可以写一个简单的程序(取名为i c m p a d d r m a s k),它发送一份I C M P地址掩码请求报

  文,然后打印出所有的应答。由于一般是把请求报文发往广播地址,因此这里我们也这样做。

  目的地址(1 4 0 。 2 5 2 。 1 3 。 6 3)是子网1 4 0 。 2 5 2 。 1 3 。 32的广播地址。

  sun% icmpaddrmask 140.252.13.63

  receivedmask = ffffffe0, from 140.252.13.来3自3 本 机

  receivedmask = ffffffe0, from 140.252.13.来3自5 b s d i

  receivedmask = ffff0000, from 140.252.13.来3自4 s v r 4

  在输出中我们首先注意到的是,从s v r 4返回的子网掩码是错的。显然,尽管s v r 4接口

  已经设置了正确的子网掩码,但是S V R 4还是返回了一个普通的B类地址掩码,就好像子网并

  不存在一样。

  svr4% ifconfig emd0

  emd0:flags=23《UP,BROADCAST,NOTRAILERS》

  inet140.252.13.34 netmask ffffffe0 broadcast 140.252.13.63

  S V R 4处理I C M P地址掩码请求过程存在差错。

  我们用t c p d u m p命令来查看主机b s d i上的情况,输出如图6 - 5所示。我们用- e选项来查看

  硬件地址。

  发到广播地址的ICMP地址掩码请求

  注意,尽管在线路上什么也看不见,但是发送主机s u n也能接收到I C M P应答(带有上面

  “来自本机”的输出行)。这是广播的一般特性:发送主机也能通过某种内部环回机制收到一份广播报文拷贝。由于术语“广播”的定义是指局域网上的所有主机,因此它必须包括发送主机在内。

  接下来,b s d i广播应答,而s v r 4却只把应答传给请求主机。通常,应答地址必须是单播地址,除非请求端的源I P地址是0 。 0 。 0 。 0。本例不属于这种情况,因此,把应答发送到广播地址是B S D / 3 8 6的一个内部差错。

  R F C规定,除非系统是地址掩码的授权代理,否则它不能发送地址掩码应答(为

  了成为授权代理,它必须进行特殊配置,以发送这些应答。参见附录E)。但是,正如

  我们从本例中看到的那样,大多数主机在收到请求时都发送一个应答,甚至有一些主

  机还发送差错的应答。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分