ping命令设计与实现.docx

上传人:M****1 文档编号:546405595 上传时间:2023-09-24 格式:DOCX 页数:21 大小:114.58KB
返回 下载 相关 举报
ping命令设计与实现.docx_第1页
第1页 / 共21页
ping命令设计与实现.docx_第2页
第2页 / 共21页
ping命令设计与实现.docx_第3页
第3页 / 共21页
ping命令设计与实现.docx_第4页
第4页 / 共21页
ping命令设计与实现.docx_第5页
第5页 / 共21页
点击查看更多>>
资源描述

《ping命令设计与实现.docx》由会员分享,可在线阅读,更多相关《ping命令设计与实现.docx(21页珍藏版)》请在金锄头文库上搜索。

1、ping命令设计与实现设计报告/21课程设计名称专业班级计算机网络ping命令的设计与实现计科094同组人姓名同组人学号实验日期2013-04-10指导教师成绩2013年04月10日设计目的和要求1、实验目的:Ping命令向目的主机发送ICMPECHOREQUEST央求并接收目的主机返回的响应报文,用来检验当地主机和远程的主机能否连接。2.实验要求:利用ICMP数据包,测试主机的连通性,经过课程设计,使学生熟习ICMP报文结构,使学生对ICMP有更深的理解。要求:输出参照系统自带ping程序,命令行运转:pingip二、设计说明设计解析:使用原始套接字可以读写ICMP分组,利用原始套接字发送I

2、CMP回显央求,并接收ICMP回显应答,经过icmp_send()发送ICMP回显示央求包,icmp_recv()接收ping目的主机的回复,并使用终端信号办理函数SIGINT办理信号,成立两个线程,一个用于发送数据,另一个用于接收响应数据,主程序等候两个线程运转达成后再进行下一步动作。最后,主程序讲发送数据和接收的数据进行统计,并将结果打印出来。系统运转环境:虚假机:Fedora14(linux操作系统)gcc设计中的要点和难点:ICMP数据包的打包和解包,以及从CRC16校验算法的解析实现输入和输出条件:在linux系统下运转ping在出现4个响应包后按Ctrl+c键停止发送。三、系统详细

3、设计Ping命令的设计与实现Ping命令向目的主机发送ICMPECHOREQUEST央求并接收目的主机返回的响应报文,用来检验当地主机和远程的主机能否连接。协议格式图1.1中已经对协议的报文格式进行了说明。代码值为0,表示ICMP的回显央求。种类为0,代码为为16为的crc16的算法。Ping的客户端方式的种类为8,0是,是ICMP回显应答。检验和078151631种类(8位)代码(8位)校验和(16位)此部分不一样的种类和代码格式不一样图1.1ICMP报文的数据格式图1.2所示为ping所使用的种类和代码格式。包含16位的标始符和16为的序列号。序列号是用于表记发送也许响应的序号,而标示符平

4、时用于表示发送和接收此报的用户,一眼用进度的PID来鉴别。078151631种类代码(0)校验和8或0)标示符序列符占位字节1.2ping的数据格式比方一个用户的进度PID为1000,发送了一个序列号为1的回显央求报文,当此报文被目的主机正确办理并返回后,可以用PID来鉴别能否为当前的用户,而且用序列号来鉴别哪个报文被返回,经过发送报文到目的主机并接受响应,可以计算发送和接收两者之间的时间差,来判断网络的情况。如图1.3所示,ping程序一般依照图中的框架进行设计。主要分为发送数据和接收数据及计算时间差。发送数据对组织好的数据进行发送,接收数据从网络上接收数据并判断其合法性,比方判断能否本进度

5、发出的报文等。开始设置发送数据接收数据计算机发送数据校解包判断正误发送数据计算时速差结束图 1.3ping程序的基本框架因为ICMP并进行校验。一定使用原始套接字进行设计,要手动设置IP的头部和ICMP的头部校验和函数TCP/IP协议栈使用的校验算法是比较经典的,回计算结果。需要注意的是对奇数个字节数据的计算,的字节,低字节填补了0。对16为的数据进行累加计算,并返是将最后的有效数据作为最高位/*CRC16校验和计算icmp_cksum参数:data:数据len:数据长度返回值:计算结果,short种类*/staticunsignedshorticmp_cksum(unsignedchar*d

6、ata,intlen)intsum=0;/*计算结果*/intodd=len&0x01;/*能否为奇数*/unsignedshort*value=(unsignedshort*)data;/*将数据依照2字节为单位累加起来*/while(len&0xfffe)sum+=*(unsignedshort*)data;data+=2;len-=2;/*判断能否为奇数个数据,若ICMP报头为奇数个字节,会剩下最后一字节。*/if(odd)unsignedshorttmp=(*data)16)+(sum&0xffff);sum+=(sum16);returnsum;设置IP发送报文的头部ip头部格式:s

7、tructip#if_BYTE_ORDER=_LITTLE_ENDIAN/*假如为小端*/gnedintip_v:4;/*版本*/#endif#if_BYTE_ORDER=_BIG_ENDIAN/*假如为大端*/unsignedintip_v:4;/*版本*/unsignedintip_hl:4;/*头部长度*/#endifu_int8_tip_tos;/*TOS,服务种类*/u_shortip_len;/*总长度*/u_shortip_id;/*表记值*/u_shortip_off;*段偏移值*/u_int8_tip_ttl;/*TTL,生计时间*/u_int8_tip_p;/*协议种类*/

8、u_shortip_sum;/*校验和*/structin_addrip_src,ip_dst;/*源地址和目的地址*/;设置ICMP发送报文的头部对于回显央求的ICMP报文,下边是ICMP结构简化形式:structicmpu_int8_ticmp_type;/*信息种类*/u_int8_ticmp_code;/*信息种类的子码*/u_int16_ticmp_cksum;/*校验和*/unionu_charih_pptr;/*ICMP_PARAMPROB*/structin_addrih_gwaddr;/*网关地址*/structih_idseq/*显示数据报*/u_int16_ticd_id

9、;/*数据报u_int16_ticd_seq;/*数据报的序号ih_idseq;icmp_hun;ID*/*/#define#defineicmp_idicmp_sequnionstructu_int8_tid_data1;/*数据*/icmp_dun;#defineicmp_dataicmp_dun.id_data;即仅包含信息种类、信息代码、校验和、数据报的ID、数据报的序列号即段几个部分。校验和的值在计算以前其余的值应该先进行填补,而校验和也需要设置为来占位,而后在计算真切的校验和值。ICMP数据0? ICMP回显得数据部分可以任意设置,但是以太网包的总长度不可以小于以太网的最小值,即总

10、长度不可以小于46,因为IP头部为20字节,ICMP头部为8个字节,以太网头部占用14个字节,所以ICMP回显包的最小值为46-20-8-14=4个字节。ICMP回显央求的种类为8,即ICMP-ECHO。ICMP回显央求的代码值为0.ICMP回显央求的序列号是一个16位的值,平时由一个递加的值生成。?进行ICMPICMP回显央求的ID用于差别,平时用进度的PID填补。头部校验的代码以下:/*设置ICMP报头*/staticvoidicmp_pack(structicmp*icmph,intseq,structtimeval*tv,intlength)unsignedchari=0;/*设置报头

11、*/icmph-icmp_type=ICMP_ECHO;icmph-icmp_code=0;icmph-icmp_cksum=0;/*ICMP/*code值为/*先将回显央求*/0*/cksum值填写0,便于以后的cksum计算*/icmph-icmp_seq=seq;icmph-icmp_id=pid&0xffff;/*本报的序列号*/*填写PID*/for(i=0;iicmp_datai=i;/*计算校验和*/icmph-icmp_cksum=icmp_cksum(unsignedchar*)icmph,length);剥离ICMP接受报文的头部函数icmp_unpack()用于剥离IP头

12、部,解析ICMP头部的值。判断能否为正确的报文,并打印结果。参数buf为剥去了以太网部分数据的IP数据报文,len为数据长度。可以利用的参数快速地跳ICMP报文部分,IP结构的ip_hl表记IP头部的长度,因为ip_hl4字节单位,所以需要乘以4来获取ICMP段的地址。ICMPIP头部表记的是获取ICMP数据段后,判断其种类能否为ICMP_ECHOREPLY,并核实其表记能否为本进度的PID。因为需要判断数据报文的来回时间,在本程序中需要先查找这个包发送时的时间,与当前时间进行计算后,可以得出当地主机与目标主机之间网络ICMP回显报文的差值。程序需要累加成功接收到的报文用于程序退出时的统计。/*解压接收到的包,并打印信息*/staticinticmp_unpack(char*buf,intlen)inti,iphdrlen;structip*ip=NULL;structicmp*icmp=NULL;intrtt;ip=(structip*)buf;iphdrlen=ip-ip_hl*4;icmp=(structicmp*)(buf+iphdrlen);len-=iphdrlen;if(lenicmp_type=ICMP_ECHOREPLY)&(icmp-icmp_id=pid)structtimevaltv_inte

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 大杂烩/其它

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号