【计算机网络】 ICMP协议
解决什么问题?
为什么要制定一个ICMP协议,其最开始的主要目的为提高IP数据报交付成功的机会。
什么是ICMP?
ICMP的英文全称为(Internet Control Message Protocol),中文全称为网络控制报文协议。允许主机或路由提供报告差错情况和提供有关异常情况的报告。所以说ICMP协议是发挥一个相当于负责报告IP数据包有没有在传输过程中“出事”的作用。
ICMP协议的具体形式
其在真实的网络传输中是装在IP数据报中的,而IP层位于网络层,所以ICMP并不是一种高层协议。ICMP的报文作为IP数据报的数据,加上数据包的首部,组成IP数据报发送出去。
其报文格式如下图所示
ICMP报文的种类
ICMP的种类分为:ICMP差错报告报文和ICMP询问报文。可以根据类型的值对应ICMP报文的种类,类型值为一个8位数字范围是0~15。代码字段表示在某种类型中的不同情况,可以理解位进一步细分类型。我们知道ICMP数据报作为IP数据报的形式进行传输,但是IP数据报在进行校验和时不会检验IP数据报的内容,所以要保证ICMP经过传输后仍然正确单独进行校验和校验。
具体解释一下报文类型
(1)终点不可达
当路由器或主机不能交付数据报时就向源主机发送终点不可达报文。
(2)时间超过
当路由器收到生存数据为0的数据报时,除丢弃该数据外,还向源点发送时间超过报文。当终点在预先规定的时间内不能收到一个数据报的全部数据片时就把以及收到的数据片全部丢弃,并向主句发送超时报文。
(3)参数问题
当路由器或者目的主机收到的数据报的首部中有的字段值不正确时,就丢弃该数据报并向源点发送参数问题报告。
(4)改变路由
顾名思义当路由器发生变化时,路由器把改变的路由器报文发送给主机,让主机知道下一次应该发送给另外的路由,也就是更好的路由。因为互联网中主机的数量远大于路由器的数量,主机刚开始工作时出于效率的考虑会设置一个默认路由,如果默认路由发现发往某个地址的最佳路由应当经过网络上的另一个路由器R,就用改变路由报文告诉主机。
所有的ICMP差错报告报文中的数据字段都具有相同的样式,其作为IP数据报的数据部分进行发送,用ICMP差错报文的前8个字节,就是前面提到的类型/代码校验和还有后面随类型不同的四个字节,加上IP数据报的首部和数据字段的前8个字节。
还有几种不应该发送ICMP差错报文的情况:
1.对于发送的ICMP差错报告报文,不再发送ICMP差错报告报文,就是说ICMP差错报告报文传输错误也不再发送了,不然停不下来了
2.对于比较大的数据报,只发送第一个分片数据报的ICMP差错报告报文,后续的数据报片都不再发送ICMP差错报告报文
3.具有多播地址的数据报,不发送ICMP差错报告报文
4.具有特殊地址的(如127.0.0.0或0.0.0.0)的数据报,不发送ICMP差错报告报文。
ICMP询问报文
(1)回送请求和回送回答。ICMP回送请求报文是由主机或路由器向某一个特定的目的主机发出询问。收到次请求报文的主机就得向路由器或主机发送ICMP回送回答报文。这中询问报文可以用来测试目的站是否可到达以及了解其有关状态。
(2)时间戳请求或时间戳回答。ICMP发出时间戳请求报文后,就能收到对方响应的ICMP时间戳报文,,利用在报文中记录的时间戳就很容易计算出往返时延。
ICMP的应用
ping(Packet InterNet Groper) 是我们经常使用的一个指令用来检查网络通信是否正常。PING使用了ICMP的回送请求和回送回答报文,是应用层直接使用ICMP的例子,直接使用IP数据报,没有通过运输层的TCP或者UDP。
tracert的IP数据报中封装的是无法交付的UDP数据,数据报中设置了生存时间TTL,每通过一个路由器TTL就减1,直到TTL为0了,就把该报文丢弃并向源主机发送一个ICMP时间超过差错报文。当最后一个数据报到达主机时,数据报TTL为1,不再转发。但是数据报中封装的时无法交付的UDP数据报,因此要向源主机发送ICMP终点不可达差错报文,这样就能知道到达目的主机所经过的所有路由器的IP地址。
据报中封装的时无法交付的UDP数据报,因此要向源主机发送ICMP终点不可达差错报文,这样就能知道到达目的主机所经过的所有路由器的IP地址。