一步一步实现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
首先看看回显请求和回显应答的命令定义:
- #define ICMP_ECHOREPLY 0 /* echo reply */
- #define ICMP_ECHO 8 /* echo service */