1. 协议简介
IP协议缺少主机和管理查询所需要的机制。主机有时需要判断某个路由器或是对方主机是否活跃。网际控制报文协议ICMP是设计弥补上述两个缺点的,它是IP协议的伴侣。ICMP本身是一个网络层协议,但是它的报文并不是直接传递给数据链路层。实际上,ICMP报文首先要封装成IP数据报,然后才被传递到下一层。一个IP数据报,如果协议字段值为1,表示IP数据是ICMP报文
2. 报文
ICMP报文可划分为两大类:差错报告报文和查询报文。差错报告报文报告了路由器或主机在处理IP数据报时可能遇到的问题。查询报文总是成双成对出现,帮助主机或网络管理员从某个路由器或对方主机获取特定的信息
2.1 报文格式
ICMP报文由一个8字节的首部和可变长度的数据部分组成。类型字段定义了报文类型。代码字段指明了发送特定报文类型的原因。检验和字段用于确认数据的正确性。首部的其余部分对于每一种类型的报文都是特有的。差错报文中,数据部分携带的是用于找出引起差错的原始分组的信息。查询报文中,数据部分携带的是基于查询类型的额外信息
2.2 差错报告报文
ICMP不能纠正差错,只是简单地报告差错。差错纠正留给高层协议处理。差错报文总是发送给最初的数据源,因为数据报中关于路由唯一可用的信息就是源IP地址和目的IP地址。ICMP利用源IP地址把差错报文发送给数据报的源点。请注意:所有的差错报文的数据部分,包括原始数据报的IP首部和数据报数据的前8个字节。原始数据报首部是为了向接收差错报文的原始信息源给出关于数据报本身的信息。数据报数据的前8个字节是为了提供关于端口号和序号的信息。一共有5种类型的差错需要处理:终点不可达、源点抑制、超时、参数问题以及改变路由
关于ICMP差错报文的一些要点:对于携带ICMP差错报文的数据报,不再产生ICMP差错报文;对于分片的数据报,如果不是第一个分片,不产生ICMP差错报文;对于具有多播地址的数据报,不产生ICMP差错报文;对于具有特殊地址的数据报,不产生ICMP差错报文
终点不可达:路由器无法数据报找出路由,或者主机无法交付数据报时,数据报被丢弃,然后由路由器或主机向发出数据报的源主机返回一个终点不可达报文。注意:第一点,代码2或3的终点不可达报文只能由目的主机常见,其余的只能由路由器常见。第二点,即使路由器没有发送终点不可达报文,也不一定表示数据报已经被交付。路由器无法检测出导致分组没有交付的所有问题。
源点抑制:IP协议是无连接协议。ICMP的源点抑制报文是为了给IP协议增加某种程度的流量控制和拥塞控制而设计的。当路由器或主机因拥塞而丢弃数据报时,向数据报的发送方发送一个源点抑制报文。存在两个作用:第一,通知源点数据报已经被丢弃。第二,警告源点某处出现拥塞,必须放慢发送过程,直到拥塞得到缓解为止。存在几点值得注意:首先,遭遇拥塞的路由器或目的主机必须为丢失的每一个数据报向源主机发送一个源点抑制报文。其次,没有一种机制可以告诉源点,拥塞得到缓解,可以按原有速率发送数据报。源点只是不断地降低发送速率,直到不再收到更多的源点抑制报文位置。最后,一对一的通信或多对一的通信都可能产生拥塞。多对一通信情况,多个源点产生的数据报都必须由一个路由器或目的主机处理,源点抑制报文不一定有用。因为路由器或目的主机不知道哪个源点应该对拥塞负责
超时:一旦路由器将数据报的生存时间字段值递减后变成零,就丢弃数据报,并向源点发送超时报文。当最后的终点在规定的时间内没有收到所有的分片,就丢弃已收到的分片,并向源点发送超时报文。超时报文中,代码0仅供路由器使用,说明数据报的生存时间字段值为零。代码1仅供目的主机使用,说明不是所有的分片都按时到达
参数问题:当数据报经过因特网传输时,首部出现的任何二义性都可能产生严重的问题。如果路由器或目的主机发现二义性,或者数据报的某个字段缺少某个值,就会丢弃数据报,并向源点返回一个参数问题报文。代码0表示首部的某个字段有差错或二义性,指针字段值指向有问题的字节。代码1表示缺少所需的选项部分,不使用指针
改变路由:路由器参与路由选择的更新过程,并且更新是经常进行的,影响效率。为了提高效率,主机不参与路由选择更新过程,因为因特网上的主机数量比路由器多很多。动态地更新主机的路由表产生无法容纳的通信量。主机通常使用静态路由选择。开始阶段,主机的路由表项数目有限,通常只知道默认路由器的IP地址。因此,主机可能把发往另一个网络的数据报发给一个错误的路由器。收到数据报的路由器会把它转发给正确的路由器。但是,为了更新主机的路由表,路由器要向主机发送一个改变路由报文。代码0对特定网络路由的改变。代码1对特定主机路由的改变。代码2基于指定服务类型的对特定网络路由的改变。代码3基于指定服务类型的对特定主机路由的改变
2.3 查询
回送请求与回答:回送请求与回送回答报文为了诊断而设计的,两者组合起来确定两个系统之间能否彼此通信。一个主机或路由器可以向另一个主机或路由器发送回送请求报文。收到回送请求报文的主机或路由器产生回送回答报文,并返回给源发送方。回送请求和回送回答报文可被用来检测IP协议的工作情况,检查另一个主机是否可达
时间戳请求与回答
两个主机或路由器可以使用时间戳请求和时间戳回答报文来确定IP数据报在两个机器之间来回所需的往返时间。也可用于同步两个机器的时钟。源点生成时间戳请求报文,源点把通用时间填入原始时间戳字段,其它两个时间戳字段填入零。终点生成时间戳回答报文,终点把请求报文的原始时间戳复制到回答报文的相同字段。然后,在接收时间戳字段填入收到请求报文时的通用时间。最后,终点在回答报文离开前将通用时间填入发送时间戳。发送时间=接收时间戳-原始时间戳。接收时间=分组返回时间-发送时间戳。往返时间=发送时间+接收时间。只有当源点和终点机器的时钟是同步的,发送时间和接收时间的计算才是准确的。但是,即使两个时钟没有同步,往返时间的计算还是准确的,因为每一个时钟在往返时间的计算出现两次,它们在同步上的差别被抵消。时间差=接收时间戳-原始时间戳-单向经历时间
2.4 检验和
发送方计算检验和的步骤:检验和字段置为零;计算首部和数据的所有16位字之和;得到的和求反码,得到检验和;结果存储在检验和字段