ICMP

1.定位:互联网控制报文协议(Internet Control Message Protocol),是TCP/IP协议族的一个子协议,位于网络层。它被IP用于提供许多不同的服务。ICMP是一个管理性协议,并且也是一个IP信息服务的提供者。它的信息是被作为IP数据报来传送的。

2.ICMP包具有2个特性:

  能为主机提供有关网络故障的信息。

  被封装在IP数据报内。

3.ICMP用于在IP主机、路由器之间传递控制消息,判断网络连接的状况。控制消息是指目的是否可达、报告错误、网络通不通、路由是否可用、缓存区是否已满、是否超过最大跳数(超时)等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户

数据的传递起着重要的作用。ICMP是一种面向连接的协议,它的传输出错报告控制信息功能对于网络安全具有极其重要的意义。如当遇到IP数据无法访问目标、IP路由器无法按当前的传输速率转发数据包等情况时,会自动发送ICMP消息。即错误侦测与回报机制。

  它提供了错误报告和其它回送给源点的关于 IP 数据包处理情况的消息。ICMP 包含几种不同的消息,其中回送请求(Echo Request)由 Ping 命令产生,主机可通过它来测试网络的可达性,ICMP应答报文(Echo Reply)消息表示该节点是可达的。

4.ICMP差错报告报文:不可达报文、源站抑制、时间超过、参数问题、重定向

  ICMP查询报文:回送请求和应答报文、时间戳请求和应答报文、掩码地址请求和应答报文、路由器请求和通告报文。

5.ICMP数据包详解

  

  各种ICMP报文的前4个字节(32bits)都是三个长度固定的字段(见上图):

  type类型字段(8位)、code代码字段(8位)、checksum校验和字段(16位)。

  8bits类型和8bits代码字段:一起决定了ICMP报文的类型。常见的有:

  类型8、代码0:回显请求;

  类型0、代码0:回显应答;

  类型11、代码0:超时。

  16bits校验和字段:包括数据在内的整个ICMP数据包的校验和,其计算方法和IP头部校验和的计算方法是一样的。

  对于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头部后面。

6.下面是几种常见的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)报文。

7.纠错机制:发送的出错报文返回到发送原数据的设备,因为只有发送设备才是出错报文的逻辑接受者。发送设备随后可根据ICMP报文确定发生错误的类型,并确定如何才能更好地重发失败的数据包。但是ICMP唯一的功能是报告问题而不是纠正错误,

  纠正错误的任务由发送方完成。

  常用的有:用于检查网络通不通的Ping命令(Linux和Windows中均有),这个“Ping”的过程实际上就是ICMP协议工作的过程。还有其他的网络命令如跟踪路由的Tracert命令。

8.操作系统规定的ICMP数据包最大尺寸不超过64KB。

  利用这一规定向主机发起“Ping of Death”(死亡之Ping)攻击。“Ping of Death” 攻击的原理是:如果ICMP数据包的尺寸超过64KB上限时,主机就会出现内存分配错误,导致TCP/IP堆栈崩溃,致使主机死机。(操作系统已经取消了发送

  ICMP数据包的大小的限制,解决了这个漏洞)

  防范“Ping of Death”:1) 在路由器上对ICMP数据包进行带宽限制,将ICMP占用的带宽控制在一定的范围内,这样即使有ICMP攻击,它所占用的带宽也是非常有限的,对整个网络的影响非常少;

  2) 在主机上设置ICMP数据包的处理规则,最好是设定拒绝所有的ICMP数据包。

PING

1.Ping 在Windows系下是自带的一个可执行命令,也叫时延,其值越大,速度越慢。利用它可以检查网络是否能够连通,用好它可以很好地帮助我们分析判定网络故障。应用格式:Ping IP地址。

2.原理:利用网络上机器IP地址的唯一性,给目标IP地址发送一个数据包,再要求对方返回一个同样大小的数据包来确定两台网络机器是否连接相通,时延是多少。

3.工作流程:

  以下面一个网络为例:有A、B、C、D四台机子,一台路由RA,子网掩码均为255.255.255.0,默认网关为192.168.0.1。

  1)   在同一网段内

  在主机A上运行“Ping 192.168.0.5”后,都发生了些什么呢? 首先,Ping命令会构建一个固定格式的ICMP请求数据包,然后由ICMP协议将这个数据包连同地址“192.168.0.5”一起交给IP层协议(和ICMP一样,实际上是一组后台运行的进程),

  IP层协议将以地址“192.168.0.5”作为目的地址,本机IP地址作为源地址,加上一些其他的控制信息,构建一个IP数据包,并想办法得到192.168.0.5的MAC地址(物理地址,这是数据链路层协议构建数据链路层的传输单元——帧所必需的),

  以便交给数据链路层构建一个数据帧。关键就在这里,IP层协议通过机器B的IP地址和自己的子网掩码,发现它跟自己属同一网络,就直接在本网络内查找这台机器的MAC,如果以前两机有过通信,在A机的ARP缓存表应该有B机IP与其MAC的映射关系,

  如果没有,就发一个ARP请求广播,得到B机的MAC,一并交给数据链路层。后者构建一个数据帧,目的地址是IP层传过来的物理地址,源地址则是本机的物理地址,还要附加上一些控制信息,依据以太网的介质访问规则,将它们传送出去。

  主机B收到这个数据帧后,先检查它的目的地址,并和本机的物理地址对比,如符合,则接收;否则丢弃。

  接收后检查该数据帧,将IP数据包从帧中提取出来,交给本机的IP层协议。同样,IP层检查后,将有用的信息提取后交给ICMP协议,后者处理后,马上构建一个ICMP应答包,发送给主机A,其过程和主机A发送ICMP请求包到主机B一模一样。

  2)   不在同一网段内

  在主机A上运行“Ping 192.168.1.4”后,开始跟上面一样,到了怎样得到MAC地址时,IP协议通过计算发现D机与自己不在同一网段内,就直接将交由路由处理,也就是将路由的MAC取过来,至于怎样得到路由的MAC,跟上面一样,先在ARP缓存表找,

  找不到就广播。路由得到这个数据帧后,再跟主机D进行联系,如果找不到,就向主机A返回一个超时的信息。

4.测试网络的连通性:

  1、使用ipconfig /all观察本地网络设置是否正确;

  2、Ping127.0.0.1,127.0.0.1回送地址Ping回送地址,检查本地的TCP/IP协议有没有设置好;

  3、Ping本机IP地址,检查本机的IP地址是否设置有误;

  4、Ping本网网关或本网IP地址,检查硬件设备是否有问题,也可以检查本机与本地网络连接是否正常;(在非局域网中这一步骤可以忽略)

  5、Ping本地DNS地址,检查DNS是否能够接受本地IP。

  6、Ping远程IP地址,这主要是检查本网或本机与外部的连接是否正常。

7.故障检查:

  1)首先对本地工作站的循环地址127.0.0.1进行ping测试。

  当遇到一些无法直接找到故障原因的特殊网络故障时,首先需要使用Ping命令测试一下本地工作站的循环地址127.0.0.1能否被正常Ping通,倘若该地址无法被正常Ping通的话,那么说明本地工作站的TCP/IP协议程序受到了破坏,或者网卡设备发生了损坏。

  此时打开本地工作站系统的设备管理器窗口,从中找到网卡设备选项,并用鼠标右键单击该选项,从弹出的快捷菜单中执行“属性”命令,打开网卡设备的属性设置窗口,在该窗口的“常规”标签页面中我们就能看到当前的网卡工作状态是否正常了。

  当发现网卡工作状态正常的话,那很有可能是本地工作站的TCP/IP协议程序受到了破坏,此时打开本地连接属性设置窗口,选中并删除该设置窗口中的TCP/IP协议选项,之后再重新安装一下TCP/IP协议程序,相信这么一来本地工作站的循环地址127.0.0.1

  就能被正常Ping通了。

  2)其次对本地工作站的IP地址进行ping测试。

  在确认127.0.0.1地址能够被Ping通的情况下,我们继续使用Ping命令测试一下本地工作站的静态IP地址是否能被正常Ping通,倘若该地址不能被正常Ping通的话,那么说明本地工作站的网卡参数没有设置正确,或者网卡驱动程序不正确,

  也有可能是本地的路由表受到了破坏。

  此时我们可以重新检查一下本地工作站的网络参数是否设置正确,如果在网络参数设置正确的情况下仍然无法Ping通本地IP地址的话,我们最好重新安装一下网卡设备的原装驱动程序,相信这么一来我们就能正确Ping通本地工作站的静态IP地址了。

  一旦本地工作站的静态IP地址被顺利Ping通的话,那就表明本地工作站已经能够加入到局域网网络中了。

  接着对本地局域网的默认网关地址进行ping测试。由于本地工作站是通过网关与局域网中的其他工作站进行相互通信的,只有本地工作站与默认网关之间连接正常,才能确保本地工作站与其他工作站通信正常。倘若网关地址能被正常Ping通的话,

  那就表明本地工作站可以与局域网中的其他工作站进行正常通信。

  要是Ping命令操作不成功的话,那很有可能是网关设备自身存在问题,或者是本地工作站与网关之间的线路连接不正常,也有可能是本地工作站与网关没有设置成同一个子网中。此时,我们可以先用专业的线缆测试工具测试一下网络线缆的连通性,

  在线缆连通性正常的情况下,再检查本地工作站的网络参数是否与网关的参数设置成同一个子网中。

  倘若网络参数设置正确的话,我们再从其他工作站Ping一下网关地址,以便确认网关自身是否存在原因,如果局域网中的其他工作站也无法Ping通网关的话,那多半是网关设备自身存在问题,这个时候我们只要将故障排查重点锁定在网关设备上就可以了。

  下面对局域网中任意一台远程工作站的IP地址进行ping测试,以便检验本地工作站能否通过网关设备与局域网中的其他工作站进行通信。要是我们发现远程工作站的IP地址无法Ping通的话,那很有可能是远程工作站自身无法响应,

  或者是远程工作站与网关设备之间的线路连接出现了问题,此时我们可以将网络故障的排查重点聚焦到远程工作站上或者是局域网的网络设备上。

  3)最后对局域网的远程工作站主机名称进行ping测试。在确认能够Ping通远程工作站IP地址的情况下,仍然出现无法访问远程工作站内容的时候,我们就有必要进行这一项测试操作。如果该主机名称无法被Ping成功的话,那很有可能是DNS解析出现了问题,

  而不是网络连接发生了故障,此时我们不妨把故障检查重点锁定在DNS服务器上。

  小提示:为了有效地找出网络故障原因,我们在使用Ping命令进行测试检查时,尽量确保局域网中只配置了一个网关且要ping的主机保持正常的使用状态,同时确保本地工作站没有启用IP安全设置策略,这样可以保证Ping命令能够获得正确的测试结果

 

posted on 2019-07-01 18:38  星痕1216  阅读(555)  评论(0编辑  收藏  举报