IP层的主要控制功能包括差错控制、拥塞控制和路由控制。若在IP报文传输过程中出现错误,IP协议本身并没有一种内在的机制获取差错信息并进行差错控制。比如以下问题IP协议本身是不能解答的:(1)数据报是否正确地到达了接收端?(2)若数据报不能到达接收方,那么这是什么原因造成的?
为此,在TCP/IP中设计了ICMP协议来处理报文传输过程中出现的错误,ICMP是IP层的一个组成部分。具体如下:
(1)当中间路由器或目标主机发现数据报文在传输过程中出现错误,不能到达接收端时,主机或者路由器的ICMP模块将被触发,并产生一个ICMP报文向信源机报告出错情况。
(2)在实际应用中,ICMP不但用来传输报告差错的报文,它还用来传输控制报文。
(3)ICMP并不能提高IP协议的可靠性,只是当IP数据报不能到达接收端时,用来向发送端的IP层通知数据报因何原因没有到达接收端,以便发送端的IP层能够进行差错控制和差错处理。
(4)目前的ICMP已成为用于IP层差错和控制报文传输的专用协议。
什么情况下不发送ICMP报文
(1)ICMP差错报文(ICMP查询报文可能会产生ICMP差错报文)
(2)目的地址是广播地址或多播地址的IP数据报
(3)作为链路层广播的数据报
(4)不是IP分片的第一片
(5)源地址不是单个主机的数据报
(6)具有特殊地址(如127.0.0.0或0.0.0.0)的数据报
ICMP应用
(1)源主机消亡:源主机接收到源主机消亡(抑制)报文后,必须将此信息交给高层进程处理。
(2)超时
(3)参数问题
(4)重定向
(5)回送请求和回送应答是一对查询报文,用于测试两个机器(主机或路由器)之间能否实现通信。
(6)时间戳请求和时间戳应答一对查询报文,用于确定IP数据报在源端和目的端之间往返所需要的时间,也可用作源端和目的端机器的时钟同步。
(7)地址掩码请求和地址掩码应答是一对查询报文,用于获得一个主机所在网络的子网掩码。
(8)路由器通告和路由器请求是一对查询报文,用于主机与路由器之间交换信息。
(9)信息请求和信息应答是一对查询报文,用于主机查找所连接网络的地址。
(10)路由跟踪
ICMP的封装
ICMP封装在IP报进行传输。ICMP报文本身被封装在IP数据报的数据区中,而这个IP数据报又被封装在帧数据中。在IP数据报报头中的协议(Protocol)字段设置成1,表示该数据是ICMP报文。
其中,ICMP报文包含:ICMP首部(8字节)+产生差错的数据报IP首部+IP首部后的8个字节。具体如下图:
IP包首部要被传回的原因,因为IP首部中包含了协议字段,使得ICMP可以知道如何解释后面的8个字节。而IP首部后面的8字节(UDP的首部或者TCP首部,UDP和TCP首部的8个字节分别包含了16位的目的端口号和源端口号),根据源端口号就可以把差错报文与某个特定的用户进程关联。
ICMP报文的报头
ICMP报文包括8个字节的报头和长度可变的数据部分。对于不同的报文类型,报头的格式一般是不相同的,但是前3个字段(4个字节)对所有的ICMP报文都是相同的。
(1)类型(Type)字段,长度是1字节,用于定义报文类型。
(2)代码(Code)字段,长度是1字节,表示发送这个特定报文类型的原因。
(3)校验和(Checksum)字段,长度是2字节,用于数据报传输过程中的差错控制。与IP报头校验和的计算方法类似,不同的是其是对整个ICMP报文进行校验。
(4)报头的其余部分,其内容因不同的报文而不同。
(5)数据字段,其内容因不同的报文而不同。对于差错报告报文类型,数据字段包括ICMP差错信息和触发ICMP的整个原始数据报,其长度不超过576字节。
总结
(1)IP协议是一种不可靠的、无连接的协议,不具备差错报告和差错纠正机制,它必须依赖于ICMP协议来报告处理一个IP数据报传输过程中的错误并提供管理和状态信息
(2)ICMP即网际控制报文协议,是IP协议的一部分。当数据报在传输过程中发生错误时,主机或者路由器的ICMP模块将被触发,并产生一个ICMP报文
(3)ICMP报文有两大类:差错报告报文和查询报文。其中,差错报告报文包括:目的不可达、源主机消亡、超时、参数问题、重定向。查询报文包括:回应请求和应答、信息请求和应答(已弃用)、时间戳和时间戳应答、地址掩码请求和应答、路由器通告和请求
(4)ICMP报文封装成IP数据报的形式传送。ICMP报文包括1字节的类型字段、1字节的代码字段、2字节的校验和字段和长度可变的数据字段