Ping命令实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程实践报告
一.任务描述
二.工作基础
Socket接口是TCP/IP网络的API,它包含许多函数,用来支持进程间通信Socket
译成“套接字”,应用进程要想利用这套函数通信,必须将自己关联到一个套接字上。
–电话系统的插座
–邮政系统的邮箱
是可以被命名和寻址的通信端点
–IP地址+端口号
TCP/IP的Socket有三种类型
(1)流式套接字(SOCK_STREAM):提供面向连接的、可靠的数据传输服务。这种服务保证数据按照发送顺序正确到达接收方。但要像
打电话一样的使用。
(2)数据报式套接字(SOCK_DGRAM):提供无连接的、不可靠的数据传输服务,使用方式类似于邮政,数据可能丢失、重复或顺序混
乱。
(3)原始套接字(SOCK_RAW):该接口允许对较低层协议(如
IP,ICMP)直接访问。
三.程序设计
由上面的执行结果可以看到,ping命令执行后显示出被测试系统主机名
和相应IP地址、返回给当前主机的ICMP报文顺序号、ttl生存时间和
往返时间rtt(单位是毫秒,即千分之一秒)。要写一个模拟ping命令,这些信息有启示作用。要真正了解ping命令实现原理,就要了解ping
命令所使用到的TCP/IP协议。 ICMP(Internet Control Message,网际控制报文协议)是为网关和目标主机而提供的一种差错控制机制,使它们在遇到差错时能把错误报告给报文源发方。ICMP协议是IP层的一个协
议,但是由于差错报告在发送给报文源发方时可能也要经过若干子网,
因此牵涉到路由选择等问题,所以ICMP报文需通过IP协议来发送。
ICMP数据报的数据发送前需要两级封装:首先添加ICMP报头形成ICMP
报文,再添加IP报头形成IP数据报。由于IP层协议是一种点对点的协
议,而非端对端的协议,它提供无连接的数据报服务,没有端口的概念,因此很少使用bind()和connect()函数,若有使用也只是用于设置IP地
址。
1.头文件和定义函数以及变量
2.计算发送和接收的时间
3.统计数据结果
4.校验和函数
5.ICMP头部校验打包和拆包
6.计算时间差函数
7.发送报文函数
8.接收目的主机的回复函数
9.设置ICMP头部
10.设计主函数
四.程序实现
五.总结
在生活中,一旦断网,相信很多人第一件事就是调出终端,ping一下自己的路由,当然大多数是ping一下百度。。。深入一点点看,PING是什么。
PING: Packet Internet Groper, 因特网包探测器。
ping发送的是ICMP报文,ICMP全称是:Internet Control Message Prot ocol,中文名称叫因特网控制消息协议。这样翻译,更通俗一些。也可以说因特网信报协议之类。利用的是IP地址的唯一性,向目标IP地址发送一个数据包,要求:对方返回一个同样大小的数据包,以确定两台网络机器是否连通,以及时延是多少。既然用的是IP地址,直观上课可以看出,ping是用IP协议为自己提供服务的。
具体过程也很简单,本机构造一个ICMP报文,连同目的IP地址交给IP协议,IP协议就把ICMP报文作为自己的数据段,构造一个IP报文。现在问题就是把这个IP报文发送到目的IP地址的问题。
和普通情况下的IP报文传送没有多大的区别。一样是检查IP地址是不是当前局域网,用ARP协议获得MAC地址,构造数据链路帧,交给数据链路传送等等。都是一样的套路。不同的是,目的主机收到后,需要做的事情有哪些不同。ICMP重点是控制,因此,目的主机拆开包以后,根据包的内容,控制信息等,也会构造一个ICMP应答报文,交给本机的IP协议去传送。
一问一答之间,就知道了两个主机之间的连通状态了。
六.附录
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
typedef struct pingm_pakcet{
struct timeval tv_begin;
struct timeval tv_end;
short seq;
int flag;
}pingm_pakcet;
static pingm_pakcet *icmp_findpacket(int seq);
static unsigned short icmp_cksum(unsigned char *data, int len);
static struct timeval icmp_tvsub(struct timeval end, struct timeval begin);
static void icmp_statistics(void);
static void icmp_pack(struct icmp *icmph, int seq, struct timeval *tv,int length);