当前位置: 首页 > TCP/IP > 正文

ICMP协议与ping原理

 

一、ICMP协议分析

ICMP:Internet控制报文协议。由于IP协议并不是一个可靠的协议,它不保证数据被成功送达,那么,如何才能保证数据的可靠送达呢? 这里就需要使用到一个重要的协议模块ICMP(网络控制报文)协议。它传递差错报文以及其他需要注意的信息,经常供IP层或更高层协议(TCP或UDP)使用。所以它经常被认为是IP层的一个组成部分。它在IP数据报文中的封装如下:

ICMP的数据报文格式如下所示。所有报文的前4个字节都是一样的,其他的因报文类型不同而不一样。类型字段可以有15个不同的值,用以描述不同的ICMP报文。校验和字段覆盖整个ICMP报文,使用了和IP首部检验和一样的算法,具体可以看看这篇博文链接:【TCP/IP】检验和算法

icmp-2

不同类型的报文是由类型字段和代码字段来共同决定。下表是各种类型的I C M P报文。

icmp-3

根据上表可知,ICMP协议大致分为两类,一种是查询报文,一种是差错报文。查询报文是用一对请求和应答定义的,它通常有以下几种用途:

  1. ping查询
  2. 子网掩码查询(用于无盘工作站在初始化自身的时候初始化子网掩码)
  3. 时间戳查询(可以用来同步时间)

而差错报文通常包含了引起错误的IP数据报的第一个分片的IP首部(和选项),加上该分片数据部分的前8个字节。RFC 792规范中定义的这8个字节中包含了该分组运输层首部的所有分用信息,这样运输层协议就可以向正确的进程提交ICMP差错报文。

当传送IP数据包发生错误时,比如主机不可达,端口不可达等,ICMP协议就会把错误信息封包,然后传送回给主机。给主机一个处理错误的机会,这也就是为什么说建立在IP层以上的协议是可能做到安全的原因。由上面可知,ICMP数据包由8bit的错误类型和8bit的代码和16bit的校验和组成,而前 16bit就组成了ICMP所要传递的信息。由数据链路层所能发送的最大数据帧,即MTU(Maximum Transmission Unit)为1500,计算易知ICMP协议在实际传输中数据包为:20字节IP首部 + 8字节ICMP首部+ 1472字节(数据大小)。

尽管在大多数情况下,错误的包传送应该给出ICMP报文,但是在特殊情况下,是不产生ICMP错误报文的。如下

  1. ICMP差错报文不会产生ICMP差错报文(出IMCP查询报文)(防止IMCP的无限产生和传送)
  2. 目的地址是广播地址或多播地址的IP数据报。
  3. 作为链路层广播的数据报。
  4. 不是IP分片的第一片。
  5. 源地址不是单个主机的数据报。这就是说,源地址不能为零地址、环回地址、广播地 址或多播地址。

二、ping程序原理分析

ping程序是由Mike Muuss编写,目的是为了测试另一 台主机是否可达,现在已经成为一个常用的网络状态检查工具。该程序发送一份 ICMP回显请求报文给远程主机,并等待返回 ICMP回显应答。利用ping这种原理,已经出现了许多基于ping的网络扫描器,比如nmap、arping、fping、hping3等。所以随着Internet安全意识的增强,现在有些提供访问控制策略的路由器和防火墙已经可以设置过滤特定ICMP报文请求。因此并不能通过简单的ping命令判断远程主机是否在线。

ping 使用的是ICMP协议,它发送icmp回送请求消息给目的主机。ICMP协议规定:目的主机必须返回ICMP回送应答消息给源主机。如果源主机在一定时间内收到应答,则认为主机可达。大多数的 TCP/IP 实现都在内核中直接支持Ping服务器,ICMP回显请求和回显应答报文如下图所示。

icmp-4

ping的原理是用类型码为0的ICMP发请 求,受到请求的主机则用类型码为8的ICMP回应。通过计算ICMP应答报文数量和与接受与发送报文之间的时间差,判断当前的网络状态。这个往返时间的计算方法是:ping命令在发送ICMP报文时将当前的时间值存储在ICMP报文中发出,当应答报文返回时,使用当前时间值减去存放在ICMP报文数据中存放发送请求的时间值来计算往返时间。ping返回接受到的数据报文字节大小、TTL值以及往返时间。

Unix系统在实现ping程序时是把ICMP报文中的标识符字段置成发送进程的 ID号。这样 即使在同一台主机上同时运行了多个 ping程序实例,ping程序也可以识别出返回的信息。

下一篇博文将使用python实现ping程序:《python实现ping程序》

 

参考:

ping 原理与ICMP协议

《TCP/IP详解 卷1:协议》

 

 



这篇博文由 s0nnet 于2015年05月28日发表在 TCP/IP 分类下, 欢迎你在下面发表评论
如无特别说明,独木の白帆发表的文章均为原创,欢迎大家转载,转载请注明: ICMP协议与ping原理 | 独木の白帆
关键字:
【上一篇】【下一篇】

ICMP协议与ping原理:目前有1 条留言

  1. 沙发
    MuShuang:

    “ping的原理是用类型码为0的ICMP发请 求,受到请求的主机则用类型码为8的ICMP回应。”
    type=8是echo request,type=0是echo reply

    2018-07-17 上午9:24 [回复]

发表评论

快捷键:Ctrl+Enter