透析icmp协议

上传人:kms****20 文档编号:39668442 上传时间:2018-05-18 格式:DOC 页数:25 大小:119.50KB
返回 下载 相关 举报
透析icmp协议_第1页
第1页 / 共25页
透析icmp协议_第2页
第2页 / 共25页
透析icmp协议_第3页
第3页 / 共25页
透析icmp协议_第4页
第4页 / 共25页
透析icmp协议_第5页
第5页 / 共25页
点击查看更多>>
资源描述

《透析icmp协议》由会员分享,可在线阅读,更多相关《透析icmp协议(25页珍藏版)》请在金锄头文库上搜索。

1、对于熟悉网络的人来说, ICMP 是再熟悉不过了. 它同 IP 协议一样工作在 ISO 模型的网络层, 它的全称是: Internet Control Message Protocal. 其在网络中的主要作用是: - 主机探测 - 路由维护 - 路由选择 - 流量控制 对于主机探测来说有很多方法,主机某些服务的 BANNER,一些使用的应用程序,或者使 用工具来检测主机,如 NMAP,在 WEB 上有 来简单的估测主机。?. 飧鯥 CMP 协议,首先我来讲一下主机探测用到的 ICMP 报文我没有一一讲全部报文,详细请参见 RFC792 协 议)1. 回送或回送响应我们使用一个 ICMPECH

2、O 数据包来探测主机地址是否存活(当然在主机没有被配置 为过滤 ICMP 形式) ,通过简单的发送一个 ICMPECHO(Type 8)数据包到目标主机,如果 ICMPECHOReply(ICMPtype0)数据包接受到,说明主机是存活状态。 如果没有就可以 初步判断主机没有在线或者使用了某些过滤设备过滤了 ICMP 的 REPLY。这种机制就是我 们通常所用的 ping 命令来检测目标主机是否可以 ping 到.回送消息的源地址是回送响应消息的目的地址。若要形成一个回送响应消息,应该将源和 目的地址交换,将类型代码更改为 0,重新计算机校验码。下面是这个报文的格式:0 1 2 3 0 1 2

3、 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Type | Code | Checksum | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Identifier | Sequence Number | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

4、-+-+-+-+-+-+-+-+ | Data . +-+-+-+-+-类型: 8 代表回送消息; 0 代表回送响应消息。 代码:0 校验码: 16 位数据(从 ICMP 类型开始)的反码和再取反而得。为计算校验码,校验码域应该为零。 这些零在 以后会被校验码取代。标识符:如果代码=0,帮助匹配回送和回送响应的代码可以为 0。 序列码:如果代码=0,帮助匹配回送和回送响应的序列码可以为 0。 说明: 回送消息中接收到的消息应该在回送响应消息中返回。标识符和序列码由回送发送者使用 帮助匹配 回送请求的响应。代码: 从主机或网关接收 02. 超时报文0 1 2 3 0 1 2 3 4 5 6 7

5、8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Type | Code | Checksum | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | unused | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Internet Heade

6、r + 64 bits of Original Data Datagram | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+类型:11 代码: 0 = 传送超时; 1 = 分段级装超时。 校验码: 16 位数据(从 ICMP 类型开始)的反码和再取反而得。为计算校验码,校验码域应该为零。这些零在以后会被校验码取代。 Internet 包头+64 位源数据报数据: Internet 包头加上源数据的头 64 位而得。此数据用于主机匹配信息到相应的进程。 如果高层协议使用端口号,应该假设其在源数据的头 64 个字

7、节之中。 说明: 如果网关在处理数据报时发现生存周期域为零,此数据报必须抛弃。网关同时必须通过超 时信息通知源主机。如果主机在组装分段的数据报时因为丢失段未能在规定时间内组装数 据, 此数据报必须抛弃。网关发送超时信息。 如果段零不可用则不用发送超时信息。 代码 0 由网关发送,代码 1 由主机发送。3. 目标主机不可达报文0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

8、| Type | Code | Checksum | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | unused | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Internet Header + 64 bits of Original Data Datagram | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+类型:3 代码:

9、0 = 网络不可达; 1 = 主机不可达; 2 = 协议不可用; 3 = 端口不可达; 4 = 需要段和 DF 设置; 5 = 源路由失败;校验码: 16 位数据(从 ICMP 类型开始)的反码和再取反而得。为计算校验码,校验码域应该为零。这些零在以后会被校验码取代。 Internet 包头+源数据报: Internet 包头加上源数据的头 64 位而得。此数据用于主机匹配信息到相应的进程。 如果高层协议使用端口号,应该假设其在源数据的头 64 个字节之中。 说明: 相应于网关的路由表,如果在目的域中指定的网络不可达,如网络距离为无限远,网关会 向发送 源数据的主机发送目的不可达消息。而且,在

10、一些网络中,网关有能力决定目的主机是否 可达。 如果目的地不可达,它将向发送源数据的主机发送不可达信息。 在目的主机,如果 IP 模块因为指定的协议模块和进程端口不可用而不能提交数据报,目的 主机将 向发送源数据的主机发送不可达信息。另外一种情况是当数据报必须被分段传送,而“不可分段”位打开,在这种情况下,网关 必须抛弃 此数据报,并向向发送源数据的主机发送不可达信息。代码 0,1,4 和 5 由网关发送,而代码 2 和 3 由主机发送。Windows 的 Socket 函数有许多, 我没有做详细介绍, 这里的函数都是简要说明其用途, 详 细用法请参考 MSDN. 这里的主要目的是为了后面的三

11、个应用服务.函数说明: - WSAStartup 函数 初始化 Winsock 声明 int WSAStarup(WORD wVersionRequested,LPWSADATA lpWSAData); 参数 wVersionRequested - 要求使用 Winsock 的最低版本号 lpWSAData - Winsock 的详细资料 返回值 当函数成功调用时返回 0 失败时返回非 0 的值 -socket 函数 用于生成 socket(soket Descriptor) 声明 SOCKET socket(int af,int type,int protocol); 参数 af - 地址家

12、族(通常使用:AF_INET) type - socket 的种类 SOCK_STREAM : 用于 TCP 协议 SOCK_DGRAM : 用于 UDP 协议 protocol - 所使用的协议 返回值 当函数成功调用时返回一个新的 SOCKET(Socket Descriptor) 失败时返回 INVALID_SOCKET. -inet_addr 函数 地址转换, 把“A.B.C.D“的 IP 地址转换为 32 位长整数 声明 unsigned long inet_addr ( const char FAR *cp ); 参数 cp - 指向 IP 地址字符串的指针 返回值 当函数成功调用

13、时返回用 32 位整数表示的 IP 地址 失败时返回 INADDR_NONE. -gethostbyname 函数 从主机名获取主机信息. 声明struct hostent FAR * gethostbyname ( const char FAR *name ); 参数 name - 指向主机名字符串的指针 返回值 当函数成功调用时返回主机信息 失败时返回 NULL(空值)recv 函数 利用 Socket 进行接受数据. 声明 int recv ( SOCKET s , char FAR *buf , int len , int flags ); 参数 s - 指向用 Socket 函数生成

14、的 Socket Descriptor buf - 接受数据的缓冲区(数组)的指针 len - 缓冲区的大小 flag - 调用方式(MSG_PEEK 或 MSG_OOB) 返回值 成功时返回收到的字节数. 如果连接被中断则返回 0 失败时返回 SOCKET_ERROR-sendto 函数 发送数据. 声明 int sendto ( SOCKET s , const char FAR *buf , int len , int flags , const struct sockaddr FAR *to , int token ); 参数 s - 指向用 Socket 函数生成的 Socket D

15、escriptor buf - 接受数据的缓冲区(数组)的指针 len - 缓冲区的大小 flag - 调用方式(MSG_DONTROUTE , MSG_OOB) to - 指向发送方 SOCKET 地址的指针 token - 发送方 SOCKET 地址的大小 返回值 成功时返回已经发送的字节数. 失败时返回 SOCKET_ERROR原理简介: - 这个例子演示了应用微软的 ICMP.DLL 怎样“ping“另一台机器. 这个 DLL 是没有文档话的 发送 ICMP 回送包 API 接口, 也称为“pings,“ 就像潜水员对声纳信号的术语一样. 这段代码 出自一个被一个名叫 MarkG 的家

16、伙的 GUI 程序, 他的网页已经消失了. ICMP.DLL API 现在在 Windows 平台上与微软的 Winsocks 工作的很好, 但是微软说更好的 产品一出来他们将替换它. 微软说这个自从 Windows 95 时代就在用, 这些功能在在 Windows 2000 上仍然存在.For more information on the ICMP.DLL API, check out s ICMP API page. 更详细的 ICMP.DLL API 的信息到 的 ICMP API 网页获取.具体实现: - / Borland C+ 5.0: bcc32.cpp ping.cpp / Visual C+ 5.0: cl ping.cpp wsock32.lib / / This sample program is hereby place

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


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

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