原始套接口ping

上传人:kms****20 文档编号:50959831 上传时间:2018-08-11 格式:PPT 页数:39 大小:205KB
返回 下载 相关 举报
原始套接口ping_第1页
第1页 / 共39页
原始套接口ping_第2页
第2页 / 共39页
原始套接口ping_第3页
第3页 / 共39页
原始套接口ping_第4页
第4页 / 共39页
原始套接口ping_第5页
第5页 / 共39页
点击查看更多>>
资源描述

《原始套接口ping》由会员分享,可在线阅读,更多相关《原始套接口ping(39页珍藏版)》请在金锄头文库上搜索。

1、原始套接口编程(SOCK_RAW)l使用原始套接口,在程序中 可绕过TCP/IP的传输层协议 ,直接对低层进行操作l例子:ping 、 tracert原始套接字编程 Ping 利用ICMP 进行 原始套接字编程“ping ” 判断 特定主机 是否 处于 活动状态 发送 ICMP 回应请求回应请求 报文(ICMP Echo) 等待返回 ICMP 报文 回应应答回应应答(ICMP Echo Reply)原始套接字编程 Ping l“ping ”的简单实现: ping 的IP地址的界面创建原始套接字:SOCKET sRawsocket (AF_INET , SOCK_RAW SOCK_RAW , I

2、PPROTO_ICMPIPPROTO_ICMP) ;原始套接字编程 Ping l l“ping ”“ping ”的简单实现:分的简单实现:分3 3部分部分 struct icmp_hdr 定义ICMP头函数声明: SetTimeout: 设置接受超时 USHORT checksum: 效验和的计算int main() . 原始套接字编程 Ping l l“ping ”“ping ”的简单实现:分的简单实现:分3 3部分部分 struct icmp_hdr 定义ICMP头函数声明: SetTimeout: 设置接受超时 USHORT checksum: 效验和的计算int main()原始套接字

3、编程 Ping /P31 typedef struct icmp_hdr UCHAR icmp_type;/ 1B 类型 UCHAR icmp_code;/ 1B 代码 USHORT icmp_checksum; / 2B 校验和 USHORT icmp_id;/ 2B 标识符USHORT icmp_sequence;/ 2B 序号 ICMPHDR, *PICMPHDR;* *2B 标识符(惟一 标识 该请求 的 ID号,通常可设置为 进程ID)定义定义ICMPICMP头头l l“ping ”“ping ”的简单实现:分的简单实现:分3 3部分部分 struct icmp_hdr 定义ICMP

4、头函数声明: SetTimeout: 设置接受超时 USHORT checksum: 效验和的计算int main()原始套接字编程 Ping SetTimeout(SOCKET s, int nTime); USHORT checksum(USHORT* buff, int size);int main() . 函数函数 SetTimeoutSetTimeout ( ) ( ) 设置接收超时设置接收超时函数函数USHORT checksum( ) USHORT checksum( ) 计算校验和计算校验和主程序中调用 SetTimeout(sRawSetTimeout(sRaw, 1000)

5、;, 1000); /函数 SetTimeout 设置接收超时 SetTimeout(SOCKET s, int nTime) /P166、168 int ret = setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, (char*) if(ret!=0) printf(“setsockopt() Failed ,Error= %dn“, WSAGetLastError();exit(0); else return ret; int main() . 函数函数 SetTimeoutSetTimeout ( ) ( ) 设置接收超时设置接收超时函数函数USHORT ch

6、ecksum( ) USHORT checksum( ) 计算校验和计算校验和/函数USHORT checksum P20 /pIcmp-icmp_checksum = / checksum(USHORT*)buff, sizeof(ICMPHDR) + 32); USHORT checksum(USHORT* buff, int size) ULONG cksum = 0; while(size1) cksum += *buff+; size -=2; if(size=1)cksum += *(UCHAR*)buff; cksum = (cksum 16) + (cksum cksum +=

7、 (cksum 16); return (USHORT)cksum; 拆开:/函数USHORT checksumUSHORT checksum(USHORT* buff, int size) ULONG cksum = 0; while(size1) cksum += *buff+; size -=2; if(size=1) cksum += *(UCHAR*)buff; cksum = (cksum 16) + (cksum cksum += (cksum 16); return (USHORT)cksum; 校验过程解释一般二进制来表示:ICMP头 UCHAR icmp_type; / 类

8、型 1B (8) UCHAR icmp_code; / 代码 1B (0) USHORT icmp_checksum; / 校验和2B (0) USHORT icmp_id; / 标识(进程ID) 2B (2404) USHORT icmp_sequence;/ 序列号 2B (0)00001000 8 类型 00000000 0 代码 00000000 00000000 0 校验和 00001001 01100100 2404 进程 00000000 00000000 0 序列号 32B的字符E 0100 0101放入缓存buff时(放入前)00001000 类型8 00000000 代码0

9、 00000000 00000000 校验和000001001 01100100 进程240400000000 00000000 序列号0如果有4B,则: 00000000 00000000 00000000 0000000001100100 00001001放入缓存buff时(放入后) 00001000 8 类型 00000000 0 代码 00000000 00000000 0 校验和 00001001 01100100 2404 进程 00000000 00000000 0 序列号0000 1000 0000 00000000 1000 0000 0000 0000 0000 0000

10、0000 01100100 00001001 0000 0000 0000 0000 01000101 01000101 01000101 01000101 送到 checksum(),按 2B2B 提取0000 1000 0000 0000 1000 0000 00000000 0000 0000 0000 0000 01100100 00001001 0000 0000 0000 0000 10000101 10000101 10000101 10000101 0000 0000 0000 10000000 0000 0000 1000 0000 0000 0000 0000 000010

11、01 01100100 0000 0000 0000 0000 01000101 01000101 01000101 010001010000 0000 0000 0000 0000 0000 0000 0000+ 0000 0000 0000 10000000 0000 0000 10000000 0000 0000 0000 0000 0000 0000 1000+ 0000 0000 0000 00000000 0000 0000 0000 0000 0000 0000 1000+ 0000 1001 0110 01000000 0000 0000 0000 0000 1001 0110

12、 1100+ 0000 0000 0000 00000000 0000 0000 0000 0000 1001 0110 1100+ 0100 0101 0100 01010000 0000 0000 0000 0100 1110 1011 0001再加15次 + 0100 0101 0100 0101 结果: 0000 0000 0000 0100 0101 1101 1011 1100 ULONG cksum = 0; cksum += *buff+; if不为奇数 0000 0000 0000 0000 0000 0000 0000 0000+ 0000 0000 0000 100000

13、00 0000 0000 10000000 0000 0000 0000 0000 0000 0000 1000+ 0000 0000 0000 00000000 0000 0000 0000 0000 0000 0000 1000+ 0000 1001 0110 01000000 0000 0000 0000 0000 1001 0110 1100+ 0000 0000 0000 00000000 0000 0000 0000 0000 1001 0110 1100+ 0100 0101 0100 01010000 0000 0000 0000 0100 1110 1011 0001再加14

14、次 + 0100 0101 0100 0101 结果: 0000 0000 0000 0100 0001 1000 0111 0111 ULONG cksum = 0; cksum += *buff+; if为奇数 结果 0000 0000 0000 0100 0001 1000 0111 0111需要: if(size=1) cksum += *(UCHAR*)buff;0000 0000 0000 0100 0001 1000 0111 01110100 0101 0000 0000 0000 0100 0001 1000 1011 1100cksum = (cksum 16) + (cksum cksum += (cksum 16); return (USHORT)cksum;if为奇数 结果 0000 0000 0000 0100 0101 1101 1011 1100 需要:cksum = (cksum 16) + (cksum c

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 科普知识

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号