欢迎来到天天文库
浏览记录
ID:39871841
大小:298.01 KB
页数:8页
时间:2019-07-13
《编程实现发送ICMP协议数据包》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、ICMP原理与代码及分析专业:班级:学号:姓名:ICMP协议简介ICMP全称InternetControlMessageProtocol,中文名为因特网控制报文协议。它工作在OSI的网络层,向数据通讯中的源主机报告错误。ICMP可以实现故障隔离和故障恢复。网络本身是不可靠的,在网络传输过程中,可能会发生许多突发事件并导致数据传输失败。网络层的IP协议是一个无连接的协议,它不会处理网络层传输中的故障,而位于网络层的ICMP协议却恰好弥补了IP的缺限,它使用IP协议进行信息传递,向数据包中的源端节点提供发生在网络层的错误信息反馈。ICM
2、P的报头长8字节,结构如图1所示。 比特0 7 8 1516 比特31类型(0或8)代码(0)检验和首部其余部分(未使用)数据(图1 ICMP报头结构)l类型:标识生成的错误报文,它是ICMP报文中的第一个字段;l代码:进一步地限定生成ICMP报文。该字段用来查找产生错误的原因;l校验和:存储了ICMP所使用的校验和值。l未使用:保留字段,供将来使用,起值设为0l数据:包含了所有接受到的数据报的IP报头。还包含IP数据报中前8个字节的数据;ICMP协议提供的诊断报文类型如表1所示。种类类型描述差错报文3目的端
3、不可达4源点抑制11超时12参数问题5改变路由查询报文8或0回显请求或应答13或14时间戳请求或应答17或18地址掩码请求或应答10或9路由询问和通告(表1 ICMP诊断报文类型)ICMP提供多种类型的消息为源端节点提供网络层的故障信息反馈,它的报文类型可以归纳为以下5个大类:l诊断报文(类型8,代码0;类型0,代码0);l目的不可达报文(类型3,代码0-15);l重定向报文(类型5,代码0-4);l超时报文(类型11,代码0-1);l信息报文(类型12-18)。二、编程实现发送ICMP协议数据包代码功能:实现发送ICMP协议数据包
4、,从而实现DOS下ping命令功能。1.代码简要分析代码执行步骤:(1)创建协议类型为IPPROTO_ICMP的原始套接字,设置套接字的属性。(2)创建并初始化ICMP封包。(3)调用sendto函数向远程主机发送ICMP的请求。(4)调用recvfrom函数接受ICMP响应。初始化ICMP头时先初始化消息的类型和代码域,之后应该是回显请求头。程序首先定义了ICMP头的数据结构ICMP_HDR。typedefstructicmp_hdr{unsignedcharicmp_type;//消息类型unsignedcharicmp_cod
5、e;//代码unsignedshorticmp_checksum;//校验和//下面是回显头unsignedshorticmp_id;//用来惟一标识此请求的ID号,通常设置为进程IDunsignedshorticmp_sequence;//序列号unsignedlongicmp_timestamp;//时间戳}ICMP_HDR,*PICMP_HDR;2.完整代码及解析#include"../common/initsock.h"#include"../common/protoinfo.h"#include"../common/com
6、m.h"#includeCInitSocktheSock;typedefstructicmp_hdr{unsignedcharicmp_type;//消息类型unsignedcharicmp_code;//代码unsignedshorticmp_checksum;//校验和//下面是回显头unsignedshorticmp_id;//用来惟一标识此请求的ID号,通常设置为进程IDunsignedshorticmp_sequence;//序列号unsignedlongicmp_timestamp;//时间戳}ICMP
7、_HDR,*PICMP_HDR;intmain(){//目的IP地址,即要Ping的IP地址charszDestIp[]="192.168.1.104";//127.0.0.1//创建原始套节字SOCKETsRaw=::socket(AF_INET,SOCK_RAW,IPPROTO_ICMP);//设置接收超时SetTimeout(sRaw,1000,TRUE);//设置目的地址SOCKADDR_INdest;dest.sin_family=AF_INET;dest.sin_port=htons(0);dest.sin_addr.S
8、_un.S_addr=inet_addr(szDestIp);//创建ICMP封包charbuff[sizeof(ICMP_HDR)+32];ICMP_HDR*pIcmp=(ICMP_HDR*)buff;//填写ICMP封包数据pIc
此文档下载收益归作者所有