欢迎来到天天文库
浏览记录
ID:957230
大小:199.00 KB
页数:21页
时间:2017-10-20
《ping命令的设计与实现》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、设计报告课程计算机网络设计名称《ping命令的设计与实现》专业班级计科094同组人姓名同组人学号实验日期2013-04-10指导教师成绩2013年04月10日设计目的和要求1、实验目的:Ping命令向目的主机发送ICMPECHO—REQUEST请求并接收目的主机返回的响应报文,用来检验本地主机和远程的主机是否连接。2.实验要求:利用ICMP数据包,测试主机的连通性,通过课程设计,使学生熟悉ICMP报文结构,使学生对ICMP有更深的理解。要求:输出参考系统自带ping程序,命令行运行:pingip二、设计说明
2、设计分析:使用原始套接字可以读写ICMP分组,利用原始套接字发送ICMP回显请求,并接收ICMP回显应答,通过icmp_send()发送ICMP回显示请求包,icmp_recv()接收ping目的主机的回复,并使用终端信号处理函数SIGINT处理信号,建立两个线程,一个用于发送数据,另一个用于接收响应数据,主程序等待两个线程运行完毕后再进行下一步动作。最后,主程序讲发送数据和接收的数据进行统计,并将结果打印出来。系统运行环境:虚拟机:Fedora14(linux操作系统)gcc设计中的重点和难点:ICMP数
3、据包的打包和解包,以及从CRC16校验算法的分析实现输入和输出条件:在linux系统下运行ping在出现4个响应包后按Ctrl+c键停止发送。三、系统详细设计《Ping命令的设计与实现》Ping命令向目的主机发送ICMPECHO—REQUEST请求并接收目的主机返回的响应报文,用来检验本地主机和远程的主机是否连接。n协议格式图1.1中已经对ICMP协议的报文格式进行了说明。Ping的客户端方式的类型为8,代码值为0,表示ICMP的回显请求。类型为0,代码为0是,是ICMP回显应答。检验和为16为的crc16
4、的算法。078151631类型(8位)代码(8位)校验和(16位)此部分不同的类型和代码格式不同图1.1ICMP报文的数据格式图1.2所示为ping所使用的类型和代码格式。包含16位的标始符和16为的序列号。序列号是用于标识发送或者响应的序号,而标示符通常用于表明发送和接收此报的用户,一眼用进程的PID来识别。078151631类型(8或0)代码(0)校验和标示符序列符占位字节图1.2ping的数据格式例如一个用户的进程PID为1000,发送了一个序列号为1的回显请求报文,当此报文被目的主机正确处理并返回后
5、,可以用PID来识别是否为当前的用户,并且用序列号来识别哪个报文被返回,通过发送报文到目的主机并接受响应,可以计算发送和接收二者之间的时间差,来判断网络的状况。如图1.3所示,ping程序一般按照图中的框架进行设计。主要分为发送数据和接收数据及计算时间差。发送数据对组织好的数据进行发送,接收数据从网络上接收数据并判断其合法性,例如判断是否本进程发出的报文等。开始设置发送数据计算机发送数据校验和发送数据接收数据计算时速差解包判断正误结束图1.3ping程序的基本框架由于ICMP必须使用原始套接字进行设计,要手
6、动设置IP的头部和ICMP的头部并进行校验。n校验和函数TCP/IP协议栈使用的校验算法是比较经典的,对16为的数据进行累加计算,并返回计算结果。需要注意的是对奇数个字节数据的计算,是将最后的有效数据作为最高位的字节,低字节填充了0。/*CRC16校验和计算icmp_cksum参数:data:数据len:数据长度返回值:计算结果,short类型*/staticunsignedshorticmp_cksum(unsignedchar*data,intlen){intsum=0;/*计算结果*/intodd=l
7、en&0x01;/*是否为奇数*/unsignedshort*value=(unsignedshort*)data;/*将数据按照2字节为单位累加起来*/while(len&0xfffe){sum+=*(unsignedshort*)data;data+=2;len-=2;}/*判断是否为奇数个数据,若ICMP报头为奇数个字节,会剩下最后一字节。*/if(odd){unsignedshorttmp=((*data)<<8)&0xff00;sum+=tmp;}sum=(sum>>16)+(sum&0xffff
8、);sum+=(sum>>16);return~sum;}n设置IP发送报文的头部ip头部格式:structip{#if__BYTE_ORDER==__LITTLE_ENDIAN/*如果为小端*/gnedintip_v:4;/*版本*/#endif#if__BYTE_ORDER==__BIG_ENDIAN/*如果为大端*/unsignedintip_v:4;/*版本*/unsignedintip_hl:4;/*头
此文档下载收益归作者所有