05-ICMP协议详解

网络层的一个重要协议,ICMP协议用来在网络设备间传递各种差错和控制信息,收集各种网络信息,诊断和排除各种网络故障

ICMP(Internet Control Message Protocol)Internet控制报文协议。它是TCP/IP协议簇的一个子协议,用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用

ICMP 传递差错,控制,查询等信息

一:ICMP工作原理

ICMP提供一致易懂的出错报告信息。发送的出错报文返回到发送原数据的设备,因为只有发送设备才是出错报文的逻辑接受者。发送设备随后可根据ICMP报文确定发生错误的类型,并确定如何才能更好地重发失败的数据包。但是ICMP唯一的功能是报告问题而不是纠正错误,纠正错误的任务由发送方完成

二:ICMP报文格式

 

1.校验和:占两个字节,是对整个报文的报文信息的校验。

2.类型:占一个字节:用来表示ICMP的消息类型。

3.代码:占一个字节:用来对类型的进一步说明

ICMP Redirect 消息用于支持路由功能。如图所示,主机A希望发送报文到服务器A,于是根据配置的默认网关地址向网关RTB发送报文。网关RTB收到报文后,检查报文信息后,发现报文应该转发到与源主机同一网段的另一个网关设备RTA,因为次转发路径是更优的路径。所以RTB会向主机发送一个消息,通知主机直接向另一个网关RTA发送报文。主机收到Redirect消息后,向RTA发送报文,RTA会将报文转发给服务器A

小结:
1.ICMP重定向消息由路由器产生。
2.主机去处理这个重定向消息

当路由器发送的数据报不能发送到指定目的地时,或者说当路由器不能够给数据报找到路由或主机不能够交付数据报时,就丢弃这个数据报,然后向发送数据报的源主机设备发回一个终点不可达数据报文

例如:终点不可达数据包

 

 注意上图红色框部分的数据报

1 Type: 3 (Destination unreachable) //Destination unreachable就是终点不可达
2 Code: 3 (Port unreachable) //代码号为3是Port unreachable,表示端口不可达
3 Checksum: 0x6e2d [correct]
4 [Checksum Status: Good]
5 Unused: 00000000 //这一部分是由标识符和序列号组成的,一般出现终点不可达错误的情况下,都是用0来填充表示的

2、端口不可达

当目标系统收到一个ip数据报的某个服务请求时,如果本地没有此服务,那么会向源头返回ICMP端口不可达信息。

常见的端口不可达有,R1向R3发起一个ftp的传输请求,从R3传输一个文件到R1,由于R3设备没有开启ftp服务的69端口,因此R1在请求R3时会收到R3回复的一个ICMP端口不可达的差错报文

 

 

 ICMP定义了各种错误消息,用于诊断网络的连接性问题;根据这些错误消息,源设备可以判断出数据传输失败的原因。如上图当网络设备无法访问目标时,会自动发送ICMP目的不可到达报文到终端设备

三:ICMP协议应用常用命令

ping命令

通常使用PING命令测试互通性时有以下几种消息反馈:
1、Request Time Out
2、Destination Unreachable
3、TTL Expired in transit
情况1:当源主机PING某目标主机时,源主机在一段时间内无法收到ICMP响应报文,就会产生该种情况。出现上述问题的原因在于
情况2:当源主机到目标无可用通路时,就会产生该种原因。
情况3:当信源机发送IP数据包时(ICMP是被直接封装在IP包中),会加上包的TTL(Time to Live)时间,数据包在每经过一个路由器时,路由器会将包的TTL时间减1,如果在ICMP请求报文未到目标主机之前,该数据包的TTL为0,则相应的网关丢弃该报文,同时向源主机发送ICMP的超时报文,在源主机上应将显示TTL Expired in transit消息。该问题主要是在网络内部出现了路由循环造成数据包无法到达目的主机

Tracert命令

Tracert(跟踪路由)是路由跟踪实用程序,用于确定 IP数据包访问目标所采取的路径。Tracert 命令使用用 IP 生存时间 (TTL) 字段和 ICMP 错误消息来确定从一个主机到网络上其他主机的路由

通过向目标发送不同 IP 生存时间 (TTL) 值的“Internet 控制消息协议 (ICMP)”回应数据包,Tracert诊断程序确定到目标所采取的路由。要求路径上的每个路由器在转发数据包之前至少将数据包上的 TTL 递减 1。数据包上的 TTL 减为 0 时,路由器应该将“ICMP 已超时”的消息发回源系统。

Tracert 先发送 TTL 为 1 的回应数据包,并随后的每次发送过程将 TTL 递增 1,直到目标响应或 TTL 达到最大值,从而确定路由。通过检查中间路由器发回的“ICMP 已超时”的消息确定路由。某些路由器不经询问直接丢弃 TTL 过期的数据包,这在 Tracert 实用程序中看不到。
Tracert 命令按顺序打印出返回“ICMP 已超时”消息的路径中的近端路由器接口列表。如果使用 -d 选项,则 Tracert 实用程序不在每个 IP 地址上查询 DNS。
在下例中,数据包必须通过两个路由器(10.0.0.1 和 192.168.0.1)才能到达主机172.16.0.99。主机的默认网关是 10.0.0.1,192.168.0.0 网络上的路由器的 IP 地址是 192.168.0.1。
C:\>tracert -d 172.16.0.99
Tracing route to 172.16.0.99 over a maximum of 30 hops
1 2s 3s 2s 10.0.0.1
2 75 ms 83 ms 88 ms 192.168.0.1
3 73 ms 79 ms 93 ms 172.16.0.99
Trace complete.
posted @ 2020-03-26 18:18  龙门、三少  阅读(1276)  评论(0编辑  收藏  举报