已阅读5页,还剩3页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
ICMP 原理与代码及分析 专业: 班级: 学号: 姓名: 一、一、ICMP 协议简介协议简介 ICMP 全称 Internet Control Message Protocol,中文名为因特网控制报文协议。它工作在 OSI 的网络层, 向数据通讯中的源主机报告错误。ICMP 可以实现故障隔离和故障恢复。网络本身是不可靠的,在网络传 输过程中,可能会发生许多突发事件并导致数据传输失败。网络层的 IP 协议是一个无连接的协议,它不 会处理网络层传输中的故障,而位于网络层的 ICMP 协议却恰好弥补了 IP 的缺限,它使用 IP 协议进行信 息传递,向数据包中的源端节点提供发生在网络层的错误信息反馈。ICMP 的报头长 8 字节,结构如图 1 所示。 比特 0 7 8 15 16 比特 31 类型(0 或 8)代码(0)检验和 首部其余部分(未使用) 数据 (图 1 ICMP 报头结构) 类型类型:标识生成的错误报文,它是 ICMP 报文中的第一个字段; 代码代码:进一步地限定生成 ICMP 报文。该字段用来查找产生错误的原因; 校验和校验和:存储了 ICMP 所使用的校验和值。 未使用未使用:保留字段,供将来使用,起值设为 0 数据数据:包含了所有接受到的数据报的 IP 报头。还包含 IP 数据报中前 8 个字节的数据; ICMP 协议提供的诊断报文类型如表 1 所示。 种类种类类型类型描述描述 3目的端不可达 4源点抑制 11超时 12参数问题 差错报文 5改变路由 8 或 0回显请求或应答 13 或 14时间戳请求或应答 17 或 18地址掩码请求或应答 查询报文 10 或 9路由询问和通告 (表 1 ICMP 诊断报文类型) ICMP 提供多种类型的消息为源端节点提供网络层的故障信息反馈,它的报文类型可以归纳为以下 5 个大 类: 诊断报文(类型 8,代码 0;类型 0,代码 0) ; 目的不可达报文(类型 3,代码 0-15) ; 重定向报文(类型 5,代码 0-4) ; 超时报文(类型 11,代码 0-1) ; 信息报文(类型 12-18) 。 二、编程实现发送二、编程实现发送 ICMP 协议数据包协议数据包 代码功能:实现发送 ICMP 协议数据包,从而实现 DOS 下 ping 命令功能。 1.代码简要分析代码简要分析 代码执行步骤: (1)创建协议类型为 IPPROTO_ICMP 的原始套接字,设置套接字的属性。 (2)创建并初始化 ICMP 封包。 (3)调用 sendto 函数向远程主机发送 ICMP 的请求。 (4)调用 recvfrom 函数接受 ICMP 响应。 初始化 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 号,通常设置为进程 ID unsigned 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 CInitSock theSock; typedef struct icmp_hdr unsigned char icmp_type;/ 消息类型 unsigned char icmp_code;/ 代码 unsigned short icmp_checksum;/ 校验和 / 下面是回显头 unsigned short icmp_id;/ 用来惟一标识此请求的 ID 号,通常设置为进程 ID unsigned 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 / 创建原始套节字 SOCKET sRaw = :socket(AF_INET, SOCK_RAW, IPPROTO_ICMP); / 设置接收超时 SetTimeout(sRaw, 1000, TRUE); / 设置目的地址 SOCKADDR_IN dest; dest.sin_family = AF_INET; dest.sin_port = htons(0); dest.sin_addr.S_un.S_addr = inet_addr(szDestIp); / 创建 ICMP 封包 char buffsizeof(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( / 开始发送和接收 ICMP 封包 USHORT nSeq = 0; char recvBuf1024; SOCKADDR_IN from; int nLen = sizeof(from); while(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 *) if(nRet = SOCKET_ERROR) printf( sendto() failed: %d n, :WSAGetLastError(); return -1; nRet = :recvfrom(sRaw, recvBuf, 1024, 0, (sockaddr*) if(nRet = SOCKET_ERROR) if(:WSAGetLastError() = WSAETIMEDOUT) printf( timed outn); continue; printf( recvfrom() failed: %dn, :WSAGetLastError(); return -1; / 下面开始解析接收到的 ICMP 封包 int nTick = :GetTickCount(); if(nRet icmp_type != 0)/ 回显 printf( nonecho type %d recvd n, pRecvIcmp-icmp_type); return -1; if(pRecvIcmp-icmp_id != :GetCurrentProcessId() printf( someone elses 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) DOS 下使用 ping 命令 ping 192.168.1.104 结果:(源地址: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 机 IP 与其 MAC 的映 射关系,如果没有,就发一个 ARP 请求广播,得到 B 机的 MAC,一并交给数据链路层。后者构建一个 数据帧,目的地址是 IP 层传过来的物理地址,源地址则是本机的物理地址,还要附加上一些控制信 息,依据以太网的介质访问规则,将它们传送出去。 主机 B 收到这个数据帧后,先检查它的目的地址,并和本机的物理地址对比,如符合,则接收;否则 丢弃。接收后检查该数据帧,将 IP 数据包从帧中提取出来,交给本机的 IP 层协议。同样,IP 层检查 后,将有用的信息提取后交给 ICMP 协议,后者处理后,马上构建一个 ICMP 应答包,发送给主机 A,其过程和主机 A 发送 ICMP 请求包到主机 B 一模一样。 由 wireshark 抓包,我们可以更清楚的看到两者
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 某科研机构实验规范
- 某服装厂服装生产进度规范
- 肾病综合征诊断和治疗指南
- 呼吸系统常见病影像诊断基本病变
- 商业银行与中央银行
- 实习课件继电器与接触器控制
- 函数的定义域与值域
- 区域农业发展第一课时
- 特殊疾病患者四肢血压的差异
- 和谐情绪能量提升幸福能力学员
- GB/T 44438-2024家具床垫功能特性测试方法
- DBJ50T-478-2024 居住建筑改造工程安全防护技术标准
- CJT 526-2018 软土固化剂 标准
- NB-T10208-2019陆上风电场工程施工安全技术规范
- 城市道路照明设计标准 CJJ 45-2015
- 水泥质量控制培训课件
- 《研究生入学教育》课件
- 西方哲学智慧15维特根斯坦
- 中小学学校住宿生管理规定培训课件
- GB/T 20688.1-2007橡胶支座第1部分:隔震橡胶支座试验方法
- GB/T 18909-2002按能力批准评定质量的电子设备用高频电感器和中频变压器分规范
评论
0/150
提交评论