网络实验指导---ICMP协议的分析与实现_第1页
网络实验指导---ICMP协议的分析与实现_第2页
网络实验指导---ICMP协议的分析与实现_第3页
网络实验指导---ICMP协议的分析与实现_第4页
网络实验指导---ICMP协议的分析与实现_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、实验:icmp协议的分析与实现实验目的分析icmp报文,理解icmp协议在internet网屮的具体应用及其实现原理,深入了解tcp/ip网 络的容错控制;学会运用网络套接字winsock开发网络通信程序。实验内容使用visual studio 3+ 6.0和网络接口套接字socket进行windows环境下的网络编程,运用原始 嵌套字raw_socket从ip层开始构造整个icmp报文,通过icmp协议所提供的回送请求(echo request)和回送应答(echo reply)这两种报文实现检测目的站的可达性与状态。1. ip报头、icmp报文的基本描述1p协议并不能保证绝对的可靠,所以就

2、设计了 1cmp协议,进行差错报告.icmp消息使用ip头作为基本控制.ip头的格式如f:101234567890123456789012345678901idontification|flags|fragment offsettime to live | protocol |header checksum+一+一+一+一+一+一+一+一+一+一+一+一+一+一+一+一+一+一+一+一+一+一+一+一+一+一+一+一+一+一+一+一+source addressdost ination addressversion二4i hl internet 头长type of service = 0tot

3、al length ip包的总长度tdentification, flags, fragment offset 用于 tp 包分段time to live ip包的存活时长protocol icmp = 1header checksum头校验和(检查整个ip报头)addresses发送echo消息的源地址是发送echo reply消息的目的地址,相反,发送echo 消息的目的地址是发送echo reply消息的源地址.echo或echo reply消息格式如下:012301234567890123456789012345678901codechecksumtypeidentifierseque

4、nce numberdata2数据结构(1) ip报头格式 定义ip首部typedef structphdr unsigned char h_lenver; unsigned char tos; unsigned short total_len; unsigned short ident; unsigned short frag_and_flags; unsigned char ttl; unsigned char proto; unsigned short checksum; unsigned int sourcelp; unsigned int destip;ip_header;(2) i

5、cmp报头格式typeecho消息的类型为8echo reply的消息类型为0.code二0checksum为从type开始到tp包结束的校验和,也就是校验整个icmp报文identifier如果 code 二 0, identifier 用来匹配 echo 和 echo reply 消息sequence number如果 code = 0, identifier 用来匹配 echo 和 echo reply 消息 功能描述:收到echo消息必须回应echo reply消息.identifier和sequence number可能被发送echo的主机用来匹配返回的echo reply消息例如:

6、identifier 能用于类似于tcp或udp的port用 来标示一个会话,而sequence number会在每次发送echo请求示递增.收到echo的主机或路由器 返回同一个值与之匹配/4位ip版木号+4位首部长度/8位服务类型tos16位ip包总长度(字节)/i 6位标识,用于辅助ip包的拆装,木实验不用,置零3位标志位+13位偏移位,也是用于ip包的拆装,木实验不用,置零8位ip包生存吋间ttl8位协议(tcp,udp或其他),本实验置icmp,置为116位ip首部校验和,最初置零,等所有包头都填写正确后,计算并替换./32位源ip地址/32位目的ip地址定义icmp首部typede

7、f struct _icmphdr unsigned char i_type;/8位类型,木实验用& echo 0:echo replyunsigned char i_code;/8位代码,本实验置零unsigned short i_cksum;/16位校验和,从type开始,直到最后一位用户数据,如果为字节数 为奇数则补充一位unsigned short;识别号(一燉用进程号作为识别号),用于匹配echo和echoreply 包unsigned short i_seq ;报文序列号,用于标记echo报文顺序unsigned int timestamp;/时间戳icmp_header;

8、3总体设计icmp协议中的发送、接收icmp回送请求报文,回送应答报文流程图。填充icmp数据报发送数据报接受数据报去掉ip报头,获収1cmp信息输出数据报屮的ip地址结束4. vc中网络套接字winsock编程基础在vc中进行winsock的api编程开发的吋候,需耍在项目屮使用下面三个文件,否则会出现编译 错误。1. w1nsock.11:这是winsock api的头文件,需要包含在项目中。2. ws0ck32.l1b: winsock api连接库文件。在使用中,一定要把它作为项目的非缺省的连接库 包含到项目文件中去。3. winsock. dll: winsock的动态连接库,位于w

9、indows的安装目录下。儿个基本的套接字:1、创建套接字 socket ()功能:使用前创建一个新的套接字格式:socket pascal far socket (int af, int type, int procotol);参数:af:通信发牛的区域type:耍建立的套接字类型procotol:使用的特定协议2、指定本地地址bind()功能:将套接字地址与所创建的套接字号联系起來。格式:int pascal far bind (socket s, const struct sockaddr far * name, int namelen);参数:s:是由socket ()调用返回的并且未

10、作连接的套接字描述符(套接字号)。其它:没有错误,bind()返冋0,否则socket.error地址结构说明:struct sockaddr_inshort sin_family;/af_inetu short sin port; /16位端口号,网络字节顺序struct in addr sin addr ; /32位ip地址,网络字节顺序char sin_zero 8 ;/保留3 建立套接字连接connect ()和accept ()功能:共同完成连接工作格式:int pascal far connect (socket s, const struct sockaddr far * nam

11、e, int namelen);socket pascal far accept(socket s,struct sockaddr far * name,int far* addrlen);参数:同上4、监听连接listeno功能:用于面向连接服务器,表明它愿意接收连接。格式:int pascal far 1 isten (socket s, int backlog);5、数据传输send()与recv ()功能:数据的发送与接收格式:i nt pascal far send (socket s, const char far * buf, i nt 1 en, i nt fl ags); i

12、 nt pascal far recv (socket s, const char far * buf, i nt 1 en, i nt flags);参数:buf:指向存有传输数据的缓冲区的指针。6、多路复用select ()功能:用來检测一个或多个套接字状态。格式: wri tefds,i nt pascal far select (int nfds,fdset far * readfds,fdset far * fd_set far * exceptfds,const struct timeval far * timeout);参数:readfds :指向要做读检测的指针writefds

13、 :指向要做写检测的指针 exceptfds :指向要检测是否出错的指针 timeout:最大等待时间7、关闭套接字closesocket ()功能:关闭套接字s格式:bool pascal far closesocket (socket s);5部分程序代码/初始化socketwsadata wsadata;ierrorcode = wsastartup(makeword(2, 2), &wsadata);checksockerror (i errorcode, z,wsastartup");sockraw = socket (af_tnet , sock_raw , tp

14、proto_icmp); 原始套接字checksockerror(sockraw, "socket");/设置超时时间timeout = time;ierrorcode =setsockopt(sockraw, sol_socket, so_rcvt1meo, (char*)&timeout, sizeof (timeout) ;/设置接受延 时checksockerror(ierrorcode, “so rcvtimeo"); timeout = time;i errorcode =setsockopt(sockraw, sol_socket, so_s

15、ndt1meo, (char*)&timeout, sizeof (timeout) ;/设置发送延 吋checksockerror(ierrorcode, "so_sndtimeo");/获得目标主机ipmemset (&dest, 0, si zeof (dest) ;/初始化 dest 结构dest. sin_family = af_inet;/填充 sockaddr_in 结构内容if(dest. sin_addr. s_addr = inet_addr(lpdest) = inaddr_n0ne)if(hp = gethostbyname(lpde

16、st) != null) /目的主机名字不为空 memcpy(&(dest. sin addr), hp->h_addr_list0, hp->h_length); dest. sin_fandly = hp->h_addrtype;printf("dest. sin_addr = %sn", inet_ntoa(dest. sin_addr);elsechecksockerror (s0cket_err0r, ''gethostbyname () ”);创建icmp数据包datasize += sizeof (icmp_heade

17、r) ;/包长icmp_data = (char *)malloc (1024); 创建 icmp 数据报内存空间 recvbuf = (char *)malloc(1024);接收 icmp 包缓冲区if(!icmp data) | (!recvbuf)checksockerror (s0cket_err0r, "malloc ()0 ;memset (icmp data, 0, max packet) ;/初始化 icmp datafillicmpdata(icmp data, datasize) ;/填充 icmp 包printf("pinging %s with %

18、d bytes of data(timeout = %d ms):nn", inet_ntoa(dost. sin_addr), datasize, timeout );发送与接收icmp数据包wh i1e (1)memset (recvbuf, 0, max jacket);初始化接受缓冲区static int ncount二0;/设置发送icmp包的次数,一般为4if(ncount+ 二二4) break;(icmp_header*) icmp_data)->i_cksum = 0;/初设校验和为 0(icmp header*) icmp data)->timesta

19、mp = gettickcount () ;/获得目前时间(icmp header*) icmp data)->i seq = seq_ n()+;/icmp 数据报的序列号(tcmp header*)iemp data)->i_cksum =checksum(usiiort*) icmp_clata, datasize);/计算校验和ierrorcode = sendto(sockraw, icmp data, datasize, 0, (struct sockaddr*)&dest, sizeof (dest);发送 icmp 数据报if(ierrorcode = s0

20、cket_err0r)/错误检查if(wsagetlaslerror() = wsaet1med01t)printf (z,timed outn");continue;checksockerror(socket_error, "scndto()“);i f(ierrorcode < datasize)printf (/zwrote %d bytesn,z, ierrorcode);int from!en = sizeof (from) ;/接受 icmp 包长度ierrorcode = recvfrom(sockraw, recvbuf, max packet, 0,

21、 (struct sockaddr*)&from, &fromlen);/接受 icmp 包if(ierrorcode = s0cket_err0r)if(wsagetlasterror() = wsaetimedout)printf("timed outn);continue;checksockerror(socket error, "recvfrom()");decodelcmplleader (recvbuf, ierrorcode, &from) ;/分解 icmp 包头sleep(looo) ;/休眠一段时间/sock错误处理程序

22、void checksockerror(int ierrorcode, char perrormsg) i f(ierrorcode=socket error)printf(“s error:%dperrormsg, getlasterror(); closesocket(sockraw);exi tprocess (0);填充数据void fillicmpdata(char *icmp_data, int datasizc)tcmpjieader *icmp_hdr = null;char *datapart 二 null;icmp_hdr = (icmp_header*)i cmp_dat

23、a; icmp_hdr->i_type = tcmp echo;/发送 ping/ request an tcmp echoicmp_hdr->i_code = 0;/代码字段为 0icmp_hdr->i_id 二(ushort)getcurrentprocessid ();/获得当前进程号icmp_hdr->i_cksum = 0;ic叩_hdr->i_seq = 0;/初始化序列号datapart = icmp data + sizeof (icmp header) ;/加上 icmp 包头/ place some junk in the buffer/mem

24、set (datapart, ' e' , datasize - sizeof (icmp header) ;/填充 datapart计算检验和ushort checksum(ushort buffer, int size)unsigned long cksum二0;while (size > 1)cksum += *buffer+;size -= sizeof(ushort);if (size)cksum += *(uchar*)buffer;cksum = (cksum >> 16) + (cksum & oxffff);cksum + 二(cks

25、um »16); return (ushort) ccksum);/icmp解包程序void decodelcmpheader(char *buf, int bytes, struct sockaddr in *from)ip_header *iphdr = null;1cmpjieader *icmphdr = null;unsigned short iphdrlen;dword tick;iphdr = (ip header *)buf;/ number of 32-bit words * 4 二 bytesiphdrlen= sizeof (unsigned long) * (

26、iphdr->h_ 1 enver & oxf) ;/计算 ip 包头长度tick = gettickcount();if (bytes < iphdr ion + icmp_min) /数据报太短,丢弃printf("too few bytes from %snzz, inet_ntoa(from->sin_addr);icmphdr = (icmp_header*)(buf + iphdrlen);if (icmphdr->i_type != icmp_echoreply) /不是回送响应(ping应答),丢弃printf("nonecho

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论