最近一直在看《TCP/IP详解》这本书,也许因为我不是计算机专业的缘故,总感觉看了跟没看一样,想着写写博客,能加深印象,结果简直是尴尬。所以想着不如自己动手来实现一个Ping程序,当是学习学习吧,几年以前用Boost带的asio库实现过一个,此次不依赖任何第三方库,实现一个最基本的Ping程序。
Ping程序原理
要实现ping程序,当然要知道他的原理,ping的原理其实很简单,几乎每个系统都实现了icmp服务器,当有icmp请求到来的时候,目的端就会做出相应的回应,ping程序正是利用了这一点。通过向目的端发送回显请求报文,观察目的端是否回应请求,从而判断网络是否连通。目的端会将源端发送过来的数据包再重新发回给源端。
Ping程序演示
系统自带的ping程序演示如图所示:
数据报格式定义
该程序中涉及的数据报包括IP和ICMP两种数据报,各种数据报的定义如下,在定义数据报的时候必须准确,否则目的主机会丢弃数据报,而不会给出相应的应答。
ICMP报头定义
ICMP报文格式如下图所示:
ICMP源端使用的类型是0x08,表示回显请求,代码是0,ICMP目的端使用的类型是0x00,表示回显应答,代码是0。类型及代码的意义如下图所示,检验和的计算方法网络上有很,请自行查询。
详细说明请参见:
ICMP:报文控制协议
ICMP报头的定义如下所示:
其中,compute_checksum函数,用于计算ICMP报的校验和,计算方式如下:
构造函数用于在数据返回时,从目的端返回的数据缓冲区中读取出对应的ICMP报头。如下所示:
IP报头定义
IP报文格式如下图所示:
其中的数据部分就是我们的ICMP数据报头及数据部分。详细说明请参见
IP:网际协议
其C语言定义如下:
该结构的构造函数如下所示,该构造函数