ping 原理与ICMP协议

    以前刚开始看的时候总觉得网络协议只能是层层封装,虽然查找资料,都说在网络上面同时有IP协议,arp协议,ICMP和IGMP协议,但自己就是绕不过弯来,现在想想,唉。。。

    

ping 的原理

    ping 程序是用来探测主机到主机之间是否可通信,如果不能ping到某台主机,表明不能和这台主机建立连接。ping 使用的是ICMP协议它发送icmp回送请求消息给目的主机ICMP协议规定:目的主机必须返回ICMP回送应答消息给源主机。如果源主机在一定时间内收到应答,则认为主机可达。    

   ICMP协议通过IP协议发送的,IP协议是一种无连接的,不可靠的数据包协议。

   ICMP协议在实际传输中数据包:20字节IP首部 + 8字节ICMP首部+ 1472字节<数据大小>38字节

    ICMP首部:8位类型+8位代码+16位校验和+(不同的类型和代码,格式也有所不同)

wKiom1cU8C3BbGd4AAAsB2vtFHc388.jpg

 wKiom1cU6TzCPt-GAAFcx5_NbQg002.png

        icmp协议构成的数据包通过抓包发现是有序的随机一段或者几段的字母表





   ICMP是(Internet Control Message Protocol)Internet控制报文协议一种面向无连接的协议。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息本身并不传输用户数据

抓包分析一组数据:

wKioL1cU6frQ12YTAAAYQNpd4DA212.png

  对于request的抓包,可以看到类型为8,代码为0,代表请求回显(ping请求),同时有16位的校验和 


wKioL1cU6fnyHJXVAAAvsBcuwqI048.png


**************************************************************************************


对于reply的抓包,可以看到类型为0,代码为0,代表回显应答(ping应答)

wKioL1cU6fvTVNciAAAy8S2i414659.png



附具体的ICMP报文的类型

wKioL1cU8MPCj06DAAEa0HP9fZs752.jpg

 



ICMP协议大致分为两类,一种是查询报文,一种是差错报文。其中查询报文有以下几种用途:

  1. ping查询

  2. 子网掩码查询(用于无盘工作站在初始化自身的时候初始化子网掩码)

  3. 时间戳查询(可以用来同步时间)

而差错报文则产生在数据传送发生错误的时候。就不赘述了。

  • 2.ICMP的应用--ping

ping可以说是ICMP的最著名的应用,当我们某一个网站上不去的时候。通常会ping一下这个网站。ping会回显出一些有用的信息。一般的信息如下:

Reply from 10.4.24.1: bytes=32 time<1ms TTL=255
Reply from 10.4.24.1: bytes=32 time<1ms TTL=255
Reply from 10.4.24.1: bytes=32 time<1ms TTL=255
Reply from 10.4.24.1: bytes=32 time<1ms TTL=255

    TTL的值从目的主机到源主机,每经过一个路由减1,实际上也可以通过TTL的大小判断目的主机的系统,默认windows系统是128,linux系统是64.

  • ICMP的应用--Traceroute

Traceroute是用来侦测主机到目的主机之间所经路由情况的重要工具,也是最便利的工具。前面说到,尽管ping工具也可以进行侦测,但是,因为ip头的限制,ping不能完全的记录下所经过的路由器。所以Traceroute正好就填补了这个缺憾。

Traceroute的原理是非常非常的有意思,它受到目的主机的IP后,首先给目的主机发送一个TTL=1(还记得TTL是什么吗?)的UDP(后面就 知道UDP是什么了)数据包,而经过的第一个路由器收到这个数据包以后,就自动把TTL减1,而TTL变为0以后,路由器就把这个包给抛弃了,并同时产生 一个主机不可达的ICMP数据报给主机。主机收到这个数据报以后再发一个TTL=2的UDP数据报给目的主机,然后刺激第二个路由器给主机发ICMP数据 报。如此往复直到到达目的主机。这样,traceroute就拿到了所有的路由器ip。从而避开了ip头只能记录有限路由IP的问题。

有人要问,我怎么知道UDP到没到达目的主机呢?这就涉及一个技巧的问题,TCP和UDP协议有一个端口号定义,而普通的网络程序只监控少数的几个号码较 小的端口,比如说80,比如说23,等等。而traceroute发送的是端口号>30000(真变态)的UDP报,所以到达目的主机的时候,目的 主机只能发送一个端口不可达的ICMP数据报给主机。主机接到这个报告以后就知道,主机到了