ICMP(网络控制报文)协议

当传送IP数据包发生错误--比如主机不可达,路由不可达等等,ICMP协议将会把错误信息封包,然后传送回给主机 为了防止产生ICMP报文的无限传播,如下是不产生ICMP错误报文的:

1.ICMP差错报文不会产生ICMP差错报文(出IMCP查询报文)(防止IMCP的无限产生和传送)
2.目的地址是广播地址或多播地址的IP数据报
3.作为链路层广播的数据报
4.不是IP分片的第一片
5.源地址不是单个主机的数据报。这就是说,源地址不能为零地址、环回地址、广播地 址或多播地址

ICMP协议大致分为两类,一种是查询报文,一种是差错报文,其中查询报文有以下几种用途:

ping查询(不要告诉我你不知道ping程序)
子网掩码查询(用于无盘工作站在初始化自身的时候初始化子网掩码)
时间戳查询(可以用来同步时间)

差错报文则产生在数据传送发生错误的时候

ICMP的应用–ping:

它利用ICMP协议包来侦测另一个主机是否可达
原理是用类型码为0的ICMP发请求,受到请求的主机则用类型码为8的ICMP回应
ping程序来计算间隔时间,并计算有多少个包被送达。用户就可以判断网络大致的情况
ping给出来了传送的时间和TTL的数据

ICMP的ping请求数据报在每经过一个路由器的时候,路由器都会把自己的ip放到该数据报中
而目的主机则会把这个ip列表复制到回应icmp数据包中发回给主机
但是,无论如何,ip头所能纪录的路由列表是非常的有限

ICMP的应用–Traceroute:

% windows下面的名字叫做tracert
Traceroute是用来侦测主机到目的主机之间所经路由情况的重要工具,也是最便利的工具
Traceroute的原理:
  1.它受到目的主机的IP后,首先给目的主机发送一个TTL=1的UDP数据包
  2.而经过的第一个路由器收到这个数据包以后,就自动把TTL减1,而TTL变为0以后
    路由器就把这个包给抛弃了,并同时产生 一个主机不可达的ICMP数据报给主机
  3.主机收到这个数据报以后再发一个TTL=2的UDP数据报给目的主机
    然后刺激第二个路由器给主机发ICMP数据报
  4.如此往复直到到达目的主机。这样,traceroute就拿到了所有的路由器ip
  从而避开了ip头只能记录有限路由IP的问题
怎么知道UDP到没到达目的主机呢?
  而traceroute发送的是端口号>30000的UDP报文
  TTL减为0时最后一个经手的路由器会返回TTL-Exceeded报文
  到目的主机后由于端口大于30000,会返回Port-Unreachable,这样就可以知道到达了主机