差错与控制报文(ICMP)

ICMP概念

为了让互联网中的路由器报告差错或提供意外情况的信息,设计人员给TCP/IP协议补充了一个特殊用途的报文机制。这种机制成为网际控制报文协议,它是IP不可缺少的一部分,在每个IP实现中都必须包含它。

ICMP原理

当一个数据报产生差错时,ICMP只能向数据报最初源站报告差错情况;源站必须把差错告诉给一个单独的应用程序或采取其他措施来纠正问题。

为什么要限制ICMP只和最初的源站通信呢?数据报只含有指明最初源站和最终目的站的字段,并不包含它在互联网上的行程的完整记录。此外,由于路由器只能建立和改变自己的路由表,所以并不了解全局情况。所以一个数据报达到指定的路由器时,无法知道该数据应该走那条路径。

ICMP主要类型

1.回送回答
如下图显示回送请求和回答报文的格式:
差错与控制报文(ICMP)
类型(TYPE):标识报文是请求(8)还是回答(0)
标识符 (IDENTIFIER)和 序号(SEQUENCE NUMBER):被发送方用于匹配回答和请求
可选数据(OPTIONAL DATA):是一个可变的长度的字段,包含将要返回给发送方的数据

2.目的站不可达
当路由器无法转发或交付一个IP数据报时,使用如下格式向最初源站发出一个目的站不可达的报文。差错与控制报文(ICMP)

3.源站抑制
如下图为ICMP源站抑制报文的格式。发生拥塞的路由器没丢弃一个数据报就发送一个源站抑制报文;数据报前缀表示了被丢弃的数据报。
差错与控制报文(ICMP)
4.时间戳(时钟同步和传输时间估计)
时间戳请求报文(Type=13)和时间戳应答报文(Type=14)用于测试两台主机之间数据报来回一次的传输时间。下图为ICMP时间戳请求或回答报文的格式:差错与控制报文(ICMP)
类型(TYPE):标识报文是请求(13)还是回答(14)
标识符 (IDENTIFIER)和 序号(SEQUENCE NUMBER):被源站用于在回答和请求之间建立关联
起始时间戳是有最初的发送方在传输分组前填写的,接收时间戳是由收到请求后填写的,传输时间戳是在传输回答之前填写的。主要使用这三者,计算时延的估计量,并同步时钟。

*ICMP应用

1.ping 命令使用 ICMP 回送请求和应答报文
在网络可达性测试中使用的分组网间探测命令 ping 能产生 ICMP 回送请求和应答报文。目的主机收到 ICMP 回送请求报文后立刻回送应答报文,若源主机能收到 ICMP 回送应答报文,则说明到达该主机的网络正常。
差错与控制报文(ICMP)
2.路由分析诊断程序 tracert 使用了 ICMP时间超过报文
tracert 命令主要用来显示数据包到达目的主机所经过的路径。通过执行一个 tracert 到对方主机的命令,返回数据包到达目的主机所经历的路径详细信息,并显示每个路径所消耗的时间。

ICMP攻击

ICMP协议本身的特点决定了它非常容易被用于攻击网络上的路由器和主机。

比如,可以利用操作系统规定的ICMP数据包最大尺寸不超过64KB这一规定,向主机发起“Ping of Death”(死亡之Ping)攻击。此外,向目标主机长时间、连续、大量地发送ICMP数据包,也会最终使系统瘫痪。大量的ICMP数据包会形成“ICMP风暴”,使得目标主机耗费大量的CPU资源处理。

我们应该选择适合的防火墙,和配置一个合理的安全策略来有效防止ICMP攻击。