第6章差错与控制报文协议6.1因特网控制报文协议6.2ICMP报文格式与类型6.3ICMP差错报告6.4ICMP控制报文6.5ICMP请求与应答报文对6.6ICMP报文封装6.1因特网控制报文协议(ICMP)ICMP协议设计的最初目的主要是用于IP层的差错报告,由路由器或信宿以一对一的模式向信源报告传输错误的原因。随着网络的发展,检测和控制功能逐渐被引入到ICMP协议中,使得ICMP协议不仅用于传输差错报告,而且大量用于传输控制报文。ICMP与IP协议位于同一个层次(IP层),但ICMP报文是封装在IP数据报的数据部分进行传输的。ICMP协议是IP协议的补充,用于IP层的差错报告、拥塞控制、路径控制以及路由器或主机信息的获取。返回6.2ICMP报文格式与类型ICMP报文由首部和数据段组成。首部为定长的8个字节,前4个字节是通用部分,后4个字节随报文类型的不同有所差异。ICMP报文的一般格式如图所示。校验和代码数据081631类型首部其他部分首部数据8字节图6-1ICMP报文格式ICMP报文虽然细分为很多类,但总的来看可以分为如图所示的三大类:差错报告、控制报文和请求应答报文。ICMP报文图6-2ICMP报文种类差错报告控制报文请求应答报文信宿不可达报告数据报超时报告数据报参数错报告源抑制报文重定向报文回应请求与应答报文地址掩码请求与应答报文路由器请求与通告报文时间戳请求与应答报文返回6.3ICMP差错报告ICMP差错报告的数据区包含出错数据报的首部及该数据报的前64位数据,这些信息有助于信源或管理人员发现错误原因。ICMP差错报告具有以下特点:1)只报告差错,但不负责纠正错误,纠错工作留给高层协议去处理。2)发现出错的设备只向信源报告差错。3)差错报告作为一般数据传输,不享受特别优先权和可靠性。4)产生ICMP差错报告的同时,会丢弃出错的IP数据报。形成ICMP差错报告时有以下例外:1)ICMP差错报文本身不会再产生ICMP差错报告。2)分片报文的非第一个分片不会产生ICMP差错报告。3)组播地址报文不会产生ICMP差错报告。4)特殊地址127.0.0.0和0.0.0.0的报文不会产生ICMP差错报告。6.3.1信宿不可达报告当路由器无法根据路由表转发IP数据报时或主机无法向上层协议和端口提交IP数据报时,将丢弃当前的数据报,并产生信宿不可达差错报告,向信源报告出错。信宿不可达报文如图所示。校验和代码:0-15出错数据报的部分信息(IP数据报首部+数据报数据部分的前64位)081631类型:3未用(全0)首部数据8字节图6-3ICMP信宿不可达报文格式信宿不可达报文可能由路由器产生,也可能由信宿机产生。产生信宿不可达报文的原因的16种可能:类型报文代码描述3信宿不可达0网络不可达1主机不可达2协议不可达3端口不可达4数据报无法分片5源路由失败6信宿网络未知7信宿主机未知8源主机被隔离9与信宿网络的通信被禁止10与信宿主机的通信被禁止11对特定的服务类型(TOS)网络不可达12对特定的服务类型(TOS)主机不可达13因管理者设置过滤而使主机不可达14因非法的优先权而使主机不可达15因报文的优先级低于网络设置的最小优先级而使主机不可达6.3.2数据报超时报告在数据报的传输过程中,首部的TTL值用于防止数据报因路由表的问题而无休止地在网络中传输。当TTL值为0时,路由器会丢弃当前的数据报,并产生一个ICMP数据报超时报告。另外。在信宿进行分片重组时会启动重组定时器,一旦重组定时器超时,信宿就会丢弃当前正在重组的数据报,然后产生一个ICMP数据报超时报告,并向信源发送该超时报告。数据报超时报告的报文格式与信宿不可达报告的报文格式相同,只是类型和代码值不同。数据报超时报告的类型和代码的含义如表所示。类型值11表示是数据报超时报文,代码“0”表示TTL超时,代码“1”表示分片重组超时。类型报文代码描述11超时0路由TTL超时1分片重组超时6.3.3数据报参数错报告数据报参数错报告是由数据报首部字段值不明确或空缺而引起的差错报告。一旦路由器或信宿机发现错误的数据报首部和错误的数据报选项参数时,便抛弃该数据报,并向信源发送差错报告报文。数据报参数错报文的格式如图6-4所示。校验和代码:0/1出错数据报的部分信息(IP数据报首部+数据报数据部分的前64位)081631类型:12未用(全0)首部数据8字节图6-4ICMP参数错报文格式指针类型12表明数据报参数错代码“0”表示数据报首部中的某个字段的值有错或不明确,这时ICMP报文首部的指针指向数据报中有问题的字节;代码“1”表示数据报首部中缺少某一选项所必须具有的部分参数,此时的ICMP报文没有指针字段。表6-3给出了数据报参数错报告的类型。代码为“0”的参数错只能报告一个出错参数代码为“1”的参数错只能报告缺少参数,不能说明缺少哪个参数。类型报文代码描述12参数错0IP首部参数错1缺少选项所要求的部分返回6.4ICMP控制报文ICMP控制报文包括源抑制报文和重定向报文源抑制报文——用于拥塞控制重定向报文——用于路径控制下表给出了这两类报文的类型和作用描述。类型作用代码描述4拥塞控制0源抑制报文5路径控制0网络重定向1主机重定向2基于服务类型的网络重定向3基于服务类型的主机重定向6.4.1源抑制报文IP协议采用的是无连接数据报方式进行传输发送方事先并不了解中间的路由器和信宿的处理能力和缓冲区大小在数据报传输过程中没有采用任何流量控制机制当大量的数据报进入路由器或信宿时,会造成缓冲区溢出,即出现拥塞(Congestion)。ICMP利用源抑制的方法来进行拥塞控制。通过源抑制来减缓信源发出数据报的速率。源抑制报文的格式如图6-5所示。校验和代码:0引起源抑制的数据报的部分信息(IP数据报首部+数据报数据部分的前64位)081631类型:4未用(全0)首部数据8字节图6-5ICMP源抑制报文格式源抑制包括三个阶段:发现拥塞阶段、解决拥塞阶段和恢复阶段。在发现拥塞阶段,路由器对缓冲区进行监测,一旦发现拥塞,立即向相应的信源发送ICMP源抑制报文。该信源收到源抑制报文后,便知道拥塞已经发生,而且所发送的数据报已经丢掉。在解决拥塞阶段,信源根据收到的源抑制报文中所带的原数据报的首部信息决定对去往某一特定信宿的信息流进行抑制。通常信源在收到源抑制报文后,按一定的规则降低发往某信宿的数据报传输率。拥塞解除后,信源逐渐恢复数据报传输速率。在拥塞控制中以下几点值得关注:1)虽然对于每个因拥塞而丢弃的数据报都产生ICMP源抑制报文,但信源只按照自己的时间段进行响应。2)拥塞的解除由信源依据是否有进一步的源抑制报文到达来进行判断。3)拥塞可能是由多个源共同行为的结果,由于各个信源的发送速率相差较大,源抑制的效果未必很好。6.4.2重定向报文因特网上的路由器和主机中都存有一个路由表,路由表决定了去往目的地的下一跳路由器的地址。路由器上的路由表能够及时地反映网络结构的变化,这一特点由路由器之间定期交换路由信息加以保证。主机因为不能保证全天开机,所以主机中的路由表不能及时反映网络结构的变化情况。另外,由于因特网上的主机数量远大于路由器的数量,主机如果参与路由信息的交换,势必带来大量的通信开销。因此主机中的路由表不通过路由协议进行更新。但主机所在的网络可能和多个路由器相连,主机在发送信息时也要根据其路由表来选择下一跳路由器,为了解决主机路由表的刷新问题,ICMP提供了重定向机制。主机路由表所给出的下一跳路由器可能并非去往信宿的最佳下一跳路由器,当主机的下一跳路由器收到数据报后,该路由器根据它的路由表判断本路由器是否是去往信宿的最佳选择,如果不是,该路由器仍然会向信宿网络转发该数据报,但在转发的同时会产生一个ICMP重定向报文,通知信源修改它的路由表,重定向报文中将给出信源最佳下一跳路由器的IP地址。主机A根据重定向报文修改路由表的例子。图6-6ICMP重定向192.168.6.0192.168.6.1192.168.8.12192.168.6.2网络下一跳196.168.8.0196.168.6.1192.168.8.0AB网络下一跳196.168.8.0196.168.6.2192.168.6.5重定向R1R2ICMP重定向报文的格式如图所示。代码从0到3分别代表不同的重定向方式,具体含义由前面的表6-4给出。主机开机后在ICMP重定向机制的作用下,经过不断积累逐渐充实和完善其路由表。动态且优化校验和代码:0-3引起重定向的数据报的部分信息(IP数据报首部+数据报数据部分的前64位)081631类型:5目标路由器的IP地址首部数据8字节图6-7ICMP重定向报文格式值得注意的是:1)ICMP产生重定向报文的时候并不丢弃原数据报。2)ICMP重定向报文由位于同一网络的路由器发送给主机,完成对主机的路由表的刷新。3)被刷新的路由表项与重定向报文数据部分指示的IP数据报首部中的信宿地址相关。内容为重定向报文中目标路由器的IP地址。返回6.5ICMP请求与应答报文对ICMP请求与应答报文对的出现使得因特网上的任何主机或路由器可以向其他主机或路由器发送请求并获得应答。通过ICMP请求与应答报文对,网络管理人员、用户或应用程序可以对网络进行检测,了解:设备的可达性地址掩码的设置时钟的同步等情况目的是利用这些有用的信息,对网络进行故障诊断和控制。ICMP请求与应答报文对如表6-5所示。其中的信息请求与应答报文已经不再使用。类型作用代码报文8回应请求与应答0回应请求00回应应答10路由器请求与通告0路由器请求90路由器通告13时间戳请求与应答0时间戳请求140时间戳应答15信息请求与应答(已不用)0信息请求160信息应答17地址掩码请求与应答0地址掩码请求180地址掩码应答6.5.1回应请求与应答报文回应请求与应答报文的目的是对网络进行诊断和测试。回应请求与应答不仅可以被用来测试主机或路由器的可达性,还可以测试IP协议的工作情况。TCP/IP网络系统所提供的ping命令大多是利用ICMP回应请求与应答报文来实现的,该命令通常用于测试信宿的可到达性。ICMP回应请求与应答报文的格式如图所示。类型“8”表明是回应请求报文类型“0”表明是回应应答报文协议未对标识符和序列号字段进行正式定义,通常将标识符和序列号用于匹配请求与应答,标识符一般为发起请求进程的进程ID。回应请求与应答报文的标识符和序列号一致。校验和代码:0由发送方指定数据接收方照原样返回081631类型:8/0标识符首部数据8字节图6-8ICMP回应请求与应答报文格式序列号6.5.2时间戳请求与应答报文因特网中的各个主机和路由器都是独立运行的,因此在时钟上存在着较大的差异,而一些分布式应用系统要求各个设备的时钟是同步的,ICMP时间戳请求与应答报文就是用于设备间进行时钟同步的报文对。用时间戳请求与应答报文进行时钟同步的基本思路是请求方主机通过获取另一主机的时间戳信息,将该信息和请求方主机的时间戳信息进行比较后,估算两者的时钟差异。请求/应答格式如图。类型13:请求报文,类型14:应答报文。初始时间戳字段用于指示请求方发出请求的时间接收时间戳字段用于指示应答方主机收到请求的时间发送时间戳字段用于指示应答方主机发送应答的时间三个时间戳字段各为32比特长,以毫秒为单位从世界时间午夜0点起计时。时间戳的计数值不能超过86400000(24小时)。请求报文:填初始时间戳,接收时间戳和发送时间戳为0。应答报文:初始时间戳直接从请求报文中复制,接收时间戳和发送时间戳由应答方主机根据自己接收和发送时的时钟填写。校验和代码:0081631类型:13/14标识符首部数据8字节图6-9ICMP时间戳请求与应答报文格式序列号初始时间戳(由信源给出)接收时间戳(由信宿给出)发送时间戳(由信宿给出)为了估算请求方与应答方之间的时钟差异,首先要计算出时间戳请求和应答的往返延迟,然后据此计算出单程传输延迟,最后由两设备的时间戳和单程传输延迟计算出两台设备之间的时间差,从而实现时钟的同步