第六章差错与控制报文(ICMP)2§6-1引言IP缺少差错控制缺少辅助机制ICMPInternetControlMessageProtocol(因特网控制报文协议)ICMP就是为了补偿上述两个缺点而设计的它配合IP协议一起使用Standards:RFC792:InternetControlMessageProtocol,1981RFC1256:ICMPRouterDiscoveryMessages,19913ICMP的位置及封装IPICMPIGMPARPRARPNetworklayerICMPmessageIPheaderIPdataFramedataTrailer(如果有)FrameheaderICMPmessageIPheaderIPdataICMP本身是一个网络层协议ICMP报文首先要封装成IP数据报,然后再传送给下一层4§6-2报文格式代码检验和首部的其余部分数据部分类型8bits8bits16bits5ICMP报文中各字段的作用类型:是一个8比特长字段,定义了报文的类型。代码:是一个8比特长字段,指明了发送此特定报文类型的原因。检验和:是一个16比特长字段,进行差错检验。首部的其余部分:对每一种报文类型都是特定的。数据部分:在差错报文中:所携带的信息可找出引起差错的原始分组;在查询报文中:携带了基于查询类型的额外信息。6§6-3报文的类型ICMP报文差错报告查询报告路由器或主机(目的站)在处理一个IP数据报时可能遇到的一些问题帮助主机或网络管理员从一个路由器或另一个主机得到特定的信息它是成对出现的7ICMPMessages种类类型报文Reason差错报告报文3目的站不可达4源站抑制11时间超过Toolongroute12参数问题Formaterror5重定向(改变路由)Routechanged查询报文8or0回送请求或应答Reachability13or14时间戳请求或应答Synchronization17or18地址掩码请求或应答Maskmaintenance10or9路由器恳求(solicitation)或通告(advertisement)Coincidencebetweenrouters8§6-4差错报告差错报告目的站不可达源站抑制时间超过参数问题改变路由ICMP不能纠正差错,它只是报告差错。ICMP总是向原始的数据源报告差错报文。以下情况不产生ICMP差错报文:对于携带ICMP差错报文的数据报,不再产生ICMP差错报文;对于分片的数据报,如果不是第一个分片则不产生ICMP差错报文;对于具有多播地址的数据报,不产生ICMP差错报文;对于具有特殊地址的(如127.0.0.0或0.0.0.0)的数据报,不产生ICMP差错报文。9差错报文的数据字段的内容IPheader8bytesIPdataIPheader8bytesICMP分组ICMPheaderIPheader8bytes发送的IP数据报ICMPheaderIPheader收到的数据报所有的差错报文都包括一个数据部分,而这个数据部分包括原始数据报的首部,再加上数据报中的前8个字节的数据。加上原始数据报中的首部就可给出原始信源。要包括数据的前8个字节是因为这前8个字节提供了关于端口号(UDP和TCP)和序号(TCP)的信息,因而源站可以将差错情况通知这些协议(UDP或TCP)。10(一)目的站不可达代码:0至15检验和未使用(全0)收到的IP数据报的一部分,包括IP首部以及数据报数据的前8个字节类型:3产生原因:当路由器不能够给数据找到路由或主机不能够交付数据报时,就丢弃这个数据报,然后这个路由器或主机就发回目的站不可达报文给发出该数据报的源主机。11各代码的作用代码0:网络不可达。可能是硬件故障。代码1:主机不可达。这也可能是硬件故障。代码2:协议不可达。IP数据报携带的数据可能属于高层协议,但此时高层协议并未运行,于是就发送出代码为2的报文。代码3:端口不可达。数据报要交付的那个应用程序(进程)此时未运行。代码4:需要进行分片,但该数据报的DF(不分片)字段已被设置。代码5:源站路由选择不能完成。即在这个源站路由选择选项中定义的一个或多个路由器无法通过。代码6:目的网络不可知。(与代码0不同)代码7:目的主机不可知。(与代码1不同)代码8:源主机是孤立的。12各代码的作用(续)代码9:与目的网络的通信从管理上是禁止的。代码10:与目的主机的通信从管理上是禁止的。代码11:对所请求的服务类型,网络不可达。(与代码0不同)代码12:对所请求的服务类型,主机不可达。(与代码1不同)代码13:主机不可达。因为管理机构放置了一个过滤器在它上面。代码14:主机不可达。因为主机的优先级被破坏了。这个报文由路由器发出,指出所请求的优先级对该目的站是不允许的。代码15:主机不可达。因为它的优先级被删掉了。13说明:有0至15种代码指明了产生目的站不可达差错报文的原因。目的站不可达报文可以由路由器也可以由目的主机产生。具有代码2或3的目的站不可达报文只能由目的主机创建,其余的目的站不可达报文只能由路由器创建。甚至在路由器没有发送目的站不可达报文时,与不一定表示数据报已经交付了。即路由器无法检测出分组没有交付的所有问题。14(二)源站抑制代码:0检验和未使用(全0)收到的IP数据报的一部分,包括IP首部以及数据报数据的前8个字节类型:4产生原因:IP在协议中没有嵌入的流控制机制。在运行IP时,缺乏流控制会产生一个主要问题:拥塞。若数据报的接收速率比它们被转发或处理的速率快得多,则队列将会溢出。这样,路由器或主机别无选择,只能将某些数据报丢弃。15说明:源站抑制报文通知源站,由于拥塞在路由器或目的主机中已经丢弃了数据报。源站必须放慢数据报的发送,直到拥塞程度减轻为止。对每一个由于拥塞而被丢弃的数据报,都应当发送源站抑制报文。没有机制告诉源站拥塞程度已经减轻。主机收到对目的站D的源站抑制报文,就会降低它向D发送数据报的速率,直到它停止收到源站抑制报文。然后,只要没有再收到源站抑制请求,就会逐渐提高发送速率。16(三)时间超过代码:0至1检验和未使用(全0)收到的IP数据报的一部分,包括IP首部以及数据报数据的前8个字节类型:11产生原因:当路由器收到一个数据报,发现TTL字段的值已经变为了0,就将此数据报丢弃,并向源站发送时间超过报文。当组成一个报文的所有分片未能在某一时限内到达目的主机时,它就丢弃已收到的分片,然后也要产生时间超过报文向源站发送。17说明:当数据报的生存时间字段的值为零而被路由器丢弃时,就使用代码0。在时间超过报文中,代码0只能由路由器使用。它表示生存时间字段的值为零。由于在规定的时限内一数据报的某些分片未能到达而导致已到达分片被丢弃时,就使用代码1。在时间超过报文中,代码1只能由目的主机使用。它表示在规定的时限内,不是所有的分片都到达了。18(四)参数问题产生原因:如果路由器或目的主机发现一个数据报的首部有二义性,或某个字段缺少某个值,它就丢弃这个数据报,并发送参数问题报文。代码:0至1检验和未使用(全0)收到的IP数据报的一部分,包括IP首部以及数据报数据的前8个字节类型:12指针19说明:路由器或目的主机可以创建参数问题报文。代码0:在首部的一个字段中有差错或二义性。在这种情况下,指针字段的值指向有问题的字节。代码1:表示缺少所需的选项部分。在这种情况下,不使用指针。20(五)改变路由代码:0至3检验和目标路由器的IP地址收到的IP数据报的一部分,包括IP首部以及数据报数据的前8个字节类型:5产生原因:主机通常使用静态路由选择,当主机开始联网工作时,其路由表中的项目数很有限,通常只有一个默认路由器的IP地址。这样,当主机向另一个网络发送数据报时,就将此数据报发给了这个错误的路由器。在这种情况下,收到此数据报的路由器会将该数据报转发给正确的路由器。但要更新主机中的路由表,就要由路由器发送改变路由报文。21说明:主机在开始工作时只有很小的路由表,它逐渐增大和更新,完成此工作的工具之一就是改变路由报文。改变路由报文是由路由器向同一个本地网络上的主机发送的。虽然改变路由报文是一种差错报告报文,但这种情况下路由器不丢弃数据报。改变路由报文的代码字段缩小了改变路由的范围:代码0:对特定网络路由的改变。代码1:对特定主机路由的改变。代码2:基于指明的服务类型对特定网络路由的改变。代码3:基于指明的服务类型对特定主机路由的改变。22改变路由的概念主机A打算向主机B发送数据报。路由器R2显然是最有效的路由选择,但主机A没有选择R2,而是向R1发送。这时:NetworkNetworkHostAHostBR1R2IP分组改变路由报文23§6-5查询查询回送请求和回答时间戳请求和回答地址掩码请求和回答路由器询问和通告24(一)回送请求和回答代码:0检验和可选数据(由请求报文发送,由回答报文重复)类型:8or0标识符序号8:回送请求0:回送回答25说明:主机或路由器可以发送回送请求报文,收到回送请求报文的主机或路由器发送出回送回答报文。回送请求和回送回答报文可由网络管理员来使用,用来检查IP协议的工作情况。用回送请求和回送回答报文可测试一个主机的可达性,通常是调用ping命令来这样做的。格式中的标识符和序号字段在协议中没有正式定义,可以由发送站任意使用。可供选择的数据字段包含一个报文,它必须由回答的结点在回送回答报文中完全一样的重复。26(二)时间戳请求和回答代码:0检验和类型:13or14标识符序号13:请求14:回答原始时间戳接收时间戳发送时间戳27说明:两个机器(主机或路由器)可使用时间戳请求和时间戳回答报文来确定IP数据报在这两个机器之间来往所需的往返时间。它也可以用作两个机器中时钟的同步。发送时间=接收时间戳的值-原始时间戳的值接收时间=分组返回的时间-发送时间戳的值往返时间=发送时间+接收时间28(三)地址掩码请求和回答代码:0检验和类型:17or18标识符序号17:请求18:回答地址掩码29(四)路由器询问和通告代码:0检验和类型:10标识符序号代码:0检验和类型:9地址号寿命路由器地址1优先级1地址大小路由器地址2优先级230说明:路由器询问和通告报文使得主机可以知道连接到它自己的网络上的路由器的地址,还可以知道这些路由器是否正常工作。主机可将路由器询问报文进行广播(或多播)。收到询问报文的一个或几个路由器就使用路由器通告报文广播其路由选择信息。在没有主机询问时,路由器还可以周期性的发送路由器通告报文。优先级定义了路由器的等级。31§6-6检验和发送端的检验和计算:先将首部的检验和字段置为0。将分组划分为K部分,每部分都是16比特长。用反码算术运算将所有这些部分相加。将最终结果取反码就得出检验和。再将其填入检验和字段。接收端的检验和计算:将收到的分组划分为K部分,每部分都是16比特长。用反码算术运算将所有这些部分相加。将得到的结果取反码。若结果为0,则接收此分组,否组就拒绝此分组。在ICMP中,检验和的计算覆盖了整个报文(首部和数据)。