天天看点

ICMP协议总结(TCP/IP详解卷1)一、简述二、ICMP详细报文说明 三、ping程序 四、ICMP协议内核实现

创作人QQ:851301776,邮箱:[email protected],欢迎大家一起技术交流,本博客主要是自己学习的心得体会,只为每天进步一点点!

个人座右铭:

1.没有横空出世,只要厚积一定发。

2.你可以学历不高,你可以不上学,但你不能不学习

此博客总结,主要是方便日后查看学习

一、简述

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

ICMP协议总结(TCP/IP详解卷1)一、简述二、ICMP详细报文说明 三、ping程序 四、ICMP协议内核实现

        ICMP报文的格式如图6 - 2所示。所有报文的前4个字节都是一样的,但是剩下的其他字节则互不相同。

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

        检验和字段覆盖整个ICMP报文。使用的算法与我们在首部检验和算法相同。ICMP的检验和是必需的。

ICMP协议总结(TCP/IP详解卷1)一、简述二、ICMP详细报文说明 三、ping程序 四、ICMP协议内核实现

1.ICMP报文的类型

 ICMP主要分为两大类:

  •         查询报文:是用一对请求和回答定义的
  •         差错报文:I C M P差错报文通常包含了引起错误的 I P数据报的第一个分片的 I P首部(和选项),加上该分片数据部分的前 8个字节。标准假定这 8个字节包含了该分组运输层首部的所有分用信息,这样运输层协议可以向正确的进程提交 I C M P差错报文。T C P和U D P端口号在它们首部的前8个字节内出现。

         因为对ICMP差错报文有时需要作特殊处理,因此我们需要对它们进行区分。当发送一份I C M P差错报文时,报文始终包含 I P的首部和产生I C M P差错报文的I P数据报的前8个字节。这样,接收 I C M P差错报文的模块就会把它与某个特定的协议(根据 I P数据报首部中的协议字段来判断)和用户进程(根据包含在 I P数据报前8个字节中的T C P或U D P报文首部中的T C P或U D P端口号来判断)联系起来。

ICMP协议总结(TCP/IP详解卷1)一、简述二、ICMP详细报文说明 三、ping程序 四、ICMP协议内核实现
ICMP协议总结(TCP/IP详解卷1)一、简述二、ICMP详细报文说明 三、ping程序 四、ICMP协议内核实现

 下面各种情况都不会导致产生 I C M P差错报文:

        1) ICMP差错报文(但是,I C M P查询报文可能会产生I C M P差错报文)。

        2) 目的地址是广播地址(见图 3 - 9)或多播地址(D类地址,见图1 - 5)的I P数据报。

        3) 作为链路层广播的数据报。

        4) 不是I P分片的第一片(将在11 . 5节介绍分片)。

        5) 源地址不是单个主机的数据报。这就是说,源地址不能为零地址、环回地址、广播地址或多播地址。

二、ICMP详细报文说明

1.ICMP地址掩码请求与应答

        I C M P地址掩码请求用于无盘系统在引导过程中获取自己的子网掩码。系统广播它的I C M P请求报文(这一过程与无盘系统在引导过程中用 R A R P获取I P地址是类似的)。无盘系统获取子网掩码的另一个方法是 B O O T P协议,我们将在第 1 6章中介绍。 I C M P地址掩码请求和应答报文的格式如图6 - 4所示。

ICMP协议总结(TCP/IP详解卷1)一、简述二、ICMP详细报文说明 三、ping程序 四、ICMP协议内核实现

         I C M P报文中的标识符和序列号字段由发送端任意选择设定,这些值在应答中将被返回。这样,发送端就可以把应答与请求进行匹配。

2.ICMP时间戳请求与应答

        I C M P时间戳请求允许系统向另一个系统查询当前的时间。返回的建议值是自午夜开始计算的毫秒数,协调的统一时间( Coordinated Universal Time, UTC)(早期的参考手册认为U T C是格林尼治时间)。这种I C M P报文的好处是它提供了毫秒级的分辨率,而利用其他方法从别的主机获取的时间(如某些 U n i x系统提供的r d a t e命令)只能提供秒级的分辨率。由于返回的时间是从午夜开始计算的,因此调用者必须通过其他方法获知当时的日期,这是它的一个缺陷。

        I C M P时间戳请求和应答报文格式如图 6 - 6所示。

ICMP协议总结(TCP/IP详解卷1)一、简述二、ICMP详细报文说明 三、ping程序 四、ICMP协议内核实现

        请求端填写发起时间戳,然后发送报文。应答系统收到请求报文时填写接收时间戳,在发送应答时填写发送时间戳。但是,实际上,大多数的实现把后面两个字段都设成相同的值(提供三个字段的原因是可以让发送方分别计算发送请求的时间和发送应答的时间)。

3.ICMP端口不可达错误

        端口不可达是一种是差错报文,即端口不可达报文。

        U D P的规则之一是,如果收到一份 U D P数据报而目的端口与某个正在使用的进程不相符,那么U D P返回一个I C M P不可达报文。

ICMP协议总结(TCP/IP详解卷1)一、简述二、ICMP详细报文说明 三、ping程序 四、ICMP协议内核实现

         I C M P的一个规则是, I C M P差错报文(参见图 6 - 3的最后一列)必须包括生成该差错报文的数据报I P首部(包含任何选项),还必须至少包括跟在该 I P首部后面的前 8个字节。

        一个重要的事实是包含在 U D P首部中的内容是源端口号和目的端口号。就是由于目的端口号(8 8 8 8)才导致产生了 I C M P端口不可达的差错报文。接收 I C M P的系统可以根据源端口号(2 9 2 4)来把差错报文与某个特定的用户进程相关联(在本例中是 T F T P客户程序)。

        导致差错的数据报中的 I P首部要被送回的原因是因为 I P首部中包含了协议字段,使得I C M P可以知道如何解释后面的 8个字节。如果我们来查看 T C P首部(图1 7 - 2),可以发现源端口和目的端口被包含在 T C P首部的前8个字节中。

I C M P不可达报文的一般格式如图 6 - 1 0所示。

ICMP协议总结(TCP/IP详解卷1)一、简述二、ICMP详细报文说明 三、ping程序 四、ICMP协议内核实现

 I C M P报文是在发送U D P数据报3.5 ms后返回的,这与P i n g应答的往返时间差不多。

4.ICMP报文的4.4BSD处理

        由于I C M P覆盖的范围很广,从致命差错到信息差错,因此即使在一个给定的系统实现中,对每个I C M P报文的处理都是不相同的。图 6 - 1 2的内容与图6 - 3相同,它显示的是 4 . 4 B S D系统对每个可能的I C M P报文的处理方法。

ICMP协议总结(TCP/IP详解卷1)一、简述二、ICMP详细报文说明 三、ping程序 四、ICMP协议内核实现
ICMP协议总结(TCP/IP详解卷1)一、简述二、ICMP详细报文说明 三、ping程序 四、ICMP协议内核实现

        如果最后一列标明是“内核”,那么I C M P就由内核来处理。如果最后一列指明是“用户进程”,那么报文就被传送到所有在内核中登记的用户进程,以读取收到的 I C M P报文。如果不存在任何这样的用户进程,那么报文就悄悄地被丢弃(这些用户进程还会收到所有其他类型的I C M P报文的拷贝,虽然它们应该由内核来处理,当然用户进程只有在内核处理以后才能收到这些报文)。有一些报文完全被忽略。最后,如果最后一列标明的是引号内的一串字符,那么它就是对应的 U n i x差错。其中一些差错,如 T C P对发送端关闭的处理等,我们将在以后的章节中对它们进行讨论。

 三、ping程序

         P i n g程序由Mike Muuss编写,目的是为了测试另一台主机是否可达。该程序发送一份 I C M P回显请求报文给主机,并等待返回 I C M P回显应答。

1.ping程序请求和响应

        我们称发送回显请求的 p i n g程序为客户,而称被 p i n g的主机为服务器。大多数的 T C P / I P实现都在内核中直接支持 P i n g服务器—这种服务器不是一个用户进程。I C M P回显请求和回显应答报文如图 7 - 1所示。

ICMP协议总结(TCP/IP详解卷1)一、简述二、ICMP详细报文说明 三、ping程序 四、ICMP协议内核实现

         U n i x系统在实现p i n g程序时是把I C M P报文中的标识符字段置成发送进程的 I D号。这样即使在同一台主机上同时运行了多个 p i n g程序实例,p i n g程序也可以识别出返回的信息。

        序列号从0开始,每发送一次新的回显请求就加 1。p i n g程序打印出返回的每个分组的序列号,允许我们查看是否有分组丢失、失序或重复。 I P是一种最好的数据报传递服务,因此这三个条件都有可能发生。

ICMP协议总结(TCP/IP详解卷1)一、简述二、ICMP详细报文说明 三、ping程序 四、ICMP协议内核实现
ICMP协议总结(TCP/IP详解卷1)一、简述二、ICMP详细报文说明 三、ping程序 四、ICMP协议内核实现

 ping使用方法:

ICMP协议总结(TCP/IP详解卷1)一、简述二、ICMP详细报文说明 三、ping程序 四、ICMP协议内核实现

 四、ICMP协议内核实现

        图11 - 1显示了所有目前定义的I C M P报文。双线上面的是I C M P请求和回答报文;双线下面的是I C M P差错报文。

ICMP协议总结(TCP/IP详解卷1)一、简述二、ICMP详细报文说明 三、ping程序 四、ICMP协议内核实现

 图11 - 1和图11 - 2中含有大量信息:

  • P R C _栏显示了N e t / 3处理的与协议无关的差错码( 11 . 6节)和I C M P报文之间的映射。对请求和回答,这一列是空的。因为在这种情况下不会产生差错。如果对一个 I C M P差错,这一行为空,说明N e t / 3不识别该码,并自动丢弃该差错报文。
  • 图11 - 3显示了我们讨论图11 - 2所列函数的位置。
  • i c m p _ i n p u t栏是i c m p _ i n p u t为每个I C M P报文调用的函数。
  • UDP栏是为U D P插口处理I C M P报文的函数。
  • T C P栏是为T C P插口处理I C M P报文的函数。注意,是 t c p _ q u e n c h处理I C M P源站抑制差错,而不是t c p _ n o t i f y。
  • 如果e r r n o栏为空,内核不向进程报告 I C M P报文。
  • 表的最后一行显示,在用于接收 I C M P报文的进程的接收点上,不识别的 I C M P报文被提交给原来的I P协议。

在N e t / 3中,I C M P是作为I P之上的一个运输层协议实现的,它不产生差错或请求;它代表其他协议格式化并发送报文。 I C M P传递到达的差错,并向适当的传输协议或等待 I C M P报文的进程发出回答。另一方面, I C M P用一个合适的I C M P回答响应大多数I C M P请求。图11 - 4此作了总结。

ICMP协议总结(TCP/IP详解卷1)一、简述二、ICMP详细报文说明 三、ping程序 四、ICMP协议内核实现
ICMP协议总结(TCP/IP详解卷1)一、简述二、ICMP详细报文说明 三、ping程序 四、ICMP协议内核实现
ICMP协议总结(TCP/IP详解卷1)一、简述二、ICMP详细报文说明 三、ping程序 四、ICMP协议内核实现

 1.代码介绍

图 11 - 5 的两个文件中有本章讨论的 I C M P 数据结构、统计量和处理的程序

ICMP协议总结(TCP/IP详解卷1)一、简述二、ICMP详细报文说明 三、ping程序 四、ICMP协议内核实现
ICMP协议总结(TCP/IP详解卷1)一、简述二、ICMP详细报文说明 三、ping程序 四、ICMP协议内核实现
ICMP协议总结(TCP/IP详解卷1)一、简述二、ICMP详细报文说明 三、ping程序 四、ICMP协议内核实现
ICMP协议总结(TCP/IP详解卷1)一、简述二、ICMP详细报文说明 三、ping程序 四、ICMP协议内核实现
ICMP协议总结(TCP/IP详解卷1)一、简述二、ICMP详细报文说明 三、ping程序 四、ICMP协议内核实现
ICMP协议总结(TCP/IP详解卷1)一、简述二、ICMP详细报文说明 三、ping程序 四、ICMP协议内核实现
ICMP协议总结(TCP/IP详解卷1)一、简述二、ICMP详细报文说明 三、ping程序 四、ICMP协议内核实现

继续阅读