发送icmpecho请求剖析.docx
《发送icmpecho请求剖析.docx》由会员分享,可在线阅读,更多相关《发送icmpecho请求剖析.docx(12页珍藏版)》请在冰点文库上搜索。
![发送icmpecho请求剖析.docx](https://file1.bingdoc.com/fileroot1/2023-8/3/5caf350b-039b-43f7-87af-05f5ecc1e45c/5caf350b-039b-43f7-87af-05f5ecc1e45c1.gif)
发送icmpecho请求剖析
题目:
发
送
icmp
echo
请
求
姓名:
学号
班号:
时间:
2016/11/16
计算机学院
时间:
2016/11/16
摘要
题目:
发送icmpecho请求
1、目
理解ICMP协议完成功能,了解ICMP报文格式,理解Ping程序工作原理。
2、要求
针对某个主机发送ICMPecho报文。
2、相关知识
ICMP报文分析
一.概述:
1. ICMP允许主机或路由报告差错情况和提供有关异常情况。
ICMP是因特网标准协议,但ICMP不是高层协议,而是IP层协议。
通常ICMP报文被IP层或更高层协议(TCP或UDP)使用。
一些ICMP报文把差错报文返回给用户进程。
2. ICMP报文作为IP层数据报数据,加上数据报首部,组成数据报发送出去。
3. ICMP报文种类有两种,即ICMP差错报告报文和ICMP询问报文。
二.ICMP报文格式
1. 类型:
占8位
2. 代码:
占8位
3. 检验和:
占16位
说明:
ICMP所有报文前4个字节都是一样,但是剩下其他字节则互不相同。
4. 其它字段都ICMP报文类型不同而不同。
1> ICMP报文前4个字节是统一格式,共有三个字段:
即类型,代码和检验和。
2> 8位类型和8位代码字段一起决定了ICMP报文类型。
类型8,代码0:
表示回显请求(ping请求)。
类型0,代码0:
表示回显应答(ping应答)
类型11,代码0:
超时
3>16位检验和字段:
包括数据在内整个ICMP数据包检验和;其计算方法和IP头部检验和计算方法一样。
ICMP报文具体分为查询报文和差错报文(对ICMP差错报文有时需要做特殊处理,因此要对其进行区分。
如:
对ICMP差错报文进行响应时,永远不会生成另一份ICMP差错报文,否则会出现死循环)
三.ICMP差错报文(56字节)
1. ICMP差错报告报文共有5种
1> 终点不可达:
终点不可达分为:
网络不可达,主机不可达,协议不可达,端口不可达,需要分片但DF比特已置为1,以及源路由失败等六种情况,其代码字段分别置为0至5。
当出现以上六种情况时就向源站发送终点不可达报文。
说明:
端口不可达:
UDP规则之一是:
如果收到UDP数据报而且目端口与某个正在使用进程不相符,那么UDP返回一个ICMP不可达报文。
2> 源站抑制:
当路由器或主机由于拥塞而丢弃数据报时,就向源站发送源站抑制报文,使源站知道应当将数据报发送速率放慢。
3> 时间超过:
当路由器收到生存时间为零数据报时,除丢弃该数据报外,还要向源站发送时间超过报文。
当目站在预先规定时间内不能收到一个数据报全部数据报片时,就将已收到数据报片都丢弃,并向源站发送时间超过报文。
4> 参数问题:
当路由器或目主机收到数据报首部中字段值不正确时,就丢弃该数据报,并向源站发送参数问题报文。
5> 改变路由(重定向)路由器将改变路由报文发送给主机,让主机知道下次应将数据报发送给另外路由器。
说明:
以下几种情况都不会导致产生ICMP差错报文
1>ICMP差错报文(但是,ICMP查询报文可能会产生ICMP差错报文)
2>目地址是广播地址或多播地址IP数据报
3>作为链路层广播数据报
4>不是IP分片第一片
5>源地址不是单个主机数据报。
即源地址不能为零地址、环回地址、广播地址或多播地址。
这些规则是为了防止过去允许ICMP差错报文对广播分组响应所带来广播风暴。
2.所有ICMP差错报告报文中数据字段都具有同样格式。
将收到需要进行差错报告IP数据报首部和数据字段前8个字节提取出来,作为ICMP报文数据字段。
再加上响应ICMP差错报告报文前8个字节,就构成了ICMP差错报告报文。
提取收到数据报数据字段前8个字节是为了得到运输层端口号(对于TCP和UDP)以及运输层报文发送序号(对于TCP)。
注:
一下情况不发送ICMP差错报告报文
四.ICMP询问报文(40字节)
1.ICMP询问报文有四种回送请求和回答,时间戳请求和回答,掩码地址请求和回答,以及路由器询问和通过。
1>ICMP回送请求报文是由主机或路由器向一个特定目主机发出询问。
收到此报文机器必须给源主机发送ICMP回送应答报文。
这种询问报文用来测试目站是否可达以及了解其有关状态。
2>ICMP时间戳请求允许系统向另一个系统查询当前时间。
该ICMP报文好处是它提供了毫秒级分辨率,而利用其他方法从别主机获取时间只能提供秒级分辨率。
请求端填写发起时间,然后发送报文。
应答系统收到请求报文时填写接收时间戳,在发送应答时填写发送时间戳。
大多数实现是把后面两个字段都设成相同值。
3>主机使用ICMP地址掩码请求报文可向子网掩码服务器得到某个接口地址掩码。
系统广播它ICMP请求报文。
ICMP报文中标识符和序列号字段由发送端任意选择设定,这些值在应答中将被返回,这样,发送端就可以把应答与请求进行匹配。
4>主机使用ICMP路由器询问和通过报文可了解连接在本网络上路由器是否正常工作。
主机将路由器询问报文进行广播(或多播)。
收到询问报文一个或几个路由器就使用路由器通过报文广播其路由选择信息
4、实现原理及流程图
实现原理:
//定义IP首部格式
typedefstruct_IPHeader{
u_charVIHL;//版本和首部长度
u_charToS;//服务类型
u_shortTotalLen;//总长度
u_shortID;//标识号
u_shortFrag_Flags;//片偏移量
u_charTTL;//生存时间
u_charProtocol;//协议
u_shortChecksum;//首部校验和
structin_addrSrcIP;//源IP地址
structin_addrDestIP;//目地址
}
IPHDR,*PIPHDR;
//定义ICMP首部格式
typedefstruct_ICMPHeader{
u_charType;//类型
u_charCode;//代码
u_shortChecksum;//首部校验和
u_shortID;//标识
u_shortSeq;//序列号
charData;//数据
}
ICMPHDR,*PICMPHDR;
//定义ICMP回应请求
typedefstruct_ECHOREQUEST{
ICMPHDRicmpHdr;
DWORDdwTime;
charcData[REQ_DATASIZE];
}
ECHOREQUEST,*PECHOREQUEST;
//定义ICMP回应答复
typedefstruct_ECHOREPLY{
IPHDRipHdr;
ECHOREQUESTechoRequest;
charcFiller[256];
}
ECHOREPLY,*PECHOREPLY;
//计算校验和
u_shortchecksum(u_short*buffer,intlen){
registerintnleft=len;
registeru_short*w=buffer;
registeru_shortanswer;
registerintsum=0;
//使用32位累加器,进行16位反馈计算
while(nleft>1){
sum+=*w++;
nleft-=2;
}
//补全奇数位
if(nleft==1){
u_shortu=0;
*(u_char*)(&u)=*(u_char*)w;
sum+=u;
}
//将反馈16位从高位移到低位
sum=(sum>>16)+(sum&0xffff);
sum+=(sum>>16);
answer=~sum;
return(answer);
}
//发送回应请求函数
intSendEchoRequest(SOCKETs,structsockaddr_in*lpstToAddr){
staticECHOREQUESTechoReq;
staticintnId=1;
staticintnSeq=1;
intnRet;
//填充回应请求消息
echoReq.icmpHdr.Type=ICMP_ECHOREQ;
echoReq.icmpHdr.Code=0;
echoReq.icmpHdr.Checksum=0;
echoReq.icmpHdr.ID=nId++;
echoReq.icmpHdr.Seq=nSeq++;
//填充要发送数据
for(nRet=0;nRetechoReq.cData[nRet]='1'+nRet;
}
//存储发送时间
echoReq.dwTime=timeGetTime();
//计算回应请求校验和
echoReq.icmpHdr.Checksum=checksum((u_short*)&echoReq,sizeof(ECHOREQUEST));
//发送回应请求
nRet=sendto(s,(LPSTR)&echoReq,sizeof(ECHOREQUEST),
0,(structsockaddr*)lpstToAddr,sizeof(SOCKADDR_IN));
if(nRet==SOCKET_ERROR){
printf("sendto()error:
%d\n",WSAGetLastError());
}
return(nRet);
}
流程图:
5、程序代码(以附件形式,编程环境:
visualstudio2015)
见SendICMP文件夹
6、运行结果与分析
在命令行中运行:
用wireshark抓包如下:
参考文献
Ping程序源代码