《TCP/IP详解 卷1》 笔记: ICMP协议

引言

    ICMP全称为Internet控制报文协议,它经常被认为是IP层的一个组成部分。它传递差错报文以及其他需要注意的信息。ICMP报文通常被IP层或传输层协议(TCP或UDP)使用。一些ICMP差错报文还会返回给用户进程。

    ICMP报文是在IP数据报内部被传输的,如下图所示:

《TCP/IP详解 卷1》 笔记: ICMP协议

    ICMP报文的格式如下图所示:

《TCP/IP详解 卷1》 笔记: ICMP协议

    类型字段可以有15个不同的值,以描述特定类型的ICMP报文。某些ICMP报文还使用代码字段的值来进一步描述不同的报文内容。

    检验和字段覆盖整个ICMP报文。ICMP的检验和是必需的。

ICMP报文的类型

    ICMP报文类型如下图所示:

《TCP/IP详解 卷1》 笔记: ICMP协议

    图中的最后两列表明ICMP报文是一份查询报文还是一份差错报文。对ICMP差错报文有时需要作特殊处理,因此我们需要对它们进行区分。

ICMP回显请求和应答

    当我们用ping程序ping一台主机时,进程发送ICMP回显请求,收到ICMP回显请求的主机进程返回ICMP回显应答报文。ICMP回显请求和应答报文的格式如下:

《TCP/IP详解 卷1》 笔记: ICMP协议

    Unix系统在实现ping程序时是把ICMP报文中的标识符字段置成发送进程的ID号。这样即使在同一台主机上同时运行了多个ping程序实例,ping程序也可以识别出返回的信息。***从0开始,每发送一次新的回显请求就加1。ping程序打印出返回的每个分组的***,允许我们查看是否有分组丢失、失序或重复。

    《UNIX网络编程 卷1》笔记 这一节中介绍了如何实现ping程序。

ICMP端口不可达差错

    UDP的规则之一是,如果收到一份UDP数据报,该数据报中的目的端口并没有UDP进程在监听,那么UDP返回一个ICMP端口不可达报文。该报文的格式如下图所示:

《TCP/IP详解 卷1》 笔记: ICMP协议

    ICMP的一个规则是,ICMP差错报文必须包含生成该差错报文的数据报IP首部(包含任何选项),还必须至少包含跟在该IP首部后面的前8个字节(在本例中是UDP首部)。

    包含在UDP首部中的源端口号和目的端口号非常重要。就是由于目的端口号才导致产生了ICMP端口不可达的差错报文。而接收ICMP的系统可以根据源端口号来把差错报文与某个特定的用户进程相关联。导致差错的数据报中的IP首部要被送回的原因是因为IP首部中包含了协议字段,使得ICMP能够解释后面的8个字节(在本例中是UDP首部)。

4.4BSD对ICMP报文的处理

《TCP/IP详解 卷1》 笔记: ICMP协议

    如果最后一列标明是“内核”,那么ICMP就由内核来处理。如果最后一列指明是“用户进程”,那么报文就被传送到所有在内核中登记的用户进程,以读取收到的ICMP报文。