1第9章因特网控制报文协议(ICMP)知识点ICMP的概念和功能ICMP报文—差错报文/查询报文的功能以及ICMP的工作原理ICMP应用与Ping、Tranceroute和MTU的测试ICMP引起的黑客隐患2IP协议是TCP/IP协议使用的传输机制,它是一种不可靠的无连接的数据报协议,但是IP协议假定了底层是不可靠的,因此,要尽最大的努力传输到目的地,但正因为如此,IP协议则没有了保证,也就是说,它并没有提供检验或跟踪机制。Internet控制报文协议ICMP(InternetControlMessageProtocol)所以,ICMP设计的本意就是希望对IP包无法传输时提供报告,这些差错报告帮助了发送方了解为什么无法传递,网络发生了什么问题,确定应用程序后续操作。注意:IP中有关于差错检测的机制——用于检测传输错误。3ICMP具有如下一些特征:•ICMP就像一个更高层的协议那样使用IP(即,ICMP消息被封装在IP数据报中)。然而,ICMP是IP的一个组成部分,并且所有IP模块都必须实现它。•ICMP用来报告错误,是一个差错报告机制。它为遇到差错的路由器提供了向最初源站报告差错的办法,源站必须把差错交给一个应用程序或采取其它措施来纠正问题。4•ICMP不能用来报告ICMP消息的错误,这样就避免了无限循环。当ICMP查询消息时通过发送ICMP来响应。•对于被分段的数据报,ICMP消息只发送关于第一个分段中的错误。也就是说,ICMP消息永远不会引用一个具有非0片偏移量字段的IP数据报。•响应具有一个广播或组播目的地址的数据报时,永远不会发送ICMP消息•响应一个没有源主机IP地址的数据报时永远不会发送ICMP消息。总的来说,源地址不能为0、一个回送地址、一个广播地址或者一个组播地址。这些是为了防止过去允许ICMP差错报文对广播分组相应所带来的广播风暴。5•ICMP的两级封装每个ICMP报文放在IP数据报的数据部分中通过互联网传递,而IP数据报本身放在帧的数据部分中通过物理网络传递。ICMP首部ICMP数据IP数据报首部IP数据报数据区帧首部帧数据区6ICMP报文格式ICMP报文有一个8字节的首部和一个可变长度的数据部分。前4个字节对所有的类型都是共同的,第一个8比特字段是ICMP的类型,它定义了报文的类型。代码字段指明了发送此特定报文类型的原因。最后一个共同的字段是检验和字段。首部的其余部分对每一种报文类型都是特定的。ICMP定义了五种常用差错报文和六种询问报文类型,以及用代码表达某类型下面不同情况的细分。类型代号校验和ICMP数据(取决于消息类型)………………ICMP-报文格式用来标识报文,有15个不同的值提供有关报文类型的进一步信息覆盖整个ICMP报文差错报告报文的类型有一下几个:•类型3:目的站不可达•类型4:源站抑制•类型11:时间超过•类型12:参数问题•类型5:改变路由查询报文的类型有一下几个:•类型8或0:回送请求或回答•类型13或14:时间戳请求或回答•类型17或18:地址掩码请求或回答•类型10或9:路由器询问或通告78ICMP主要差错报文类型代码校验和路由器互联网地址IP数据报首部+数据的前64比特…………………………….所有ICMP差错报告报文中的数据字段都具有同样的格式。将收到的需要进行差错报告的IP数据报的首部和数据字段的前8个字节提取出来,作为ICMP报告的数据字段。再加上相应的ICMP差错报告报文的前8个字节,就构成了ICMP差错报告报文。提取收到的数据报的数据字段的前8个字节是为了得到运输层的端口号(对于TCP和UDP)以及运输层报文的发送序号(对于TCP)9•重定向Redirect(5)当一个源主机创建的数据报发至某路由器,该路由器发现数据报应该选择其他路由,则向源主机发送改变路由报文。改变路由的报文能指出网络或特定主机的变化,一般发生在一个网络连接多路由器的情况下。IP数据报首部ICMP的前8个字节8字节IP数据报首部8字节首部ICMP差错报告报文收到的IP数据报ICMP差错报告报文装入ICMP报文的IP数据报10下面对改变路由报文进行简短的解释:在因特网中各路由器之间要经常交换路由信息,以便动态更新各自的路由表。但在因特网中主机的数量远大于路由器的数量。主机如果也像路由器那样经常交换路由信息,就会产生很大的附加通信量,因而大大浪费了网络资源。所以,出于效率的考虑,连接在网络上的主机的路由表一般都采用人工配置,并且主机不和连接在网络上的路由器定期交换路由信息。在主机刚开始工作时,一般都在路由表中设置了一个默认路由器的IP地址。不管数据报要发送到哪个目的地址,都一律先将数据报传送给网络上的这个默认路由器,而这个默认路由器知道到每一个目的网络的最佳路由。如果默认路由器发现主机发往某个目的地址的数据报的最佳路由不应当经过默认路由器,而是应当经过网络上的另一个路由器R时,就用改变路由报文将此情况报告主机。于是,该主机就在其路由表中增加一项:到某某目的地址应经过路由器R(而不是默认路由器)。虽然改变路由报文算是一种差错报文,但是它与其他种差错报文的不同。在这种情况下的路由器不丢弃数据报;数据报被送到适当的路由器中。它的代码段缩小了改变路由的范围:代码0:对特定网络路由的改变代码1:对特定主机路由的改变代码2:基于指明的服务类型对特定网络路由的改变代码3:基于指明的服务类型对特定主机路由的改变11•目的站不可达DestinationUnreachable(3)当路由器检测到数据报无法传递到目的地时,向创建数据报的源主机发出目的地不可达报文。这报文区分:网络不通(如路由器故障),目的主机连不通(没开机),协议不可达、端口不可达、以及共15种不同的情况,用不同代码表示。•代码0.网络不可达,可能是硬件故障。这种类型的报文只能由路由器产生。•代码1.主机不可达,这也可能是硬件故障。这种类型的报文只能由路由器产生。•代码2.协议不可达,IP数据报携带的数据可能属于高层协议的。若目的主机收到了一个数据报文,但是此时,这个高层协议并未运行,则发出代码2的报文。这类报文只能由目的主机产生。(主机收到了一个数据报,它要交给TCP协议,但是TCP协议并没有运行)•代码3.端口不可达,数据要交付的那个应用程序(进程)此时未运行。•代码4.需要进行分片,但该数据报的DF(不分片)字段已经被设置。(数据报的发送站已经指明该数据报不能分片,但是不进行分片又不可能进行路由选择)•代码5.源站路由选择不能完成。换言之,在这个源站路由选择选项中定义的一个或多个路由器无法通过。•代码6.目的网站不可知,路由器根本没有关于目的网络的信息。•代码7.目的主机不可知,路由器根本不知道网络主机的存在。•代码8.源主机是孤立的。•代码9.与目的网络的通信从管理上是禁止的。•代码10.与目的主机的通信从管理上是禁止的。•代码11.对指明的服务类型,网络不可达。如果源站被请求一个可用的服务类型,路由器可以为数据报找到另一条路由。•代码12.对指明的服务器类型,主机不可达。如果源站被请求一个可用的服务类型,路由器可以为数据报找到另一条路由。•代码13.主机不可达,因为管理机构放置了一个过滤器在它上面。•代码14.主机不可达,因为主机的优先级被破坏了。这个报文由路由器发出,指出锁清秋的优先级对该目的站是不允许的。•代码15.主机不可达,因为它的优先级被删掉了。(当网络操作员已经采用了运行该网络的最小优先级时就产生这个报文,但是这个数据报以比这个优先级更低的优先级发送出去)但是有两点要注意:目的站不可达的报文可以由路由器也可以由目的主机产生,代码2和3的报文只能由目的主机产生,而其余的报文则只能由路由器产生。在路由器没有发送目的站不可达报文时,也不一定表示数据报已经交付了。(如果数据报通过以太网网络,那么路由器就无法知道该数据报是否已经交付给目的主机或者下一个路由器,因为以太网并不提供任何确认机制),且路由器无法检测处分组没有交付的所有的问题1213•源站抑制SourceQuench(4)•当路由器收到太多的数据报以致内存不够时,在丢弃所收数据报的同时,向创建数据报的源主机发送源抑制报文。源主机收到源抑制报文后,需要降低发送数据报的速率。•当路由器或者主机因为拥塞而丢弃了一个数据报时,它就向数据报的发送站发送源站抑制报文。这个报文有两个目的:第一,它通知源站数据报已经被丢弃。第二,它警告源站,在路径中的某处出现了拥塞,因而源站必须放慢发送过程。•下面几点要注意:•经受拥塞的路由器或者目的主机必须为每一个丢弃的数据报向源主机发送源站抑制报文。•没有一种机制可以告诉源站,拥塞程度已经减轻,因为可以按照原来的速率发送数据报。源站应继续降低发送速率,直到不再收到更多的源站抑制报文为止。•在一对一的通信,或者多对一的通信中,都可以产生拥塞。在一对一的通信中,每个高速主机可以很快地产生数据报,使得路由器和主机难于跟得上处理。这种情况下,源站抑制报文就有用处了,这些报文告诉了源站要放慢发送速率。而在多对一的通信中,许多个源站产生的数据报都必须由路由器或目的主机来处理。在这种情况下,有的会以低速率发送而有的则以高速率发送,这就导致了源站抑制报文在发送后,路由器或主机并不知道哪一个源站应对拥塞负责。它可能丢弃从不非常低速率的源站法来的数据报,而没有丢弃真正产生拥塞的源站所发来的数据报。1415•超时TimeExceeded(11)有两种情况需要发送超时报文。一种是路由器把数据报的生存时间减至零时,路由器丢弃数据报,并向源主机发送超时报文;另一种是在规定的时间内没有收到所有的分片时,它就丢弃所有的分片,并向源站发送了超时报文。代码段就是:代码0:当数据报的生存时间字段的值为零被路由器丢弃代码1:在固定的时间内分片未能到达而导致分片被丢弃•参数问题ParameterProblem:数据报头部的标志出现差错,或缺少必须的选项代码端是:代码0:在首部的一个字段中有差错或二义性。在这种情况下,指针字段的值指向有问题的机子。代码1:表示缺少所需的选项部分。在这种情况下,不使用指针类型代码(0)检验和标识符序列号可选数据有请求报文发送:由回答报文重复•类型中类型8代表回送请求请求0代表回送回答•主机或路由器可以发送回送请求报文给另一个主机或路由器。收到回送请求报文的主机或路由器创建回送回答报文,并将其返回给原来的发送者。•这种报文主要用来测试目的站是否可达以及了解其有关的状态。Ping服务就是采用这个报文来获得两个主机之间的连通性①请求/应答EchoRequest/Reply:可以对任何一台网上主机的ICMP软件发请求/应答报文。ICMP常用查询报文②地址掩码请求/应答AddressMaskRequest/Reply:主机启动时,会广播一个地址掩码请求报文。路由器收到地址掩码请求报文后,回送一个包含本网使用的32位地址掩码的应答报文。类型代码(0)检验和标识符序列号32位子网掩码•类型中类型17是请求而类型18是回答•ICMP地址掩码请求用于无盘系统在引导过程中获取自己子网掩码•主机的IP地址包括网络地址、子网地址和主机标识符。主机可能知道它的完整IP地址,但也可能不知道地址中的哪一部分定义网络地址和子网地址,以及哪一部分对应于主机标识符。这个时候就需要掩码。要得到掩码,主机应发送地址掩码请求报文给局域网上的路由器。若主机知道该路由器的地址,它将就这个请求直接发送给该路由器。若主机不知道,则要广播此报文。路由器收到地址掩码请求报文就响应地址掩码回答报文,向主机提供所需的掩码。③时间戳请求/应答TimestampRequest/Reply:主机发出查询当前时间的请求,应答报文建议值是自午夜开始计算的毫秒数,UTC(CoodinatedUniversaltime,协调统一时间)。类型代码(0)检验和标识符序列号发起时间戳接收时间戳传送时间戳•该ICMP报文的作用主要是使主机或路由器可使用时间戳请求和时间戳回答来确定IP数据报在这两个机器之间来往所需的往返时间,它也可作