ICMP协议是网络协议中重要的协议之一,它进行了一些有效的消息控制,来完成一些传输当中错误的一些修改。那么我们应该如何理解这个协议呢?它的工作流程又是如何呢?
既然IP网络不可靠并且不能保证信息传递,因此当发生问题时通知发送人是很重要的.ICMP协议是一种提供有关阻止数据包传递的网络故障问题反馈信息的机制. 它让TCP等上层协议能够意识到数据包没有送达目的地,ICMP协议提供一种查出灾难性问题的方法.这些灾难性的问题包括"TTL exceeded"(超过生存时间)和"需要分更多的数据段"等.ICMP协议不报告IP校验失败等常见的问题.这是因为我们假定TCP或者其它可靠的协议能够处理这类数据包损坏的问题.而且,如果我们使用UDP等不可靠的协议,我们就不应理会较小数量的数据损失.
反之,网络问题需要立即报告.例如,如果IP TTL值(IP生存时间)将达到零,这就可能是网络的某个部分发生了路由环路问题,这样将没有任何数据包能发送到目的地.端点系统需要了解这些类型的故障.ICMP是一种发送各种消息报告网络状态的协议,而非仅仅是简单的ping(联通性测试程序).回应请求(echo request)仅是ICMP协议提供的众多消息之一.Ping信息可以被过滤掉.但是,大多数ICMP消息类型是IP、TCP和其它协议正常运行所需要的.永远不要相信ICMP协议是邪恶的并且简单的封锁这个协议.
ICMP协议本身非常复杂.每一种类型的ICMP消息也称"主要类型(major type)"拥有自己的"子类型编码(minor codes)".ICMP协议工作在第3层,因此,它能够在互联网上路由.一个ICMP数据包实际上就是一个IP数据部分包含ICMP协议数据的IP数据包.每一个ICMP消息都将包含引发这条ICMP消息的数据包的完全IP包头,这样,端点系统就会知道实际上哪一个数据包没有发送到目的地.另外引发此ICMP消息的数据包的前8个字节也将包括在内,这通常是TCP或者UDP包头.
简略的说,ICMP协议消息包含永远不会变化的三个字段,随后是ICMP数据,然后是引发此消息的源IP数据包包头.不会变化的三个字段中,前8个字节包含ICMP类型(主要类型)、第二个字段包含了类型代码、第三个字段是ICMP消息校验值.
我们需要认识到,ICMP协议在某些情况下不会发送错误信息.ICMP不会对ICMP信息做出响应.如果ICMP回应其它ICMP消息,这些消息的数量会爆炸性增长而演变为一场ICMP消息风暴.为了防止出现广播风暴,ICMP消息也不会回应一个广播或者多播地址.
最有用的ICMP数据包类型"目标不可达"(类型三)的消息.错误消息一般由路由器生成,并且发送给数据包的来源.大多数错误信息还将发送给与发送的数据包有关的应用程序.在这种情况下,TCP协议将广泛使用ICMP协议.我们在后面将很快看到这种情况.
在IPv4协议中最常用的ICMP消息类型有以下几种:
回显应答(类型0)和回显请求(类型8):这是Ping程序发送的信息.
目标不可达(类型3)
源抑制(类型4):这是一种用于通知发送者路由器或者主机出现阻塞现象的ICMP消息,发送者需要降低发送速度.
重定向(类型5):这个消息用来向可以访问两台路由器的主机说"请使用另一台路由器".我们在此系列讲座中未来的路由问题中再详细讨论这个问题.
路由器信息应答(类型9)和路由器信息请求(类型10)
超时(类型11):这个消息有两种用途.***,当超过IP生存期时向发送系统发出错误信息.第二,如果分段的IP数据报没有在某种时限内重新组合,这个消息将通知发送系统.
当然,上述各种类型的消息中都包含子类型代码.类型三消息"目标不可达"本身有15个子类型代码.我们就不提供每一项的细节了.但是,ICMP协议中有一项非常重要的应用要依靠类型三的消息.
路径***传输单元(PMTU)是各种协议用来寻找整条路径中支持的***的MTU(***传输单元)的机制,小于此限制的数据可以不用分段.发送者在其本地接口设置***的数据包规格,然后,在IP包头中使用DF(不要分段)的标记发出数据包.如果有问题发送者就会收到第三种类型的ICMP错误信息,其子类型代码是"要求分段,但是已经设置了DF标记".当发生这种情况是,发送者知道它必须要减小发送数据的规格.如果没有返回错误信息,这就表明MTU的设置没有问题.
在查找PMTU时的主要问题是人们常封锁ICMP协议,阻止这个报错信息传递到发送数据的主机.这种情况很多时候发生在你设法连接的远程站点.假如你向一台Web服务器发送一个请求,但是,一个空白页却不断出现.在虚拟专用网连接上的人们经常会看到这种情况,这是因为由于有的虚拟专用网封装的额外的文件头,它们的MTU比通常的容量要小一些.当远程Web服务器向虚拟专用网用户发送其要求的内容时,如果数据包太大,用户前面***的路由跳数需要为这个数据分段.如果发送方设置DF标记之后,它能做的一切就是通知发送者必须发送较小的数据包.但是,发送者封锁了ICMP协议,因此这个网站将永远不会看到这种ICMP信息.不过一个好消息是大多数TCP协议的执行都是智能化的.如果它们一直得不到发送数据的许可,它们会自己以较小的分段尺寸发送数据.但是,如果你使用某些流行的、操作方便的操作系统,这种机制并没实现.
简言之,封锁ICMP协议对于成功地运行网络是有害的.这不仅会破坏ping,事实上,如果ICMP协议不工作,许多协议都将不能完全发挥作用.
小结
ICMP包括许多种类型的用于各种用途的数据包,每一种类型都有子类型代码,用于指明这些消息类型的具体内容.
查找路径***传输单元能够让规格正确的数据包在各种数据包容量的链路上传送.
ICMP对于恰当的路由和数据包传递是非常重要的,你只能封锁你不需要的那一些消息.