ICMP允许主机或路由器报告差错情况和提供有关异常情况的报告,不是高层协议,是IP层的协议,分为差错报告报文和查询报文两类
ICMP报文作为IP层数据报的数据,加上数据报的首部,组成IP数据报发送出去
ICMP报文直接封装在以太帧(数据链路层的分组)中(错误)
ICMP报文的格式:
ICMP报文类型:
差错报告报文:
(1)终点不可达: 当路由器或主机不能交付数据报时就向源点发送终点不可达报文
(2)时间超过: 当路由器收到生存时间为零,除了丢弃该数据报外,还要向源点发送时间超过类型的ICMP报文。
(3)参数问题: 当路由器或目的主机收到的数据报的首部中有的字段的值不正确时,就丢弃该数据报,并向源点发送参数问题报文。
(4)改变路由(重定向): 找到了更好的路由,让主机指定下次应该将数据报发送给另外的路由器。
在主机刚开始工作时,一般在转发表中设置一个默认路由器的IP地址。不管数据报要发送到哪个目的地址,都一律先把数据报传送给默认路由器,这个默认路由器知道每一个目的网络的最佳路由???
通过和其他路由器交换路由信息。
如果默认路由器发现主机发往某个目的地址的数据报的最佳路由应当经过网络上的另一个路由器R,就用改变路由报文把这个情况告诉主机。
于是主机在转发表中增加一个项目:到目的地址的应经过路由器R
差错报告报文数据部分:
把收到的需要进行差错报告的IP数据报的首部和数据字段的前8个字节提取出来,作为ICMP报文的数据字段。
包含UDP或TCP源端口或者目的端口
不使用差错报文的情况
(1)ICMP差错报告报文
(2)分片后第一个数据报片之后的数据报
(3)对具有多播地址的数据报
(4)具有特殊地址数据报(127.0.0.0或0.0.0.0)
ICMP询问报文:
(1)回送请求或回送回答
主机或路由器向一个特定的目的主机发出的询问。收到此报文的主机必须给源主机或路由器发送ICMP回送回答报文。这种询问报文用来测试目的站是否可达。
(2)时间戳请求或时间戳回答
在ICMP时间戳请求报文发出后,就能收到对方相应的ICMP时间回答报文。
ICMP应用举例:
(1)PING:
用来测试两个主机之间的连通性。使用了ICMP回送请求和回送回答报文。
应用层直接使用网络层ICMP,没有通过运输层的TCP或UDP。
(2)Traceroute:
unix操作命令(windows对应的命令时tracert),用来追踪一个分组从源点到终点的路径
原理:利用IP数据报中的TTL字段,ICMP时间超过差错报告报文和ICMP终点不可达差错报告报文实现源点到终点的路径的跟踪。
wireshark icmp抓包实验:
点击开始,发现现在抓取不到任何包:
打开命令行窗口,执行命令:ping www.baidu.com
打开命令行窗口,执行命令:ping www.baidu.com
这时可以看到数据包抓取页面抓取到了4包,与命令行显示的已发送和已接受的包的数量是一致的:
分析抓获的数据包。在这个试验中,可以发现,icmp的报文就只有两种,请求和应答:
请求数据包内容示例: