一步一步实现Linux下Ping命令

ICMP协议是Internet控制报文协议,通常被认为是IP层的组成部分。它传递差错报文以及其它需要注意的信息。ICMP协议通常被IP层或更高层协议使用。

Ping命令是ICMP协议的一个使用范例。Ping命令主要是用于测试一台主机和另外一台主机之间的网络连通性。主要的过程就是Ping程序通过发送回显请求报文,然后接收远程主机的回显应答报文,通过分析回显应答报文就可知道两台主机的网络连通性。

                         ICMP数据报首部如下
      |   类型(0或8)  |    代码(0)    |      校验和      |
      |               标识符                 |        序号        |
      |                             选项数据                       |

实现ping命令主要就是自己构造ICMP回显请求报文,通过套接字发送到目的主机,然后接收目的主机的ICMP回显应答报文,通过解析回显应答报文就知道是否可以到达远程主机了!

下面来说一下分析一下ICMP报文首部各个字段的具体含义,只有知道了具体的含义才能知道怎么来构造自己的ICMP报文:

ICMP回显请求报文和回显应答报文都属于查询类报文的一种。类型字段指名了该报文是回显请求报文还是回显应答报文:0代表回显应答报文,8代表回显请求报文;代码字段在这两种报文的情况下都是0;校验和是重点,应该无效的报文是不能利用的,所以,通过校验和我们可以获取有效报文再进行报文分析;标识符字段一般的做法都是设置为进程的ID号,这样简洁明了,而且使得我们可以在一台主机上运行多个ping命令实例,不会发生冲突。序号字段从0开始,每发送一次新的会显请求就会增加1.数据选项我们只需注意,回显请求报文和回显应答报文该字段设置成一样即可。

下面看看ICMP在linux下有关数据结构的标示方式:定义可查看

http://freebsd.active-venture.com/FreeBSD-srctree/newsrc/netinet/ip_icmp.h.html

首先看看回显请求和回显应答的命令定义:

  1. #define ICMP_ECHOREPLY      0       /* echo reply */   
  2. #define ICMP_ECHO       8       /* echo service */  

相关推荐