TCP/IP协议——ICMP
2020-03-23
4 min read
1 引言
- ICMP经常被认为是IP层的一个组成部分。它传递差错报文以及其他需要注意的信息。
- ICMP报文通常被IP层或更高层协议(TCP或UDP)使用。
- ICMP报文是在IP数据报内部,在IP数据报的数据部分。

- ICMP的正式规范参见RFC 792
- ICMP的格式:
- 类型字段有15个值,以描述特定类型的ICMP报文。
- 代码字段用于某些ICMP报文,用以进一步描述不同的条件。
- 检验和字段覆盖整个ICMP报文。使用的算法与IP首部检验和算法相同。

- 不能产生ICMP差错报文的情况:
- ICMP差错报文(但是,ICMP查询报文可能会产生ICMP差错报文)。
- 目的地址是广播地址或多播地址的IP数据报。
- 作为链路层广播的数据报。
- 不是IP分片的第一片。
- 源地址不是单个主机的数据报。源地址不能为零地址、环回地址、广播地址或多播地址。
2 ICMP报文类型

- 不同类型由报文中的类型字段和代码字段来共同决定。
- 上图中的最后两列表明ICMP报文是一份查询报文还是一份差错报文。区分的原因是有时需要对ICMP差错报文进行特殊处理,例如在对ICMP差错报文进行响应时,永远不会生成另一份ICMP差错报文。
- 当发送一份ICMP差错报文时,报文始终包含产生ICMP差错报文的IP首部和IP数据报的前8个字节。这样,接收ICMP差错报文的模块就会把它与某个特定的协议和用户进程联系起来。
- 对于其他类型的ICMP查询报文,服务器必须响应标识符和序列号字段。另外,客户发送的选项数据必须回显,假设客户对这些信息都会感兴趣。
3 Ping
3.1 Ping程序
- 我们称发送回显请求的ping程序为客户,而称被ping的主机为服务器。
- 大多数的TCP/IP实现都在内核中直接支持Ping服务器

- 回显请求和回显应答报文格式如上所示,Unix系统在实现ping程序时是把ICMP报文中的标识符字段置成发送进程的ID号。
- 序列号从0开始,每发送一次新的回显请求就加1。
- ping程序通过在ICMP报文数据中存放发送请求的时间值来计算往返时间。当应答返回时,用当前时间减去存放在ICMP报文中的时间值,即是往返时间。
3.2 记录路由
- 记录路由是一个在IP首部设定RR选项的ICMP回显请求报文,每个处理该数据报的路由器都把它的IP出口地址放入选项字段中。当数据报到达目的端时,IP地址清单应该复制到ICMP回显应答中,这样返回途中所经过的路由器地址也被加入清单中。
- 缺陷:
- 不是所有路由都支持该选项功能
- P首部中只有有限的空间来存放IP地址。由于IP首部固定长度为20字节, RR选项用去3个字节,这样只剩下37个字节来存放IP地址清单,也就是说只能存放9个IP地址。
- IP数据报中的RR选项的一般格式:
- code是一个字节,指明IP选项的类型。对于RR选项来说,它的值为7。
- len是RR选项总字节长度,在这种情况下为39(ping程序总是提供39字节的选项字段,最多可以记录9个IP地址,尽管可以为RR选项设置更小的长度)。
- ptr称作指针字段,指向存放下一个IP地址的位置