ICMP (Internet Control Message Protocol Internet控制报文协议)

ICMPTCP/IP协议族的一个子协议,用于在IP主机路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。

ICMP协议是一种面向非连接的协议,用于传输出错报告控制信息。它是一个非常重要的协议,它对于网络安全具有极其重要的意义,它是TCP/IP协议族的一个子协议,属于网络层协议,主要用于在主机与路由器之间传递控制信息,包括报告错误、交换受限控制和状态信息等。当遇到IP数据无法访问目标、IP路由器无法按当前的传输速率转发数据包等情况时,会自动发送ICMP消息。

ICMP的消息可以分为错误消息,请求消息和响应消息。

具有以下功能:

侦测远端主机是否存在;

建立及维护路由资料;

重导资料传送路径;

资料流量控制;

 

ICMP3个重要类型:

路由通告和路由选择:分别是类型9和类型10,它们用于ICMP路由器发现协议(IRDP),IRDP协议用于某些操作系统发现本地路由器;

重定向:ICMP类型5,被路由器用于通知主机去往指定目标的网关,是数据链路上的另外一台路由器;

 

ICMP重定向(ICMP Redirect)

网络中的路由器通过相互之间的共同努力,将用户的数据包转发到目的地。通常情况下,主机都会将去往远程网络的数据包发送到路由器,路由器再尽最大努力转发数据。但是在某些情况下,收到数据包的路由器可能并不是去往目的地的最优选择,也就是说该路由器并不在源与目标的路径当中,或者说数据源应该将数据交给其它路由器来转发。如果某台路由器真的发现自己不应该为用户转发数据,而希望让用户选择其它路由器来转发数据,那么它就会通过向数据源发送ICMP重定向(ICMP Redirect)来告诉对方,让对方不要再将数据包发向自己,而应该发到其它路由器.

 

需要路由器向源发送ICMP重定向的情况有两种:

  1. 1.  当路由器从某个接口收到数据包后,还要将数据包从同一个接口发往目的地,就是路由器收到数据包的接口正是去往目的地的出口时,则会向源发送ICMP重定向,通告对方直接将数据包发向自己的下一跳即可,不要再发给自己;

  2. 2.  数据包的源IP和自己转发时的下一跳IP地址是同网段时,则会向源发送ICMP重定向,通告对方直接将数据包发向自己的下一跳

 

路由器在向数据源发送ICMP重定向的同时,也会正常转发收到的数据包,并不会中断网络; ICMP重定向是基于接口配置的,默认为开启状态。

wKioL1XZN9ugrNV6AARN5lva76E821.jpg

Eg:

wKiom1XZNeiDqiJLAACioIEvdbY842.jpg

R1#show running-config

interface FastEthernet0/0

 ipaddress 192.168.1.1 255.255.255.0

 duplexauto

 speedauto

!

 

ip route 192.168.2.0 255.255.255.0192.168.1.2

 

 

R2#show running-config

interface FastEthernet0/0

  ipaddress 192.168.2.1 255.255.255.0

!

interface FastEthernet0/0

 ipaddress 192.168.1.2 255.255.255.0

 duplexauto

 speedauto

!

R3#show running-config

interface FastEthernet0/0

 ipaddress 192.168.1.3 255.255.255.0

 duplexauto

 speedauto

 

!

ip route 0.0.0.0 0.0.0.0 192.168.1.1

 

验证:

R3#ping 192.168.2.1

R3#debug ip icmp

*Mar  1 00:11:53.039: ICMP:redirect rcvd from 192.168.1.1- for 192.168.2.1 use gw 192.168.1.2

*Mar  100:11:53.091: ICMP: echo reply rcvd, src 192.168.2.1, dst 192.168.1.3

*Mar  100:11:53.159: ICMP: echo reply rcvd, src 192.168.2.1, dst 192.168.1.3

*Mar  100:11:53.191: ICMP: echo reply rcvd, src 192.168.2.1, dst 192.168.1.3

*Mar  100:11:53.219: ICMP: echo reply rcvd, src 192.168.2.1, dst 192.168.1.3

*Mar  100:11:53.271: ICMP: echo reply rcvd, src 192.168.2.1, dst 192.168.1.3

 

R1#debug ip icmp

ICMP packet debugging is on

*Mar  1 00:11:53.651: ICMP:redirect sent to 192.168.1.3 for dest 192.168.2.1, use gw 192.168.1.2


 

关闭ICMP重定向:

R1(config)#int f0/0       

R1(config-if)#no ip redirects

 

在接口上开启HSRP后,默认会关闭ICMP重定向的功能,在IOS 12.1(3)T和以后的版本可以手工开启ICMP重定向功能。