版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、实验:ICMP协议的分析与实现实验目的 分析ICMP报文,理解ICMP协议在Internet网中的具体应用及其实现原理,深入了解TCP/IP网络的容错控制;学会运用网络套接字Winsock开发网络通信程序。实验内容 使用Visual Studio C+ 6.0和网络接口套接字Socket进行Windows环境下的网络编程,运用原始嵌套字RAW_SOCKET从IP层开始构造整个ICMP报文,通过ICMP协议所提供的回送请求(echo request)和回送应答(echo reply)这两种报文实现检测目的站的可达性与状态。1IP报头、ICMP报文的基本描述 IP协议并不能保证绝对的可靠,所以就设
2、计了ICMP协议,进行差错报告. ICMP 消息使用IP头作为基本控制.IP头的格式如下:0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |Version| IHL |Type of Service| Total Length | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Id
3、entification |Flags| Fragment Offset | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Time to Live | Protocol | Header Checksum | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Source Address | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
4、+ | Destination Address | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ Version=4 IHL Internet头长 Type of Service = 0 Total Length IP包的总长度 Identification, Flags, Fragment Offset 用于IP包分段 Time to Live IP包的存活时长 Protocol ICMP = 1 Header Checksum 头校验和(检查整个IP报头) Addresses 发送Echo消息的源地址是发
5、送Echo reply消息的目的地址,相反,发送Echo 消息的目的地址是发送Echo reply消息的源地址.Echo 或 Echo Reply 消息格式如下: 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Type | Code | Checksum | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
6、-+-+-+-+-+-+ | Identifier | Sequence Number | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Data | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+Type echo消息的类型为8 echo reply 的消息类型为0.Code=0Checksum为从TYPE开始到IP包结束的校验和,也就是校验整个ICMP报文Identifier 如果 code = 0, identifi
7、er用来匹配echo和echo reply消息Sequence Number 如果 code = 0, identifier用来匹配echo和echo reply消息功能描述:收到echo 消息必须回应 echo reply 消息. identifier 和 sequence number 可能被发送echo的主机用来匹配返回的echo reply消息.例如: identifier 可能用于类似于TCP或UDP的 port用来标示一个会话, 而sequence number 会在每次发送echo请求后递增. 收到echo的主机或路由器返回同一个值与之匹配2 数据结构(1)IP报头格式/定义IP
8、首部 typedef struct _iphdrunsigned char h_lenver; /4 位IP版本号+4位首部长度unsigned char tos; /8位服务类型TOSunsigned short total_len; /16位IP包总长度(字节)unsigned short ident; /1 6位标识, 用于辅助IP包的拆装,本实验不用,置零unsigned short frag_and_flags; /3位标志位+13位偏移位, 也是用于IP包的拆装,本实验不用,置零unsigned char ttl; /8位IP包生存时间 TTLunsigned char proto
9、; /8位协议 (TCP, UDP 或其他), 本实验置ICMP,置为1unsigned short checksum; /16位IP首部校验和,最初置零,等所有包头都填写正确后,计算并替换.unsigned int sourceIP; /32位源IP地址unsigned int destIP; /32位目的IP地址IP_HEADER;(2)ICMP报头格式/定义ICMP首部typedef struct _icmphdrunsigned char i_type; /8位类型, 本实验用 8: ECHO 0:ECHO REPLYunsigned char i_code; /8位代码, 本实验置零
10、unsigned short i_cksum; /16位校验和, 从TYPE开始,直到最后一位用户数据,如果为字节数为奇数则补充一位unsigned short i_id ; /识别号(一般用进程号作为识别号), 用于匹配ECHO和ECHO REPLY包unsigned short i_seq ; /报文序列号, 用于标记ECHO报文顺序unsigned int timestamp; /时间戳ICMP_HEADER;3 总体设计ICMP协议中的发送、接收ICMP回送请求报文,回送应答报文流程图。数据包太短?不是回送响?应?ID不符合?输出数据报中的IP地址填充ICMP数据报发送数据报接受数据报
11、去掉IP报头,获取ICMP信息结束yyNNN开 始4VC中网络套接字Winsock编程基础在VC中进行WINSOCK的API编程开发的时候,需要在项目中使用下面三个文件,否则会出现编译错误。1WINSOCK.H: 这是WINSOCK API的头文件,需要包含在项目中。2WSOCK32.LIB: WINSOCK API连接库文件。在使用中,一定要把它作为项目的非缺省的连接库包含到项目文件中去。3WINSOCK.DLL: WINSOCK的动态连接库,位于WINDOWS的安装目录下。几个基本的套接字:1、 创建套接字socket() 功能:使用前创建一个新的套接字格式:SOCKET PASCAL F
12、AR 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()调用返回的并且未作连接的套接字描述符(套接字号)。其它:没有错误,bind()返回0,否则SOCKET_ERROR地址结构说明:struct sockaddr_ins
13、hort sin_family;/AF_INETu_short sin_port;/16位端口号,网络字节顺序struct in_addr sin_addr;/32位IP地址,网络字节顺序char sin_zero8;/保留3 建立套接字连接connect()和accept()功能:共同完成连接工作格式:int PASCAL FAR connect(SOCKET s,const struct sockaddr FAR * name,int namelen);SOCKET PASCAL FAR accept(SOCKET s,struct sockaddr FAR * name,int FAR
14、* addrlen);参数:同上4、监听连接listen()功能:用于面向连接服务器,表明它愿意接收连接。格式:int PASCAL FAR listen(SOCKET s, int backlog);5、数据传输send()与recv()功能:数据的发送与接收格式:int PASCAL FAR send(SOCKET s,const char FAR * buf,int len,int flags);int PASCAL FAR recv(SOCKET s,const char FAR * buf,int len,int flags);参数:buf:指向存有传输数据的缓冲区的指针。 6、多路
15、复用select()功能:用来检测一个或多个套接字状态。格式:int PASCAL FAR select(int nfds,fd_set FAR * readfds,fd_set FAR * writefds, fd_set FAR * exceptfds,const struct timeval FAR * timeout);参数:readfds:指向要做读检测的指针writefds:指向要做写检测的指针exceptfds:指向要检测是否出错的指针timeout:最大等待时间7、关闭套接字closesocket()功能:关闭套接字s格式:BOOL PASCAL FAR closesocket
16、(SOCKET s);5 部分程序代码/初始化SOCKETWSADATA wsaData;iErrorCode = WSAStartup(MAKEWORD(2,2),&wsaData);CheckSockError(iErrorCode, "WSAStartup");sockRaw = socket(AF_INET , SOCK_RAW , IPPROTO_ICMP); /原始套接字CheckSockError(sockRaw, "socket");/设置超时时间timeout = time;iErrorCode = setsockopt(soc
17、kRaw,SOL_SOCKET,SO_RCVTIMEO,(char*)&timeout,sizeof(timeout);/设置接受延时CheckSockError(iErrorCode, "SO_RCVTIMEO");timeout = time;iErrorCode = setsockopt(sockRaw,SOL_SOCKET,SO_SNDTIMEO,(char*)&timeout,sizeof(timeout);/设置发送延时CheckSockError(iErrorCode, "SO_SNDTIMEO");/获得目标主机IPmem
18、set(&dest,0,sizeof(dest);/初始化dest结构dest.sin_family = AF_INET; /填充SOCKADDR_IN结构内容if(dest.sin_addr.s_addr = inet_addr(lpdest) = INADDR_NONE)if(hp = gethostbyname(lpdest) != NULL) /目的主机名字不为空memcpy(&(dest.sin_addr),hp->h_addr_list0,hp->h_length);dest.sin_family = hp->h_addrtype;printf(&
19、quot;dest.sin_addr = %sn",inet_ntoa(dest.sin_addr);elseCheckSockError(SOCKET_ERROR, "gethostbyname()");/创建ICMP数据包datasize += sizeof(ICMP_HEADER); /包长icmp_data = (char *)malloc(1024); /创建icmp数据报内存空间recvbuf = (char *)malloc(1024); /接收icmp包缓冲区if(!icmp_data) | (!recvbuf)CheckSockError(SOC
20、KET_ERROR, "malloc()");memset(icmp_data,0,MAX_PACKET); /初始化icmp_dataFillICMPData(icmp_data,datasize); /填充icmp包printf("Pinging %s with %d bytes of data(timeout = %d ms):nn",inet_ntoa(dest.sin_addr),datasize,timeout );/发送与接收ICMP数据包while(1)memset(recvbuf,0,MAX_PACKET); /初始化接受缓冲区stat
21、ic int nCount = 0; /设置发送icmp包的次数,一般为4if(nCount+ =4) break;(ICMP_HEADER*)icmp_data)->i_cksum = 0; /初设校验和为0(ICMP_HEADER*)icmp_data)->timestamp = GetTickCount(); /获得目前时间(ICMP_HEADER*)icmp_data)->i_seq = seq_no+; /icmp数据报的序列号(ICMP_HEADER*)icmp_data)->i_cksum = checksum(USHORT*)icmp_data,data
22、size);/计算校验和iErrorCode = sendto(sockRaw,icmp_data,datasize,0,(struct sockaddr*)&dest,sizeof(dest);/发送icmp数据报if(iErrorCode = SOCKET_ERROR) /错误检查if(WSAGetLastError() = WSAETIMEDOUT)printf("timed outn");continue;CheckSockError(SOCKET_ERROR, "sendto()");if(iErrorCode < datasiz
23、e)printf("Wrote %d bytesn",iErrorCode);int fromlen = sizeof(from);/接受icmp包长度iErrorCode = recvfrom(sockRaw,recvbuf,MAX_PACKET,0,(struct sockaddr*)&from,&fromlen);/接受icmp包if(iErrorCode = SOCKET_ERROR)if(WSAGetLastError() = WSAETIMEDOUT)printf("timed outn");continue;CheckSoc
24、kError(SOCKET_ERROR, "recvfrom()");DecodeICMPHeader(recvbuf,iErrorCode,&from); /分解icmp包头Sleep(1000); /休眠一段时间/SOCK错误处理程序void CheckSockError(int iErrorCode, char *pErrorMsg)if(iErrorCode=SOCKET_ERROR)printf("%s Error:%dn", pErrorMsg, GetLastError();closesocket(sockRaw);ExitProc
25、ess(0);/填充数据void FillICMPData(char *icmp_data, int datasize)ICMP_HEADER *icmp_hdr = NULL;char *datapart = NULL;icmp_hdr = (ICMP_HEADER*)icmp_data;icmp_hdr->i_type = ICMP_ECHO; /发送ping/ Request an ICMP echoicmp_hdr->i_code = 0; /代码字段为0icmp_hdr->i_id = (USHORT)GetCurrentProcessId(); /获得当前进程号i
26、cmp_hdr->i_cksum = 0;icmp_hdr->i_seq = 0; /初始化序列号datapart = icmp_data + sizeof(ICMP_HEADER); /加上icmp包头/ Place some junk in the buffer/memset(datapart,'E', datasize - sizeof(ICMP_HEADER); /填充datapart/计算检验和USHORT checksum(USHORT *buffer, int size) unsigned long cksum=0;while (size > 1
27、) cksum += *buffer+;size -= sizeof(USHORT);if (size) cksum += *(UCHAR*)buffer;cksum = (cksum >> 16) + (cksum & 0xffff);cksum += (cksum >>16);return (USHORT)(cksum);/ICMP解包程序void DecodeICMPHeader(char *buf, int bytes, struct sockaddr_in *from)IP_HEADER *iphdr = NULL;ICMP_HEADER *icmphdr = NULL;unsigned short iphdrlen;DWORD tick;iphdr = (IP_HEADER *)buf;/ Number of 32-bit wor
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年吉林铁道职业技术学院单招职业技能考试题库及答案详解(网校专用)
- 2026年四川机电职业技术学院单招职业技能考试题库及一套完整答案详解
- 2026年四川应用技术职业学院单招职业适应性测试题库及一套答案详解
- 2026年哈尔滨电力职业技术学院单招职业倾向性测试题库含答案详解(研优卷)
- 2026年四川工商职业技术学院单招职业技能考试题库及答案详解1套
- 2026年四川护理职业学院单招职业技能考试题库含答案详解(典型题)
- 2026年吉林省经济管理干部学院单招职业技能测试题库带答案详解(轻巧夺冠)
- 2026年哈尔滨电力职业技术学院单招职业倾向性测试题库附参考答案详解(预热题)
- 2026年四川三河职业学院单招综合素质考试题库及答案详解(考点梳理)
- 2026年商丘学院单招职业技能考试题库含答案详解(培优b卷)
- 2025年南京旅游职业学院单招职业技能考试模拟测试卷带答案解析
- 2026年春季译林版八年级下册英语教学计划(含进度表)
- 急诊急救医保政策与费用控制
- KTV服务员流程(完整版)
- 职工医疗互助培训课件
- 北京市中钞印制技术研究院有限公司2026应届毕业生招聘4人笔试模拟试题及答案解析
- 2026年标准版离婚协议书(无财产)
- 铝厂化验室制度规范标准
- 2026年事业单位考试综合应用模拟题含答案
- 陕晋青宁四省2025-2026学年高三上学期(1月)第二次联考 历史试题及答案
- 2026年公安联考申论试题及答案
评论
0/150
提交评论