报文编程实现发送icmp协议详情大数据包

数据包mtu  时间:2021-04-19  阅读:()

实用文档

ICMP原理与代码及分析

专业

班级

学号

姓名

标准文案

一、 ICMP协议简介

ICMP全称Internet Control Message Protocol  中文名为因特网控制报文协议。它工作在 OSI的网络层向数据通讯中的源主机报告错误。 ICMP可以实现故障隔离和故障恢复。 网络本身是不可靠的在网络传输过程中可能会发生许多突发事件并导致数据传输失败。 网络层的 IP协议是一个无连接的协议它不会处理网络层传输中的故障而位于网络层的 ICMP协议却恰好弥补了 IP的缺限它使用 IP协议进行信息传递 向数据包中的源端节点提供发生在网络层的错误信息反馈。 ICMP的报头长 8字节结构如图 1所示。

比特0 7 8 15 16 比特31

图 1 ICMP报头结构

类型标识生成的错误报文它是 ICMP报文中的第一个字段

代码进一步地限定生成 ICMP报文。该字段用来查找产生错误的原因

校验和存储了 ICMP所使用的校验和值。

未使用保留字段供将来使用起值设为 0

数据包含了所有接受到的数据报的 IP报头。还包含 IP数据报中前 8个字节的数据

ICMP协议提供的诊断报文类型如表 1所示。

表1 ICMP诊断报文类型

ICMP提供多种类型的消息为源端节点提供网络层的故障信息反馈它的报文类型可以归纳为以下 5个大类

诊断报文类型 8代码0类型0代码0 

目的不可达报文类型 3代码0-15  

重定向报文类型 5代码0-4 

超时报文类型 1 1 代码0-1  

信息报文类型 12-18  。

二、编程实现发送 ICMP协议数据包

代码功能实现发送 ICMP协议数据包从而实现 DOS下ping命令功能。

1 .代码简要分析

代码执行步骤

 1  创建协议类型为 IPPROTO_ICMP的原始套接字设置套接字的属性。

2 创建并初始化ICMP封包。

3 调用sendto函数向远程主机发送 ICMP的请求。

4 调用recvfrom函数接受I CM P响应。

初始化ICMP头时先初始化消息的类型和代码域 之后应该是回显请求头。 程序首先定义了 ICMP头的数据结构 ICMP_HDR。typedef struct icmp_hdr

{unsigned char icmp_type; // 消息类型unsigned char icmp_code; //代码unsigned short icmp_checksum; //校验和

//下面是回显头unsigned short icmp_id; //用来惟一标识此请求的 ID号通常设置为进程 IDunsigned short icmp_sequence; //序列号unsigned long icmp_timestamp; // 时间戳

} ICMP_HDR, *PICMP_HDR;

2.完整代码及解析

#include". ./common/initsock.h"

#include". ./common/protoinfo.h"

#include". ./common/comm.h"

#include<stdio.h>

CInitSock theSock;typedef struct icmp_hdr

{unsigned char icmp_type; // 消息类型unsigned char icmp_code; //代码unsigned short icmp_checksum; //校验和

//下面是回显头unsigned short icmp_id; //用来惟一标识此请求的 ID号通常设置为进程 IDunsigned short icmp_sequence; //序列号unsigned long icmp_timestamp; // 时间戳

} ICMP_HDR, *PICMP_HDR;int main()

{

// 目的IP地址 即要Ping的IP地址char szDestIp[]="192.168.1 .104"; // 127.0.0.1

// 创建原始套节字

// 设置接收超时

SetTimeout(sRaw, 1000,TRUE);

// 设置目的地址

SOCKADDR_IN dest;dest.sin_fami ly=AF_I NET;dest.sin_port=htons(0);dest.sin_addr .S_un.S_addr=inet_addr(szDestIp);

// 创建ICMP封包char buff[sizeof(ICMP_HDR)+32];

ICMP_HDR*pIcmp=(ICMP_HDR*)buff;

// 填写ICMP封包数据pIcmp->icmp_type=8; //请求一个 ICMP回显pIcmp->icmp_code=0;pIcmp->icmp_id=(USHORT): :GetCurrentProcessId();pIcmp->icmp_checksum=0;pIcmp->icmp_sequence=0;

// 填充数据部分可以为任意memset(&buff[sizeof(ICMP_HDR)], 'E',32);

// 开始发送和接收 ICMP封包

USHORT nSeq=0;char recvBuf[1024];

SOCKADDR_IN from;int nLen=sizeof(from);whi le(TRUE)

{static int nCount=0;int nRet;if(nCount++==4)break;pIcmp->icmp_checksum=0;pIcmp->icmp_timestamp=: :GetTickCount();pIcmp->icmp_sequence=nSeq++;pIcmp->icmp_checksum=checksum((USHORT*)buff, sizeof(ICMP_HDR)+32);nRet=: :sendto(sRaw,buff,sizeof(ICMP_HDR)+32,0, (SOCKADDR*)&dest,sizeof(dest));if(nRet==SOCKET_ERROR)

{printf("sendto() fai led:%d\n", : :WSAGetLastError());return-1;

}

n Ret=: :recvfrom(sRaw, recvBuf, 1024, 0, (sockaddr*)&from,&nLe n);if(nRet==SOCKET_ERROR)

{if(: :WSAGetLastError()==WSAETI M EDOUT)

{printf(" timed out\n");conti nue;

}printf(" recvfrom() fai led:%d\n", : :WSAGetLastError());return-1;

}

// 下面开始解析接收到的 ICMP封包int nTick=: :GetTickCount();if(nRet<sizeof(I PHeader)+sizeof(ICMP_HDR))

{printf("Too few bytes from%s\n", : : inet_ntoa(from.sin_addr));

}

//接收到的数据中包含 IP头 IP头大小为 20个字节所以加 20得到ICMP头

ICMP_HDR* pRecvIcmp =(ICM P_HDR*)(recvBuf +

20); //(ICM P_HDR*)(recvBuf +sizeof(IPHeader));if(pRecvIcmp->icmp_type!=0) // 回显

{printf("nonecho type%d recvd\n", pRecvIcmp->icmp_type);return-1;

}if(pRecvIcmp->icmp_id !=: :GetCurrentProcessId())

{printf("someone else's packet! \n");return-1;

}printf("%d bytes from%s:", nRet, inet_ntoa(from.sin_addr));printf(" icmp_seq=%d. ", pRecvIcmp->icmp_sequence);printf(" time:%d ms", nTick-pRecvIcmp->icmp_timestamp);printf(" \n");

: :Sleep(1000);

}return 0;

}

三、代码结果分析

运行代码结果 源地址 192.168.1 .101 目的地址 192.168.1 .104 

由图可以分析出代码实现功能与 ping命令功能类似。 即代码会构建一个固定格式的 ICMP请求数据包然后由 ICMP协议将这个数据包连同地址 “192.168.1 .104 ”一起交给IP层协议 IP层协议将以地址

“ 192.168.1 .104作为目”的地址本机IP地址192.168.1 .101作为源地址加上一些其他的控制信息构建一个IP数据包并想办法得到192.168.1.104的MAC地址物理地址这是数据链路层协议构

建数据链路层的传输单元 ——帧所必需的  以便交给数据链路层构建一个数据帧。关键就在这里 IP层协议通过机器 B的IP地址和自己的子网掩码 发现它跟自己属同一网络 就直接在本网络内查找这台机器的MAC,如果以前两机有过通信在 A机的ARP缓存表应该有 B机I P与其MAC的映射关系如果没有就发一个 ARP请求广播得到 B机的MAC,一并交给数据链路层。后者构建一个数据帧目的地址是IP层传过来的物理地址源地址则是本机的物理地址还要附加上一些控制信息依据以太网的介质访问规则将它们传送出去。

主机B收到这个数据帧后先检查它的目的地址并和本机的物理地址对比如符合则接收否则丢弃。接收后检查该数据帧将 IP数据包从帧中提取出来交给本机的 IP层协议。 同样 IP层检查后将有用的信息提取后交给 ICMP协议后者处理后马上构建一个 ICMP应答包发送给主机 A其过程和主机 A发送ICMP请求包到主机 B一模一样。

由wireshark 抓包我们可以更清楚的看到两者的相似处。

Wireshark抓到代码的数据包 源地址 192.168.1 .101 目的地址 192.168.1 .104 

旅途云(¥48 / 月),雅安高防4核4G、洛阳BGP 2核2G

公司成立于2007年,是国内领先的互联网业务平台服务提供商。公司专注为用户提供低价高性能云计算产品,致力于云计算应用的易用性开发,并引导云计算在国内普及。目前,旅途云公司研发以及运营云服务基础设施服务平台(IaaS),面向全球客户提供基于云计算的IT解决方案与客户服务,拥有丰富的国内BGP、双线高防、香港等优质的IDC资源。点击进入:旅途云官方网商家LOGO优惠方案:CPU内存硬盘带宽/流量/防御...

RackNerd:特价美国服务器促销,高配低价,美国多机房可选择,双E526**+AMD3700+NVMe

racknerd怎么样?racknerd今天发布了几款美国特价独立服务器的促销,本次商家主推高配置的服务器,各个配置给的都比较高,有Intel和AMD两种,硬盘也有NVMe和SSD等多咱组合可以选择,机房目前有夏洛特、洛杉矶、犹他州可以选择,性价比很高,有需要独服的朋友可以看看。点击进入:racknerd官方网站RackNerd暑假独服促销:CPU:双E5-2680v3 (24核心,48线程)内存...

提速啦香港独立物理服务器E3 16G 20M 5IP 299元

提速啦(www.tisula.com)是赣州王成璟网络科技有限公司旗下云服务器品牌,目前拥有在籍员工40人左右,社保在籍员工30人+,是正规的国内拥有IDC ICP ISP CDN 云牌照资质商家,2018-2021年连续4年获得CTG机房顶级金牌代理商荣誉 2021年赣州市于都县创业大赛三等奖,2020年于都电子商务示范企业,2021年于都县电子商务融合推广大使。资源优势介绍:Ceranetwo...

数据包mtu为你推荐
山东省高校教师培训管理系统南京医科大学合同管理系统联通版iphone4s联通版iPhone4s 用联通3G卡好还是移动的好重庆电信宽带管家中国电信10000管家用着怎么样啊??google图片搜索谁能教我怎么在手机用google的图片搜索啊!!!icloudiphone自己用icloud把iPhone抹掉了.激活却不是自己的id怎么破电信版iphone4s电信版iphone4s是买16gb的好还是32gb的好?google统计怎样获得google ga 统计代码杀毒软件免费下载2013排行榜杀毒软件排行榜2015有哪些?杀毒软件免费下载2013排行榜哪里有免费好用的杀毒软件
虚拟主机软件 成都主机租用 lnmp hostmaster zpanel 鲨鱼机 vmsnap3 512av php探针 国外网站代理服务器 hostker 免费吧 免费智能解析 网通服务器 路由跟踪 工信部icp备案查询 中国电信宽带测速 hdroad 上海联通 apachetomcat 更多