Ping命令实现

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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 /* bzero */

#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);

相关文档
最新文档