网际控制报文协议ICMP
-
为了更有效地转发IP数据报和提高交付成功的机会,在
网络层
使用ICMP协议。 -
ICMP是互联网的标准协议
-
另外,网络层提供的不是可靠交付,而是尽最大努力交付。ICMP就是网络层"尽力"的一个表现。
-
ICMP允许主机或路由器报告
差错
情况和提供有关异常
情况的报告。(。ICMP所尽的最大努力就是指:这件事我尽力去干,但不保证不出问题,出了问题我会向你报告) -
ICMP不是
高层协议
,而是IP层协议,它存在IP数据报中的数据部分(IGMP也一样)。 -
在将IP协议时,我们讲到过有几个协议时配合IP协议一起使用的(都在IP层),其中ARP协议是用来找MAC地址的,ICMP是用来报告错误的。
ICMP报文的类型
- ICMP
差错报告文
(出现下面四种情况之一就回发一份ICMP差错报告文)- 终点不可达 (比如:路由表找不到)
- 时间超过 (也就是还能跳几下。 对应IP数据报首部中字段:
生存时间
) - 参数问题
- 改变路由(重定向) (原路走不了了,发现一条新路径)
- ICMP
询问报文
- 回送请求和回答报文
- 时间戳请求和回答报文
ICMP差错报告文的内容
- ICMP差错报告报文:提取IP数据报首部 + 提取IP数据报数据部分前8个字节 + ICMP一点自己的东西(ICMP的前8字节)
- IP数据报首部里面还有一些出错原因信息
- 数据部分符前8个字节是为了拿到
运输层
的端口号(IP数据报数据部分封装的是运输层的报文,这个报文也有一个首部,首部里面包含端口号)
- ICMP差错报告报文组建好后,再给它加个新的ip数据报
首部
,将它当做IP数据报发回去。
不再发送差错报告报文的情况
- 对ICMP差错报告报文不再发送对应的ICMP差错报告报文 (ICMP发回去的过程中出错了,这时候不用理它了)
- 对第一个分片的数据薄片的所有后续数据包片都不发送ICMP差错报告报文。(数据会分组,但只要有一个错了,就相当于全错,不用多次报错了)
- 对具有多播地址的数据报不发送ICMP差错报告报文
- 某些特殊地址的数据报不发送ICMP差错报告报文(如环回地址:127.0.0.0 。 0.0.0.0)
ICMP应用举例
- PING命令,用来测试两个主机之间的连通性。
- 使用了ICMP回送请求和回答报文(询问报文)
- PING命令是应用层直接使用网络层ICMP的例子
- tracert命令 ,用来跟踪一个分组从原点到终点的路径(起点到终点经过了多少个路由器,它们的地址是多少)
- 这个命令可能需要几十秒更长时间来完成。它利用IP数据报中的
生存时间TTL字段
和ICMP差错报文(时间超时)
实现从原点到终点的路径的跟踪,其原理如下:- 主机先向最终目的发送一份报文,TTL字段设置成1。到达第一个站点后时间超时,向原主机发送ICMP时间超时差错报文。这样获得了相关所需信息
- 主机再向最终目的发送一份报文,TTL字段设置成2 。。。。
- TTL字段设置成3 。。。。。直到到达终点路径为止。
- 最后一跳的站点信息怎么拿来呢(没有出现超时错误)?
- 设置一个错误端口号
- 这个命令可能需要几十秒更长时间来完成。它利用IP数据报中的