第6章 ICMP:网际控制报文协议

所属:TCP/IP详解 卷1:协议 来源:TCP/IP详解 卷1:协议

本章介绍ICMP协议,包括ICMP的作用、报文类型、查询报文和差错报文等。


6.1 引言

ICMP的作用

ICMP(Internet Control Message Protocol):

  • 网际控制报文协议
  • IP层的辅助协议
  • 传递网络层的控制信息
  • 报告错误和异常
  • 查询网络状态

ICMP是IP的辅助协议。


为什么需要ICMP

为什么需要ICMP:

  • IP是不可靠的
  • 丢了不知道为什么
  • 需要有人报告错误
  • 需要有人传递控制信息

ICMP的用途:

  • 报告不可达
  • 报告超时
  • 重定向
  • 测试连通性(ping)
  • 测试路径(traceroute)
  • 等等

ICMP传递控制和错误信息。


ICMP和IP的关系

ICMP和IP的关系:

  • ICMP封装在IP数据报里
  • IP首部的协议字段是1
  • ICMP是IP的上层,但也是网络层的
  • 辅助IP工作
+--------+---------+
| IP首部 | ICMP报文 |
+--------+---------+

ICMP封装在IP里。


本章讨论的内容

本章讨论的内容:

  • ICMP报文类型
  • ICMP查询报文
  • ICMP差错报文
  • ICMP的规则
  • 常见的ICMP类型

本章介绍ICMP协议。


6.2 ICMP报文类型

ICMP报文分类

ICMP报文分为两大类:

  1. 查询报文(Query)

    • 请求-应答模式
    • 用来查询信息
    • 比如ping、时间戳等
  2. 差错报文(Error)

    • 报告错误
    • 比如不可达、超时等
    • 不产生应答

两大类:查询和差错。


常见的ICMP类型

常见的ICMP类型:

类型代码名称类别
00回显应答(Echo Reply)查询
30-15目的不可达(Destination Unreachable)差错
40源抑制(Source Quench)差错
50-3重定向(Redirect)差错
80回显请求(Echo Request)查询
90路由器通告(Router Advertisement)查询
100路由器请求(Router Solicitation)查询
110-1超时(Time Exceeded)差错
120-1参数问题(Parameter Problem)差错
130时间戳请求(Timestamp Request)查询
140时间戳应答(Timestamp Reply)查询
150信息请求(Information Request)查询
160信息应答(Information Reply)查询
170地址掩码请求(Address Mask Request)查询
180地址掩码应答(Address Mask Reply)查询

有很多种ICMP类型。


ICMP报文格式

ICMP报文的通用格式:

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|      类型       |      代码       |           检验和           |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                            内容                              |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

通用字段:

  • 类型:8位,ICMP类型
  • 代码:8位,进一步细分
  • 检验和:16位,ICMP报文的校验和
  • 内容:可变,不同类型不同内容

ICMP有通用的首部格式。


6.3 ICMP查询报文

回显请求和应答

回显请求(Echo Request)和回显应答(Echo Reply):

  • 类型8:请求
  • 类型0:应答
  • 就是ping用的
  • 测试连通性

工作方式:

  • 发请求,收应答
  • 能收到说明通
  • 收不到说明不通

ping用的就是回显请求/应答。


时间戳请求和应答

时间戳请求和应答:

  • 类型13:请求
  • 类型14:应答
  • 查询对方的时间
  • 可以用来同步时间
  • 也可以测RTT

三个时间戳:

  • 发起时间戳:请求发送的时间
  • 接收时间戳:收到请求的时间
  • 传送时间戳:发送应答的时间

时间戳可以查询时间和测RTT。


地址掩码请求和应答

地址掩码请求和应答:

  • 类型17:请求
  • 类型18:应答
  • 查询子网掩码
  • 启动时用
  • 现在一般不用了,用DHCP

地址掩码查询子网掩码。


路由器请求和通告

路由器请求和通告:

  • 类型10:请求
  • 类型9:通告
  • 发现默认网关
  • 主机启动时发请求
  • 路由器定期发通告

路由器发现用的。


6.4 ICMP差错报文

目的不可达

目的不可达(Destination Unreachable):

  • 类型3
  • 各种原因的不可达

常见代码:

代码含义
0网络不可达
1主机不可达
2协议不可达
3端口不可达
4需要分片但设置了DF位
5源路由失败
6目的网络未知
7目的主机未知
…还有很多

目的不可达有很多种。


超时

超时(Time Exceeded):

  • 类型11
  • TTL到0了
  • 或者分片重装超时

代码:

  • 0:传输中TTL超时
  • 1:分片重装超时

用途:

  • traceroute用的就是TTL超时
  • 发TTL=1的,超时就返回ICMP
  • 然后TTL=2,以此类推

超时报告TTL到0了。


源抑制

源抑制(Source Quench):

  • 类型4
  • 告诉发送方放慢点
  • 拥塞控制
  • 现在基本不用了
  • TCP自己有拥塞控制

源抑制用于拥塞控制,现在很少用。


重定向

重定向(Redirect):

  • 类型5
  • 告诉主机有更好的路由
  • 主机发错了路由器
  • 路由器转发,同时发重定向
  • 主机更新路由表

代码:

  • 0:对网络重定向
  • 1:对主机重定向
  • 2:对服务类型和网络重定向
  • 3:对服务类型和主机重定向

重定向告诉主机更好的路由。


参数问题

参数问题(Parameter Problem):

  • 类型12
  • IP首部有问题
  • 参数错误
  • 比较少见

参数问题报告首部错误。


6.5 ICMP的规则

差错报文的规则

ICMP差错报文的规则:

  1. 不对ICMP差错报文产生ICMP差错报文

    • 防止无限循环
    • ICMP错误不会再产生错误
  2. 不对广播/多播产生差错报文

    • 防止广播风暴
    • 一个广播出错,所有人都回ICMP
    • 网络就炸了
  3. 不对源地址不是单播的产生差错报文

    • 源地址是0、广播、多播等
    • 不回差错报文

这些规则防止ICMP风暴。


差错报文包含的内容

ICMP差错报文包含:

  • 出错的IP首部
  • IP首部后面的前8个字节
  • (也就是传输层首部的前8字节,包含端口号)

为什么要包含:

  • 让发送方知道是哪个数据报出错了
  • 知道是哪个进程的
  • 可以根据端口号找到进程

差错报文包含原始数据报的一部分。


6.6 ICMP的应用

Ping

Ping:

  • 用ICMP回显请求/应答
  • 测试连通性
  • 测试RTT
  • 最常用的网络工具

ping是最常用的ICMP应用。


Traceroute

Traceroute:

  • 用ICMP超时报文
  • 也可以用UDP
  • 追踪路径
  • 看经过哪些路由器

traceroute也是ICMP的重要应用。


路径MTU发现

路径MTU发现:

  • 用ICMP不可达(需要分片)
  • 发送DF位为1的分组
  • MTU不够就回ICMP
  • 然后减小MTU重试

路径MTU发现也用ICMP。


6.7 小结

ICMP概述

  1. 作用

    • 网际控制报文协议
    • 传递控制和错误信息
    • IP的辅助协议
  2. 和IP的关系

    • 封装在IP里
    • 协议号1
    • 网络层协议

ICMP报文类型

  1. 两大类

    • 查询报文:请求-应答
    • 差错报文:报告错误
  2. 常见类型

    • 回显请求/应答(ping)
    • 目的不可达
    • 超时(traceroute)
    • 重定向
    • 时间戳
    • 地址掩码
    • 等等

查询报文

  1. 回显请求/应答

    • ping用的
    • 测试连通性
  2. 时间戳请求/应答

    • 查询时间
    • 测RTT
  3. 地址掩码请求/应答

    • 查询子网掩码
    • 现在少用
  4. 路由器请求/通告

    • 发现网关

差错报文

  1. 目的不可达

    • 网络/主机/端口不可达
    • 需要分片
    • 等等
  2. 超时

    • TTL到0
    • traceroute用
  3. 源抑制

    • 拥塞控制
    • 现在少用
  4. 重定向

    • 更好的路由
    • 更新路由表
  5. 参数问题

    • 首部错误

ICMP的规则

  1. 防止循环

    • 不对ICMP差错产生差错
  2. 防止广播风暴

    • 不对广播/多播产生差错
    • 不对非单播源产生差错
  3. 差错报文内容

    • 包含原始IP首部
    • 包含前8字节数据

ICMP的应用

  1. Ping

    • 回显请求/应答
    • 测试连通性
  2. Traceroute

    • 超时报文
    • 追踪路径
  3. 路径MTU发现

    • 需要分片的不可达
    • 发现MTU

关键概念

  1. ICMP

    • 网际控制报文协议
    • IP的辅助
  2. 两大类

    • 查询报文
    • 差错报文
  3. 常见类型

    • 回显、不可达、超时、重定向
  4. 规则

    • 防止循环和风暴
  5. 应用

    • ping、traceroute、PMTUD

ICMP网际控制报文