透析ICMP协议(一): 协议原理 =============================== 这篇文章原创自bugfree/CSDN 平台: VC6 Windows XP ICMP简介: -------- 对于熟悉网络的人来说, ICMP是再熟悉不过了. 它同IP协议一样工作在ISO模型的网络层, 它的全称是: Internet Control Message Protocal. 其在网络中的主要作用是: - 主机探测 - 路由维护 - 路由选择 - 流量控制 我主要围绕主机探测来讲解如下的几篇文章: - 透析ICMP协议(一): 基础知识 协议原理 - 透析ICMP协议(二): 函数简介 Windows Socket 简介 - 透析ICMP协议(三): 牛刀初试之一 应用篇ping(ICMP.dll) - 透析ICMP协议(四): 牛刀初试之二 应用篇ping(RAW Socket) - 透析ICMP协议(五): 应用篇路由追踪 对于主机探测来说有很多方法,主机某些服务的BANNER,一些使用的应用程序,或者使用工具来检测主机,如NMAP,在WEB上有www.netcraft.com来简单的估测主机。下面所讲的是使用ICMP协议来探测主机,主要也是可以了解ICMP这个协议,这里最主要的也是将这个ICMP协议, 首先我来讲一下主机探测用到的ICMP报文:(我没有一一讲全部报文,详细请参见RFC792协议) 1. 回送或回送响应 我们使用一个ICMPECHO数据包来探测主机地址是否存活(当然在主机没有被配置为过滤ICMP形式),通过简单的发送一个ICMPECHO(Type 8)数据包到目标主机,如果ICMPECHOReply(ICMPtype0)数据包接受到,说明主机是存活状态。 如果没有就可以初步判断主机没有在线或者使用了某些过滤设备过滤了ICMP的REPLY。这种机制就是我们通常所用的ping命令来检测目标主机是否可以ping到. 回送消息的源地址是回送响应消息的目的地址。若要形成一个回送响应消息,应该将源和目的地址交换,将类型代码更改为0,重新计算机校验码。 下面是这个报文的格式: 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 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Type | Code | Checksum | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Identifier | Sequence Number | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Data ... +-+-+-+-+- 类型: 8代表回送消息; 0代表回送响应消息。 代码:0 校验码: 16位数据(从ICMP类型开始)的反码和再取反而得。为计算校验码,校验码域应该为零。这些零在 以后会被校验码取代。 标识符:如果代码=0,帮助匹配回送和回送响应的代码可以为0。 序列码:如果代码=0,帮助匹配回送和回送响应的序列码可以为0。 说明: 回送消息中接收到的消息应该在回送响应消息中返回。标识符和序列码由回送发送者使用帮助匹配 回送请求的响应。代码: 从主机或网关接收0 2. 超时报文 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 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Type | Code | Checksum | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | unused | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Internet Header + 64 bits of Original Data Datagram | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 类型:11 代码: 0 = 传送超时; 1 = 分段级装超时。 校验码: 16位数据(从ICMP类型开始)的反码和再取反而得。为计算校验码,校验码域应该为零。 这些零在以后会被校验码取代。 Internet包头+64位源数据报数据: Internet包头加上源数据的头64位而得。此数据用于主机匹配信息到相应的进程。 如果高层协议使用端口号,应该假设其在源数据的头64个字节之中。 说明: 如果网关在处理数据报时发现生存周期域为零,此数据报必须抛弃。网关同时必须通过超 时信息通知源主机。如果主机在组装分段的数据报时因为丢失段未能在规定时间内组装数据, 此数据报必须抛弃。网关发送超时信息。 如果段零不可用则不用发送超时信息。 代码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 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Type | Code | Checksum | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | unused | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Internet Header + 64 bits of Original Data Datagram | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 类型:3 代码: 0 = 网络不可达; 1 = 主机不可达; 2 = 协议不可用; 3 = 端口不可达; 4 = 需要段和DF设置; 5 = 源路由失败; 校验码: 16位数据(从ICMP类型开始)的反码和再取反而得。为计算校验码,校验码域应该为零。 这些零在以后会被校验码取代。 Internet包头+源数据报: Internet包头加上源数据的头64位而得。此数据用于主机匹配信息到相应的进程。 如果高层协议使用端口号,应该假设其在源数据的头64个字节之中。 说明: 相应于网关的路由表,如果在目的域中指定的网络不可达,如网络距离为无限远,网关会向发送 源数据的主机发送目的不可达消息。而且,在一些网络中,网关有能力决定目的主机是否可达。 如果目的地不可达,它将向发送源数据的主机发送不可达信息。 在目的主机,如果IP模块因为指定的协议模块和进程端口不可用而不能提交数据报,目的主机将 向发送源数据的主机发送不可达信息。 另外一种情况是当数据报必须被分段传送,而“不可分段”位打开,在这种情况下,网关必须抛弃 此数据报,并向向发送源数据的主机发送不可达信息。 代码0,1,4和5由网关发送,而代码2和3由主机发送。 |