主页

索引

模块索引

搜索页面

ICMP协议

ICMP: Internet Control Message Protocol
网络控制报文协议

用于告知网络包传送过程中产生的错误以及各种控制消息

当传送IP数据包发生错误--比如主机不可达,路由不可达等等
ICMP协议将会把错误信息封包,然后传送回给主机
https://img.zhaoweiguo.com/knowledge/images/protocols/icmp1.png

ICMP协议——查询报文&差错报文

主要的 ICMP 消息:

1. Echo reply   0
  响应 Echo 消息
  屏蔽类型 0和下面的8 消息后,ping 命令就没有响应了
  如果屏蔽 0 和 8,就不会响应 ping 命令

2. Destination unreachable    3
  终点不可达:
  出于某些原因包没有到达目的地而是被丢弃,则通过此消息通知发送方。
  可能的原因包括:
    目标 IP 地址在路由表中不存在;
    目标端口号不存在对应的套接字;
    需要分片,但分片被禁用

3. Source quench    4
  源抑制:
  当发送的包数量超过路由器的转发能力时,超过的部分会被丢弃,这时会通过这一消息通知发送方
  但是,并不是说遇到这种情况一定会发送这一消息。
  当路由器的性能不足时,可能连这条消息都不发送,就直接把多余的包丢弃
  当发送方收到这条消息时,必须降低发送速率

4. Redirect     5
  重定向:
  当查询路由表后判断该包的入口和出口为同一个网络接口时,
    则表示这个包不需要该路由器转发,可以由发送方直接发送给下一个路由器。
  遇到这种情况时,路由器会发送这条消息,给出下一个路由器的 IP 地址,指示发送方直接发送过去

5. Echo     8
  ping 命令发送的消息。
  收到这条消息的设备需返回一个 Echo reply 消息,以便确认通信对象是否存在

6. Time exceeded    11
  超时:
  由于超过了 IP 头部中的 TTL 字段表示的存活时间而被路由器丢弃,此时路由器会向发送方发送这条消息

7. Parameter problem    12
  由于 IP 头部字段存在错误而被丢弃,此时会向发送方发送这条消息

如下是不产生ICMP错误报文的:

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

ICMP协议大致分为两类:

一种是查询报文
一种是差错报文
    差错报文则产生在数据传送发生错误的时候

查询报文有以下几种用途:

1. ping查询
2. 子网掩码查询(用于无盘工作站在初始化自身的时候初始化子网掩码)
3. 时间戳查询(可以用来同步时间)

ICMP的应用

ping

备注

使用查询报文

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

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

ping 发的包也是符合 ICMP 协议格式的,只不过它在后面增加了自己的格式。
ping 还会存放发送请求的时间值,来计算往返时间,说明路程的长短。

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,这样就可以知道到达了主机

有的路由器压根不会回这个 ICMP。这也是 Traceroute 一个公网的地址,看不到中间路由的原因。

Traceroute另一用法——故意设置不分片,从而确定路径的 MTU:

1. 发送分组,并设置 “不分片” 标志。
2. 当发送的分组的长度大于出口 MTU 时。会发送 ICMP 网络差错包
    类型为 “需要进行分片但设置了不分片位”。
3. 每次收到 ICMP “不能分片” 差错时就减小分组的长度,直到到达目标主机。

tcpdump抓包

$ tcpdump -i eth0 icmp

主页

索引

模块索引

搜索页面