ping命令的设计与实现要点

合集下载

ping命令的实现过程 -回复

ping命令的实现过程 -回复

ping命令的实现过程-回复"ping命令的实现过程"引言:在计算机网络中,ping命令是一种常见的网络诊断工具,用于测试主机之间的连接性以及网络延迟。

它通过发送ICMP(Internet Control Message Protocol)请求报文,并等待目标主机返回相应。

本文将一步一步地解析ping命令的实现过程,帮助读者深入了解这个常用工具背后的原理。

一、环境准备要实现ping命令,我们首先需要了解网络协议栈和操作系统网络接口的基本知识。

同时,为了简化实现过程,我们将使用一些常见的网络库、工具和编程语言,例如Python或C语言的套接字编程接口。

二、发送ICMP请求报文在实现ping命令时,我们要首先构造ICMP请求报文,并通过网络发送给目标主机。

这个过程可以分为以下几个步骤:1. 创建套接字:使用socket库创建一个原始套接字,以便可以直接访问网络层。

通常,这个套接字的协议类型应为ICMP。

2. 构造IP报文头:创建IP报文头以封装ICMP请求报文。

这需要设置源IP地址、目标IP地址以及其他相关网络参数。

3. 构造ICMP请求报文:创建ICMP请求报文,其中包括报文类型(通常为Echo Request)、标识符(用于匹配请求和响应报文)、序列号(用于区分不同的ping请求)等字段。

还要计算校验和,确保报文的完整性。

4. 发送报文:通过上述套接字将构造的IP报文头和ICMP请求报文发送给目标主机。

三、接收ICMP响应报文发送ICMP请求报文后,我们需要等待目标主机的响应,并分析返回的ICMP响应报文。

下面是实现这一步的具体过程:1. 准备套接字:在接收ICMP响应报文之前,我们首先需要准备接收这些报文的套接字。

同样,我们使用一个原始套接字,并设置其协议类型为ICMP。

2. 接收报文:使用套接字的接收函数,等待目标主机的ICMP响应报文,并将其存储在缓冲区中。

3. 解析报文:解析接收到的ICMP响应报文,提取其中的关键信息,如标识符、序列号以及时间戳等。

ping命令的实现过程

ping命令的实现过程

ping命令的实现过程Ping命令是计算机网络中常用的命令之一,用于测试主机之间的连通性和测量网络的响应时间。

本文将详细介绍Ping命令的实现过程,从底层的原理到具体的步骤,帮助读者了解Ping命令背后的工作原理。

第一步:构建ICMP报文Ping命令使用的是ICMP(Internet Control Message Protocol)协议来实现。

ICMP是网络层协议的一部分,用于在IPv4网络中传输控制和错误消息。

Ping命令构建的ICMP报文中包含了源IP地址、目的IP地址和一些其他的控制和错误信息。

第二步:发送ICMP报文Ping命令通过操作系统提供的网络API来发送ICMP报文。

具体的过程包括创建一个套接字(socket)、设置套接字的选项、指定目的IP地址和端口号等。

当ICMP报文被发送到目的主机时,它会被网络设备(如路由器)转发到目的主机。

第三步:接收ICMP回应目的主机收到ICMP报文后,会根据报文中的信息进行相应的处理。

如果目的主机可以接受ICMP报文,它会在接收后生成一个ICMP回应报文,并将其发送回源主机。

ICMP回应报文中包含了与源ICMP报文相对应的标识符和序列号等信息。

第四步:计算往返时间源主机收到ICMP回应报文后,会通过比较回应报文中的标识符和序列号等信息,来确定该回应报文与先前发送的ICMP报文所对应。

通过记录发送ICMP报文的时间戳和接收ICMP回应报文的时间戳,可以计算出往返时间(Round-Trip Time,简称RTT)。

第五步:显示结果Ping命令会将计算得到的往返时间显示在终端上,同时还会显示其他统计信息,如丢包率、最小RTT、最大RTT和平均RTT等。

这些信息可以帮助用户了解网络的稳定性和性能。

总结:Ping命令的实现过程可以概括为构建ICMP报文、发送ICMP报文、接收ICMP回应、计算往返时间和显示结果。

通过这一过程,Ping命令可以验证网络的连通性,并测量网络的响应时间。

Ping 程序设计原理(2023最新版)

Ping 程序设计原理(2023最新版)

Ping 程序设计原理⒈引言本文档旨在介绍 Ping 程序设计原理,包括其概述、设计原则和实现细节。

Ping 是一种网络工具,用于测试主机之间的网络连通性。

本文将讨论 Ping 的基本原理、实现方法以及使用示例。

⒉概述Ping 是一种基于 ICMP(Internet Control Message Protocol)的网络工具,它通过向目标主机发送 ICMP 回显请求消息(Echo Request)并等待目标主机的 ICMP 回显应答消息(Echo Reply)来测试主机之间的连通性。

⒊设计原则在设计 Ping 程序时,需要考虑以下原则:- 网络层协议:Ping 使用 ICMP 协议进行通信,所以需要对ICMP 协议进行理解和实现。

- 数据包处理:Ping 程序需要构造 ICMP 回显请求消息,并解析目标主机的 ICMP 回显应答消息。

- 超时机制:Ping 程序需要设置合理的超时时间,如果在超时时间内未接收到回显应答,则认为连接超时。

- 循环测试:Ping 程序可以通过循环发送 ICMP 回显请求消息来进行连通性测试。

⒋实现细节⑴ ICMP 协议ICMP 是一种网络层协议,用于在 IP 网络中传递错误消息和操作性消息。

在 Ping 程序中,我们使用 ICMP 协议来进行主机之间的连通性测试。

⑵构造 ICMP 回显请求消息Ping 程序在发送 ICMP 回显请求消息时,需要构造相应的数据包。

构造 ICMP 数据包过程需要设置以下字段:- 类型:设置为 8,表示 ICMP 回显请求消息。

- 代码:通常设为 0。

- 校验和:对 ICMP 数据包进行校验和计算。

- 标识符和序列号:用于识别 ICMP 回显请求消息和回显应答消息之间的对应关系。

- 数据:可以包含任意数据,用于传递给目标主机处理。

⑶解析 ICMP 回显应答消息Ping 程序在接收到目标主机的 ICMP 回显应答消息时,需要解析其内容。

解析 ICMP 数据包时,需要检查以下字段:- 类型:应为 0,表示 ICMP 回显应答消息。

ping的简单实现课程设计

ping的简单实现课程设计

ping的简单实现课程设计一、教学目标本课程的教学目标是使学生掌握ping命令的基本使用方法,理解其工作原理,能够通过ping命令诊断网络连接问题。

具体包括:1.了解ping命令的作用和基本语法。

2.掌握如何使用ping命令检测网络连接。

3.理解ping命令的响应结果的含义。

4.能够独立操作计算机,运行ping命令。

5.能够分析ping命令的输出结果,判断网络连接状态。

6.能够根据实际情况,选择合适的ping命令参数。

情感态度价值观目标:1.培养学生对网络通信技术的兴趣和好奇心。

2.培养学生解决问题的能力和团队合作精神。

二、教学内容本课程的教学内容主要包括以下几个部分:1.ping命令的基本概念和语法。

2.ping命令的使用方法,包括如何检测网络连接。

3.ping命令的响应结果的解读。

4.如何在实际情况下,选择合适的ping命令参数。

三、教学方法本课程的教学方法包括:1.讲授法:讲解ping命令的基本概念、语法和原理。

2.实验法:引导学生实际操作ping命令,检测网络连接。

3.讨论法:分组讨论ping命令的输出结果,培养学生解决问题的能力。

四、教学资源本课程的教学资源包括:1.教材:《计算机网络基础》相关章节。

2.多媒体资料:PPT课件,网络连接检测的实验视频。

3.实验设备:计算机、网络环境。

以上是本课程的教学设计,希望能够帮助学生更好地掌握ping命令的使用,提高网络故障排除的能力。

五、教学评估本课程的教学评估将采用多元化的评估方式,以全面、客观、公正地评价学生的学习成果。

评估方式包括:1.平时表现:通过观察学生在课堂上的参与度、提问回答、小组讨论等表现,评估学生的学习态度和理解能力。

2.作业:布置相关的ping命令练习题,要求学生独立完成,通过作业的质量和完成时间评估学生的掌握程度。

3.实验报告:学生在实验过程中,需要撰写实验报告,描述实验过程、结果和收获,通过实验报告评估学生的实际操作能力和问题解决能力。

ping命令详解

ping命令详解

ping命令详解ping命令是计算机网络中常用的命令之一,用于测试网络连接以及判断网络通信质量。

它通过发送数据包来测量从源主机到目标主机的往返时间,并可以检查数据包是否丢失或延迟。

本文将对ping命令进行详细介绍,包括其原理、用法以及常见问题的排查方法。

一、ping命令的原理在计算机网络中,ping命令利用ICMP(Internet Control Message Protocol,互联网控制消息协议)来发送网络数据包,然后等待目标主机的响应来判断网络的连通性和响应时间。

pong则是相应的包。

通过发送一个ICMP Echo Request包给目标主机,然后等待目标主机返回一个ICMP Echo Reply包,ping命令可以计算往返时间(Round-Trip Time,简称RTT)并统计丢包率。

这些信息可以帮助我们检测网络连接是否正常以及网络速度的快慢。

二、ping命令的用法在Windows系统下,我们可以使用命令提示符(Command Prompt)或者Windows PowerShell来执行ping命令。

在Linux和macOS系统下,则可以使用终端(Terminal)来操作。

下面是ping命令的基本用法:ping [选项] [目标主机]其中,目标主机可以是IP地址或者域名。

常见的选项包括:-c n:指定发送数据包的次数,n是一个正整数;-i n:指定发送数据包的时间间隔,n是一个浮点数,单位是秒;-w n:指定等待目标主机响应的超时时间,n是一个正整数,单位是毫秒;-s n:指定发送数据包的大小,n是一个正整数,单位是字节;-t:持续发送数据包,直到手动停止。

例如,执行ping命令ping 发送数据包并等待响应。

ping命令会显示每个数据包的往返时间以及丢包情况。

通过观察ping命令的输出,我们可以判断网络的连通性和响应速度。

三、常见问题的排查方法1. 目标主机不可达问题当我们执行ping命令时,如果显示“请求超时”或者“目标主机不可达”的错误信息,说明目标主机无法通过网络进行访问。

计算机网络基础课程设计Ping程序实现

计算机网络基础课程设计Ping程序实现

计算机网络基础课程设计Ping程序实现计算机网络工程课程设计报告题目:Ping程序的实现学生姓名:学号:专业班级:计科专业班同组姓名: 指导教师:设计时间:2022年下学期第某周指导老师意见:评定成绩:签名:日期:年月日目录一、课程设计的目的和意义2二、课程设计的内容和要求21.内容:22.要求:2三、课程设计的相关技术2四、课程设计过程21.Ping主模块22.功能控制模块43.数据报解析模块5五、课程设计小结6六、参考文献7七、附录(程序清单)7八、心得体会11一、课程设计的目的和意义利用ICMP数据包、C语言实现Ping命令程序,能实现基本的Ping操作,发送ICMP回显请求报文,用于测试—个主机到只一个主机之间的连通情况。

通过本程序的训练,使学生熟悉ICMP报文结构,使学生对ICMP有更深的理解,掌握Ping程序的设计方法,掌握网络编程的方法和技巧,从而编写出功能更强大的程序。

二、课程设计的内容和要求1.内容:用C语言实现Ping命令程序,能实现基本的Ping操作,发送ICMP回显请求报文,用于测试—个主机到只一个主机之间的连通情况。

2.要求:1)独立完成程序的设计、编码和调试。

2)系统利用C语言实现,程序调试环境为TurboC或VC;3)按照课程设计规范书写课程设计报告。

4)采用VC环境进行调试运行。

三、课程设计的相关技术由于Ping程序是面向用户的应用程序,该程序使用ICMP的封装机制,通过IP协议来工作。

为了实现直接对IP和ICMP包进行操作,实验中使用RAW模式的ocket编程。

首先定义IP数据报首部,在IP数据报的基础上定义ICMP数据报首部,并初始化一些全局变量。

接着自定义填充ICMP数据报字段函数FillICMPData()、校验和函数checkum()、解读ICMP报首部函数DecodeICMPHeader()、释放资源函Cleanup()。

最后主函数通过调用这些函数来实现Ping命令功能。

ping程序设计与实现课程设计

ping程序设计与实现课程设计一、课程目标知识目标:1. 学生能理解ping程序的工作原理,掌握网络诊断的基本方法。

2. 学生能描述IP协议、ICMP协议的基本概念及其在ping程序中的应用。

3. 学生了解计算机网络的通信原理,掌握如何利用ping程序检测网络连通性。

技能目标:1. 学生能运用所学知识,独立编写简单的ping程序。

2. 学生通过实践操作,提高问题分析及解决能力,具备基本的网络诊断技巧。

3. 学生掌握使用编程工具(如:IDE、编译器等)进行代码编写、调试和优化。

情感态度价值观目标:1. 学生培养对计算机网络的兴趣,激发学习编程的热情。

2. 学生在学习过程中,培养团队协作、沟通表达的能力,增强自信心。

3. 学生通过本课程的学习,认识到网络技术在实际应用中的重要性,培养对网络安全的责任感。

分析课程性质、学生特点和教学要求,本课程旨在让学生掌握ping程序的设计与实现,结合实际操作,提高学生的编程能力和网络诊断技巧。

课程目标具体、可衡量,有助于教师进行教学设计和评估。

通过本课程的学习,学生将具备基本的网络编程知识和技能,为今后的学习和工作打下坚实基础。

二、教学内容1. 网络基础知识回顾:IP协议、ICMP协议、网络层通信原理。

2. ping程序工作原理:发送ICMP请求、接收ICMP回复、计算往返时间(RTT)。

3. 编程语言基础:C语言或Python语言的基本语法,重点掌握数据类型、控制结构、函数定义。

4. ping程序设计与实现:- 环境搭建:安装编程工具、配置网络环境。

- 代码编写:根据ping程序工作原理,编写发送和接收ICMP请求的代码。

- 调试与优化:调试代码,处理异常情况,优化程序性能。

5. 实践操作:分组进行实际操作,组内讨论、分析问题,相互协作完成ping 程序编写。

6. 网络诊断技巧:运用ping程序检测网络连通性,分析网络延迟、丢包等问题。

教学内容安排和进度:第一课时:网络基础知识回顾,介绍ping程序工作原理。

ping程序的设计与实现

ping程序的设计与实现
Ping程序的设计与实现是通过一种单向测量技术来实现的,它可以用来评估网络的性能、访问故障和网络可用性。

Ping程序工作时会首先向目标主机发送一个ICMP(网际控制报文协议)报文,然后等待目标主机的应答。

在实现ping程序的过程中,首先要为发送的ICMP数据报定义一个数据结构,这个数据结构将包含所有必要的信息,如报文类型、报文代码、校验和等。

其次,要实现函数,对这个数据结构进行填充和序列化,以便将ICMP报文发送出去。

实现发送ICMP报文后,就要开始接收应答。

为此,可以利用Socket API来创建一个Raw Socket,以便从网络上接收ICMP报文,并将其解码为数据结构,以便能够识别是哪一条报文的应答。

最后,还需要实现超时,用来处理因网络拥塞或丢包等原因导致的应答报文没有收到的情况。

这可以通过在发送ICMP报文之前先设置一个定时器,当定时器到期时,就可以判断该报文没有收到应答报文而超时。

以上就是ping程序的大致设计与实现方式,整个实现的过程可以大体分为发送ICMP数据报、接收应答和超时处理三部分。

这些都需要对数据报结构进行定义和填充,以及使用Socket API创建Raw Socket 来发送和接收数据,并通过设置定时器来实现超时处理,以保证ping 程序可以正常工作。

Linux网络编程基础(4)--Ping的C代码实现

Linux⽹络编程基础(4)--Ping的C代码实现1、背景 在进⾏⽹络编程的时候,通常使⽤的协议有TCP协议,UDP协议。

这些协议在简历套接字之初需要制定套接字的类型,⽐如TCP应当设置为 SOCK_STREAM,UDP对应的套接字应当设置为SOCK_DGRAM。

但是这些套接字并⾮能够提供⽹络所需的全部功能,我们还需要其他的套接字,⽐如原始套接字OCK_RAW。

原始套接字可以提供SOCK_STREAM和SOCK_DGRAM所不及的能⼒。

⽐如:(1)有了原始套接字,进程可以读取ICMPV4、ICMPV6、IGMP等的分组。

正如ping所使⽤的套接字,就是SOCK_RAW类型的。

这样使得使⽤ICMP和IGMP的程完全能够作为⽤户进程处理,⽽⽆需向内核添加代码。

(2)有了原始套接字,进程可以处理内核不处理其协议字段的IPV4数据报。

(3)有了原始套接字,进程使⽤IP_HDRINCL套接字选项定制⾃⼰的IPV4头部。

当然,上述的三个功能,并不是本⽂都要涉及的;只关注第⼀个能⼒,编写代码,实现ping程序。

2、基本使⽤ a.定义原始套接字与定义其他套接字没有形式上的巨⼤差别。

int sockfd; sockfd = socket(AF_INET, SOCK_RAW, protocol); protocol 的值是型为 IPPROTO_XXX的量,这些量定义在<netinet/in.h>中,⽐如ping使⽤的 IPPROTO_ICMP(关于IPV6的实现,再后续补充)。

只有超级⽤户才可以创建SOCK_RAW类型的套接字。

b. 原始套接字并不存在端⼝的概念。

可以在原始套接字上调⽤bind函数,但是这么做并不常见。

bind函数会设置发送数据报的源IP地址,如果没有使⽤ bind函数,那么内核将出发的借⼝地址作为源地址。

c. 同样,⼀般不会使⽤connect函数,connect函数会指定⽬的地址,但是因为原始套接字不存在端⼝概念,所以connect函数并不重要了。

Ping 程序设计原理

Ping 程序设计原理Ping 程序设计原理1. 简介Ping(Packet Internet Groper)是一种基于 ICMP 协议的网络诊断工具,用于主机之间的连通性和网络延迟。

Ping 命令通过发送 ICMP ECHO_REQUEST 数据包到目标主机,并等待目标主机返回ICMP ECHO_REPLY 数据包来网络连接状态。

本文将介绍 Ping 程序的设计原理和实现方式。

2. 设计原理Ping 程序的设计原理可以分为两个部分:数据包的发送和接收。

2.1 数据包的发送当用户在终端输入 `ping 目标主机地质` 命令后,Ping 程序需要解析用户输入的目标主机地质,获取目标主机的 IP 地质。

然后,Ping 程序构造一个 ICMP ECHO_REQUEST 数据包,并将其发送到目标主机的 IP 地质。

在构造 ICMP ECHO_REQUEST 数据包时,Ping 程序需要设置相应的字段,包括类型、代码、校验和等。

其中,类型字段用于指定数据包类型为请求报文,代码字段一般设置为 0,校验和字段用于验证数据包完整性。

发送 ICMP ECHO_REQUEST 数据包时,Ping 程序需要调用底层的网络库,将数据包发送到目标主机的 IP 地质。

发送数据包后,Ping 程序等待目标主机返回 ICMP ECHO_REPLY 数据包。

2.2 数据包的接收Ping 程序在发送 ICMP ECHO_REQUEST 数据包后,会进入接收状态,等待目标主机返回 ICMP ECHO_REPLY 数据包。

当 Ping 程序接收到目标主机返回的 ICMP ECHO_REPLY 数据包时,会计算网络延迟,并将结果显示在终端上。

在接收 ICMP ECHO_REPLY 数据包时,Ping 程序需要调用底层的网络库,监听网络接口,等待数据包的到达。

当接收到 ICMP ECHO_REPLY 数据包时,Ping 程序需要校验数据包的完整性,并提取出其中的字段,包括类型、代码、校验和等。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

设计报告课程计算机网络设计名称《ping命令的设计与实现》专业班级计科094 同组人姓名同组人学号实验日期2013-04-10 指导教师成绩2013 年 04 月 10 日设计目的和要求1、实验目的:Ping命令向目的主机发送ICMP ECHO—REQUEST请求并接收目的主机返回的响应报文,用来检验本地主机和远程的主机是否连接。

2.实验要求:利用ICMP数据包,测试主机的连通性,通过课程设计,使学生熟悉ICMP报文结构,使学生对ICMP有更深的理解。

要求:输出参考系统自带ping程序,命令行运行:ping ip二、设计说明设计分析:使用原始套接字可以读写ICMP分组,利用原始套接字发送ICMP回显请求,并接收ICMP 回显应答,通过icmp_send()发送ICMP回显示请求包,icmp_recv()接收ping目的主机的回复,并使用终端信号处理函数SIGINT处理信号,建立两个线程,一个用于发送数据,另一个用于接收响应数据,主程序等待两个线程运行完毕后再进行下一步动作。

最后,主程序讲发送数据和接收的数据进行统计,并将结果打印出来。

系统运行环境:虚拟机:Fedora14(linux操作系统) gcc设计中的重点和难点:ICMP数据包的打包和解包,以及从CRC16校验算法的分析实现输入和输出条件:在linux系统下运行ping 在出现4个响应包后按Ctrl+c键停止发送。

三、系统详细设计《Ping命令的设计与实现》Ping命令向目的主机发送ICMP ECHO—REQUEST请求并接收目的主机返回的响应报文,用来检验本地主机和远程的主机是否连接。

协议格式图1.1中已经对ICMP协议的报文格式进行了说明。

Ping 的客户端方式的类型为8,代码值为0,表示ICMP的回显请求。

类型为0,代码为0是,是ICMP回显应答。

检验和为16为的crc16 的算法。

0 7 8 15 16 31图1.1 ICMP报文的数据格式图1.2所示为ping所使用的类型和代码格式。

包含16位的标始符和16为的序列号。

序列号是用于标识发送或者响应的序号,而标示符通常用于表明发送和接收此报的用户,一眼用进程的PID来识别。

图1.2 ping的数据格式例如一个用户的进程PID为1000,发送了一个序列号为1的回显请求报文,当此报文被目的主机正确处理并返回后,可以用PID来识别是否为当前的用户,并且用序列号来识别哪个报文被返回,通过发送报文到目的主机并接受响应,可以计算发送和接收二者之间的时间差,来判断网络的状况。

如图1.3所示,ping程序一般按照图中的框架进行设计。

主要分为发送数据和接收数据及计算时间差。

发送数据对组织好的数据进行发送,接收数据从网络上接收数据并判断其合法性,例如判断是否本进程发出的报文等。

图1.3 ping程序的基本框架由于ICMP必须使用原始套接字进行设计,要手动设置IP的头部和ICMP的头部并进行校验。

校验和函数TCP/IP 协议栈使用的校验算法是比较经典的,对16为的数据进行累加计算,并返回计算结果。

需要注意的是对奇数个字节数据的计算,是将最后的有效数据作为最高位的字节,低字节填充了0。

设置IP发送报文的头部ip头部格式:设置ICMP发送报文的头部对于回显请求的ICMP报文,下面是ICMP结构简化形式:即仅包含消息类型、消息代码、校验和、数据报的ID、数据报的序列号即ICMP数据段几个部分。

校验和的值在计算之前其他的值应该先进行填充,而校验和也需要设置为0来占位,然后在计算真正的校验和值。

ICMP回显得数据部分可以任意设置,但是以太网包的总长度不能小于以太网的最小值,即总长度不能小于46,由于IP头部为20字节,ICMP头部为8个字节,以太网头部占用14个字节,因此ICMP回显包的最小值为46-20-8-14=4个字节。

ICMP回显请求的类型为8,即ICMP-ECHO。

ICMP回显请求的代码值为0.ICMP回显请求的序列号是一个16位的值,通常由一个递增的值生成。

ICMP回显请求的ID用于区别,通常用进程的PID填充。

进行ICMP头部校验的代码如下:⏹剥离ICMP接受报文的头部函数icmp_unpack()用于剥离IP头部,分析ICMP头部的值。

判断是否为正确的ICMP 报文,并打印结果。

参数buf为剥去了以太网部分数据的IP数据报文,len为数据长度。

可以利用IP头部的参数快速地跳ICMP报文部分,IP结构的ip_hl标识IP头部的长度,由于ip_hl标识的是4字节单位,所以需要乘以4来获得ICMP段的地址。

获得ICMP数据段后,判断其类型是否为ICMP_ECHOREPL Y,并核实其标识是否为本进程的PID。

由于需要判断数据报文的往返时间,在本程序中需要先查找这个包发送时的时间,与当前时间进行计算后,可以得出本地主机与目标主机之间网络ICMP回显报文的差值。

程序需要累加成功接收到的报文用于程序退出时的统计。

函数的返回值为-1时表示褚翠,其他值则正常。

⏹计算时间差由于需要评估网络状况,在发送数据报文的时候保存发送时间,接收到报文后,计算两个时刻之间的差值,生成了ICMP源主机和目标主机之间的网络状况的时间评估。

⏹发送报文发送报文函数是一个线程,每隔1s向目的主机发送一个ICMP回显请求报文,它在整个程序处于激活状态(alive为1)是一直发送报文。

(1)获得当前的时间值,按照序列号packet_send将ICMP报文打包到缓冲区send_buff 中后,发送到目的地址。

发送成功后,记录发送报文的状态:序号seq 为packet_send。

标志flag为1,表示已经发送但是没有收到响应。

发送时间为之前获得的时间。

(2)每次发送成功后序号值会增加1,即packet_send++.(3)在线程开始进入主循环while(alive)之前,将整个程序的开始发送时间记录下来,用于在程序退出的时候进行全局统计,即gettimeofday(&tv_begin, NULL),j将时间保存在变量tv_begin 中。

接收报文与发送函数一样,接收报文也用一个线程实现,使用select()轮询等待报文到来。

当接收到一个报文后使用函数icmp_unpack()来解包和查找报文之前发送时的记录,获取发送时间,计算收发差值并打印信息。

(1)接收成功后将合法的报文记录重置为没有使用,flag为0.。

(2)接收报文数量增加1.(3)为了防止丢包,select()轮询时间设置的比较短。

⏹主函数过程Ping程序的实现使用了两个线程,一个线程icmp_send()用于发送请求,一个线程icmp_recv()用于接收远程主机的响应。

当变量alive为0时,两个线程退出。

1.ping数据的数据结构类型为结构struct pingm_packet的变量pingpacket用于保存发送数据报文的状态:tv_begin 用于保存发送的时间。

tv_end 用于保存数据报文接收到的时间。

seq是序列号,用于标识报文,作为索引。

flag用于表示本单元的状态,1表示数据报文已经发送,但是没有收到回应包;0表示已经接收到回应报文,这个单元可以再次用于标识发送的报文。

2. SIGINT处理函数本程序借去了信号SIGINT,用函数icmp_sigint() 对SIGINT进行处理。

当用户按下Ctrl+C键时,将alive设置为0,使得接收和发送两个线程退出,并计算结束时的时间。

代码如下:3 . 查找数组中的标示函数icmp_findpacket()函数icmp_findpacket()用于在数组pingpacket中查找一个报文的标识,参数为-1时表示查找一个空包,存放已经发送成功的数据报文;其他值表示查找seq匹配的标识。

4.统计数据结果函数icmp_statistics()icmp_statistics()函数用于统计总体的结果,包含成功发送的报文数量、成功接收的报文数量、丢失报文的百分比和总共程序运行的时间。

主函数 main()在程序中需要注意如下几点:使用getprotobyname ()函数获得icmp 对应的ICMP 协议值。

对输入的目的主机地址兼容域名和IP 地址,使用gethostbyname()函数获得DNS 对应的IP 地址,inet_addr()函数获得字符串类型的IP 地址对应的整型值。

为了防止远程主机发送过大的包或者本地来不及接收现象的发生,setsockopt(rawsock, 、SOL_SOCKET 、SO_RCVBUF 、&size 、sizeof(size)函数将socket 的接收缓冲区设置为128KB 。

对信号SIGINT 进行了截取。

建立两个线程icmp_send()和icmp_recv()进行接收和发送,然后主程序等待两个线程结束。

1主函数初始化一些必须的头文件、函数的声明及全局变量的声明放在这里。

2.进行数据报文发送之前的准备工作主要包含获得目的主机的IP地址、构建原始套接字、初始化缓冲区和变量等工作、这些工作里面还包含接收缓冲区的修改,防止返回数据过大造成数据缓冲区溢出。

在本段代码里使用了getprotobyname()函数来获得ICMP协议的类型,而不用用户记忆协议的具体类型,只要记住名称就可以了。

3发送数据并接受回应建立两个线程,一个用于发送数据,另一个用于接收响应数据。

主程序等待两个线程运行完毕后再进行下一步动作。

最后,主程序将发送的数据和接收的数据进行统计,并将结果打印出来。

编译测试将所有的代码保存到文件ping.c中,使用如下命令方式进行编译,生成可执行文件ping。

运行程序myping,对本机地址进行测试,在出现4个响应后按下Ctrl+C键,结果如下:总结:在这次课程设计中通过对ping命令的分析和实现,对TCP/IP协议的了解认识,同时对网路的一些工作原理以及协议内部结构有了进一步了解。

通过调试程序,运行结果,在此过程中我们也遇到许多困难和阻碍,但是在小组成员的一致努力下,一起查阅相关资料,一起讨论分析,在老师的协助指导下最终解决了这些困难,完成了程序预期的功能。

虽然本程序不尽完善,但通过这次课程设计,使我们收获很多,我们了解到Ping命令的实现过程,对网络知识有了进一步的理解。

加强了动手能力,独立思考能力,解决问题的能力等。

相关文档
最新文档