ICMP全称Internet Control Message Protocol(网际控制信息协议)。属于TCP/IP体系中的网络层,是IP协议的一个补充,主要用于在主机与路由器之间传递控制信息,包括差错报告和查询信息。ICMP报文通常被IP层或更高层协议(TCP或UDP)使用。ICMP报文是在IP数据报内部传输的。
ICMP报文格式
ICMP报文的前4个字节是统一的格式,共有三个字段:即类型,代码和检验和,8位类型和8位代码字段一起决定了ICMP报文的类型和功能:
ICMP种类
ICMP报文具体分ICMP差错报告报文和ICMP询问报文(对ICMP差错报文有时需要做特殊处理,因此要对其进行区分。如:对ICMP差错报文进行响应时,永远不会生成另一份ICMP差错报文,否则会出现死循环)。
ICMP差错报告报文可以以回送信息的方式,向源主机发去信息,并不能纠正数据报中的任何出错。除了出错报告,ICMP还可以通过查询报文诊断出某些网络问题。
IP路由器无法将IP数据报发送给目的地址时,会给发送端主机返回一个终点不可达ICMP消息。例如我们要连接对方一个不存在的系统端口(端口号小于1024)时,将返回Type=3、Code=3的ICMP报文,它要告诉我们:“嘿,别连接了,我不在家的!”,常见的不可到达类型还有网络不可到达(Code=0)、主机不可到达(Code=1)、协议不可到达(Code=2)等。
超时报文的代码域有两种取值:Code=0表示传输超时,Code=1表示重组分段超时。
IP 数据包中有一个字段TTL(Time to live,生存周期),它的值随着每经过一个路由器就会减1,当路由器收到生存时间TTL为零的数据报时,除丢弃该数据报外,还要向源站发送时间超过报文(传输超时)。当目的站在预先规定的时间内不能收到一个数据报的全部数据报片时,就将已收到的数据报片都丢弃,并向源站发送时间超过报文(重组分段超时)。
当路由器或目的主机收到的数据报的首部中的字段的值不正确时,就丢弃该数据报,并向源站发送参数问题报文。
如果路由器发现发送端主机使用次优的路径发送数据时,那么它会返回一个ICMP 重定向消息给这个主机,这个消息包含了最合适的路由信息和源数据。主要发生在路由器持有更好的路由信息的情况下,路由器会通过这个ICMP 重定向消息给发送端主机一个更合适的发送路由。
以下几种情况都不会导致产生ICMP差错报文:
这些规则是为了防止过去允许ICMP差错报文对广播分组响应所带来的广播风暴。
所有的ICMP差错报告报文中的数据部分字段也都具有同样的格式。将收到的需要进行差错报告的IP数据报的首部和数据字段的前8个字节提取出来,作为ICMP报文的数据部分字段。再加上响应的ICMP差错报告报文的前8个字节(其中后4位应该是未使用的),就构成了ICMP差错报告报文。提取收到的数据报的数据字段的前8个字节是为了得到运输层的端口号(对于TCP和UDP)以及运输层报文的发送序号(对于TCP)。
ICMP差错报告报文只进行差错报告,并不能纠正数据报中的任何出错。
ICMP询问报文
用于进行通信的主机或路由之间,判断发送数据包是否成功到达对端的消息。
我们日常使用最多的ping,就是响应请求(或回送请求,Type=8)和应答(Type=0),一台主机向一个节点发送一个Type=8的ICMP报文,如果途中没有异常(例如被路由器丢弃、目标不回应ICMP或传输失败),则目标返回Type=0的ICMP报文,说明这台主机存在。
时间戳请求报文(Type=13)和时间戳应答报文(Type=14)用于测试两台主机之间数据报来回一次的传输时间。传输时,主机填充原始时间戳,接收方收到请求后填充接收时间戳后以Type=14的报文格式返回,发送方计算这个时间差。一些系统不响应这种报文。
ICMP的应用:
1,ping及其实现原理
ping是一个用来查询网络通不通的一个工具,是系统自带的,运行于内核,调用ICMP协议。
ping的工作原理:ping命令底层使用的是ICMP,ping通过调用echo来发送请求,通过是否收到echo-reply来查询网络层的连通性。ping的结果会给出传送的时间和TTL(生存周期)的数据,还可以查看主机到目的主机的路由。这是因为ICMP的ping请求数据报在每经过一个路由器的时候,路由器就会把自己的IP地址放到该数据包中,而目的主机则会把这个IP列表复制到ICMP数据包中发回给主机。但是,IP头能记录的路由列表非常有限,如果要观看完整的路由信息,就要用到traceroute工具了。
2,traceroute
traceroute是用来侦测主机到目的主机所经路由情况的工具,可以获取到所经路由器的IP地址。
traceroute的工作原理:当主机得到目的主机的IP后,首先给目的主机发送一个TTL=1的UDP数据包,而经过的第一个路由器收到这个数据包以后,就自动将TTL减1。而TTL变为0以后,路由器就把这个包给抛弃了,并同时产生一个主机不可达的ICMP数据包给主机。主机收到这个数据包以后就发送一个TTL=2的数据包给主机,然后刺激第二个路由器给主机发送ICMP数据包,如此反复直到到达目的主机。这样,traceroute就拿到了所有的路由器IP,从而避免了IP头只能记录有限的路由IP的问题。
IP和ICMP报文的关系
报文内的具体字段可以暂时抛开,可以看到ICMP报文是内嵌在IP报文内的,也就是说IP报文里包含着ICMP报文,ICMP报文是IP报文的一部分。
1.单播
单播是说,对特定的主机进行数据传送。例如给某一个主机发送IP数据包。这时候,数据链路层给出的数据头里面是非常具体的目的地址,对于以太网来 说,就是网卡的MAC地址。现在的具有路由功能的主机应该可以将单播数据定向转发,而目的主机的网络接口则可以过滤掉和自己MAC地址不一致的数据。
2.广播
广播是主机针对某一个网络上的所有主机发送数据包。这个网络可能是网络,可能是子网,还可能是所有的子网。如果是网络,例如A类网址的广播就是 netid.255.255.255,如果是子网,则是netid.netid.subnetid.255;如果是所有的子网(B类IP)则是则是 netid.netid.255.255。
3.多播(组播)
可以说广播是多播的特例,多播就是给一组特定的主机(多播组)发送数据,这样,数据的播发范围会小一些(实际上播发的范围一点也没有变小),多播的MAC地址是最高字节的低位为一,例 如01-00-00-00-00-00。多播组的地址是D类IP,规定是224.0.0.0-239.255.255.255。
PS:广播和多播的性质是一样的,路由器会把数据放到局域网里面,然后网卡对这些数据进行过滤,只拿到自己打算要的数据
组播(多播)IP地址和MAC地址的关系
以太网组播地址范围是从01-00-5E-00-00-00到01-00-5E-7F-FF-FF。组播MAC地址的高24bit位是以01-00-5E开头,低23bit为组播IP地址的低23bit。
由于IP组播地址的高4bit是1110,标识了组播组,而低28bit中只有23bit被映像到组播MAC地址上,这样IP组播地址中就会有5bit没有使用,从而出现了32个IP组播地址映像到同一MAC地址上的结果。
IGMP全称Internet Group Management Protocol(互联网组管理协议)的意思,它也是IP协议的一个补充,同样位于TCP/IP体系中的网络层。该协议用来在ip主机和与其直接相邻的组播路由器之间建立、维护组播组成员关系,但不包括组播路由器之间的组成员关系信息的传播与维护,这部分工作由各组播路由协议完成。所有参与组播的主机必须实现IGMP。
IGMP目前有三个版本,目前用的最多的是IGMPv2。IGMPv1主要基于查询和响应机制来完成对组播组成员的管理;IGMPv2增加了查询器选举机制和离开组机制;IGMPv3在兼容和继承IGMPv1和IGMPv2的基础上,进一步增强了主机的控制能力,并增强了查询和报告报文的功能。
IGMP报文格式
IGMPv1:
V1报文格式如下:
4位版本:目前IGMP有V1,V2,V3三个版本,比如是V1则该4位为1, V3则该4 位为3。
4位类型:有成员关系查询0x11和成员关系报告0x12两种类型。
校验和:8个字节的校验码。
32位组地址:当发送报文是成员关系报告时,该32位组地址即组播组地址。 当发送的报文是成员关系查询时,该32位为全0。V1版本只支持通用关系查询,不支持特定组查询。
IGMPv2:
V2版本报文格式如下:
8位类型:有三种类型
1、成员关系查询0x11:在V2和V3中成员关系查询增加特定组查询。 常规查询:用于确定哪些组播组是活跃的,即改组是否还有成员在使用,常规查询组地址由全零表示。
特定组查询:用于查询某具体组播组是否还有组成员。
2、成员关系报告0x16(版本1成员关系报告0x12)
3、离开组消息0x17。
8位最大响应时间:以0.1秒为单位,默认值是100,即10秒。
校验和:报文段8个字节的校验码。
组地址:
1、成员关系查询报文:常规查询组低位为全0,特定组查询则应设置对应的组地址。
2、成员报告或离开组消息:组地址为要报告或要离开的组地址。