1.ICMP协议概述
2.ICMP报文类型
3.ICMP差错报文
4.ICMP查询报文
5.Ping程序
1.ICMP协议概论
ICMP经常被认为是IP层的一个组成部分,它传递差错报文以及其他需要注意的信息。ICMP报文通常被IP层或更高层协议(如TCP或UDP协议)使用。ICMP报文是在IP数据报内部传输的。IP协议是不可靠协议,不能保证IP数据报能够成功到达目的主机,无法进行差错控制,而ICMP协议能够协助IP协议完成这些功能。下面是ICMP报文的数据结构:
1. 类型:一个8位类型字段,表示ICMP数据包类型;
2. 代码:一个8位代码域,表示指定类型中的一个功能,如果一个类型中只有一种功能,代码域置为0;
3. 校验和:数据包中ICMP部分上的一个16位检验和;
2.ICMP报文类型
ICMP报文大致可分为两类:差错报文,查询报文。具体消息类型如下表所示:
3.ICMP差错报文
当发送一份差错报文时,报文始终包含IP的首部和产生ICMP差错报文的IP数据报的前8位字节。这样,接收ICMP差错报文的模块就会把它与某个特定的协议(根据IP数据报首部中的协议字段来判断)和用户进程(根据包含在IP数据报前8个字节中的TCP或UDP报文首部中的TCP或UDP端口号来判断)联系起来。
下面各种情况不会导致产生ICMP差错报文:
1.ICMP报文差错(ICMP查询报文可能会产生ICMP差错报文);
2.目的地址是广播地址或多播地址的IP数据报;
3.作为链路层广播的数据报
4.不是IP分片的第一片
5.源地址不是单个主机的数据报,也就是说,源地址不可能是零地址,环回地址,广播地址或多播地址;
以下针对ICMP差错报文的类型进行分析:
1.ICMP目标不可达消息:IP路由器无法将IP数据报发生给目的地址时,会给发送端主机返回一个目标不可达ICMP消息,并在这个消息中显示不可达的具体原因;
2.ICMP重定向消息:如果路由器发现发送端主机使用次优的路径发生数据时,那么它会返回一个ICMP重定向消息给这和主机,这个消息包含了最合适的路由信息和源数据。主要发生在路由器持有更好的路由信息的情况下,路由器会通过这个ICMP重定向消息给发送端主机一个更合适的发送路由。
3.ICMP超时信息:IP数据包中有一个字段TTL(Time to live, 生存周期),它的值随着每经过一个路由器就会减1,直到减到0时该IP数据包被丢弃。此时,IP路由器将发送一个ICMP超时消息给发送端主机,并通知该包已被丢弃。
4.源抑制消息:当TCP/IP主机发生数据到另一台主机时,如果速度达到路由器或者链路的饱和状态,路由器发出一个ICMP源抑制消息。
4.ICMP查询报文
1.ICMP回送消息:用于进行通信的主机和路由之间,判断发送数据包是否成功到达对端的消息。可以向对端主机发送回送请求消息,也可以接收对端主机回来的回送应答消息。
2.ICMP地址掩码消息:主要用于主机或路由器想要了解子网掩码的情况。可以向那些主机或路由器发生ICMP地址掩码请求消息,然后通过接收ICMP地址掩码应答消息获取子网掩码信息。
3.ICMP时间戳消息:可以向主机或路由器发生ICMP地址掩码请求消息,然后通过接收ICMP时间戳应答消息获取时间信息。
5.Ping程序
Ping程序利用ICMP回显请求报文和回显应答报文(而不用经过传输层)来测试目标主机是否可达。它是一个检查系统连接性的基本诊断工具。
ICMP回显请求和ICMP回显应答报文是配合工作的。但源主机向目标主机发送了ICMP回显请求数据包后,它期待着目标主机的回答。目标主机在收到一个ICMP回显请求数据包后,它会交换源,目的主机的地址,然后将收到的ICMP回显请求数据中的数据部分原封不动地封装在自己的ICMP回显应答数据包中,然后发回给发送ICMP回显请求的一方。如果校验正确,发送者便认为目标主机的回显服务正常,也就是说明物理连接畅通。
例如,ping一下百度
~$ ping baidu.com
PING baidu.com (180.149.132.47) 56(84) bytes of data.
64 bytes from 180.149.132.47: icmp_seq=1 ttl=48 time=486 ms
64 bytes from 180.149.132.47: icmp_seq=2 ttl=48 time=179 ms
64 bytes from 180.149.132.47: icmp_seq=3 ttl=48 time=169 ms
64 bytes from 180.149.132.47: icmp_seq=4 ttl=48 time=165 ms
64 bytes from 180.149.132.47: icmp_seq=5 ttl=48 time=541 ms
64 bytes from 180.149.132.47: icmp_seq=6 ttl=48 time=131 ms
64 bytes from 180.149.132.47: icmp_seq=7 ttl=48 time=155 ms
64 bytes from 180.149.132.47: icmp_seq=8 ttl=48 time=154 ms
64 bytes from 180.149.132.47: icmp_seq=9 ttl=48 time=146 ms
64 bytes from 180.149.132.47: icmp_seq=10 ttl=48 time=139 ms
64 bytes from 180.149.132.47: icmp_seq=11 ttl=48 time=145 ms
Traceroute程序
Traceroute程序主要用来侦测主机到目的主机之间所经过的路由的情况。
Traceroute使用ICMP报文和IP首部中的TTL字段,它充分利用了ICMP超时消息。其原理很简单,开始时发送一个TTL字段为1的UDP数据报,而后每次收到ICMP超时消息后,按顺序再发送一个TTL字段加1的UDP数据报,以确定路径中的每个路由器,而每个路由器在丢弃UDP数据报时都会返回一个ICMP超时报文,而最终到达目的主机后,由于ICMP选择了一个不可能的值作为UDP端口(大于30000).这样目的主机就会发送一个端口不可达的ICMP差错报文。