Ping 的工作原理你懂了,那 ICMP 你懂不懂? - 程序员cxuan的文章 - 知乎 https://zhuanlan.zhihu.com/p/353060487
目录
1 概念
是网络层协议,但是是基于IP协议的。就像tcp和udp报文会嵌入到IP数据报中,ICMP报文也会嵌入到IP数据报,当主机收到一个IP数据包,但是该数据包的上层协议不一定是TCP或UDP,也可以是ICMP。它的作用是在IP主机、路由器之间传递控制消息,ICMP不传输数据,只传输通知消息。主要场景是在网络层通信过程中,如果某个IP数据包发生错误,即由于某种原因不能到达目标主机,那么最后一跳的路由器会返回一个ICMP包给源主机,来说明未能到达目标主机的原因(有很多种)。
2 ICMP报文类型
ICMP报文主要有两种类型,差错报文,查询报文(也叫信息类报文)。
差错报文
类型3 目标不可达消息
路由器无法将IP数据报发送给目标地址,会给源主机返回一个 目标不可达 的ICMP数据报,并描述不可达的原因。类型3代表目标不可达,目标不可达又可以分为很多种原因的不可达,用错误号来说明。
类型4 ICMP重定向消息
当路由器发现发送端主机使用的路径非最优,就会返回一个ICMP重定向消息给源主机,这个消息包含了最优路由信息以及源数据。
ICMP重定向好处:
优化数据在网络中的转发路径。
降低网络资源利用率,比如带宽和路由器CPU负载。
类型11 ICMP超时消息
IP数据报中有一个叫TTL(生存周期)的东西,它的值在经过路由器每一跳之后都会减1,当减少到0的时候该IP数据报就会被丢弃。这个时候路由器就会发送一个ICMP超时信息给源主机。
TTL的作用时防止某个路由器出现错误结果导致数据包在网络中循环转发,浪费网络资源。
类型4 ICMP源抑制消息
路由器发送数据时遇到网络拥堵,就向源主机发送一个ICMP源抑制消息,从而抑制IP数据报的发送。不过这个 ICMP 消息可能会引起不公平的网络通信,一般不被使用。
查询报文
类型0&8 ICMP回送消息
ICMP回送消息用于判断相互通信的主机之间是否连通。
类型8:回送请求消息
类型0:回送应答消息
源主机向目标主机发送回送请求消息,如果能接收到回送应答消息,则说明两个主机是连通的。
ping命令就是利用这个原理实现的。
类型9&10 路由器探索消息
用来选择默认路由
类型10:路由器请求消息
类型9:路由器响应消息
源主机在任意路由连接组播的网络上发送一个路由器请求消息,目的是选择一个路由器进行学习,即作为默认路由。相对应的路由器发送一个路由器响应消息。
类型17&18 ICMP地址掩码消息
用于主机或路由器想要了解子网掩码的情况。
类型17:ICMP地址掩码请求消息
类型18:ICMP地址掩码应答消息
向目标主机或路由器发送ICMP地址掩码请求消息,并接收ICMP地址掩码应答消息。
类型13&14 时间戳请求与回答
源主机向目标主机或路由器发送ICMP时间戳请求消息,然后接收ICMP时间戳应答来获取时间信息。
3 ICMP主要功能
侦测远端主机是否存在------ICMP回送消息及目标不可达消息
建立及维护路由资料------ICMP路由器探索消息
重导数据传送路径------ICMP重定向消息
数据流量控制------ICMP源抑制消息
4 使用ICMP的具体程序
ping
源主机发送ICMP回送请求消息给目标主机,目标主机收到后将报文中源主机与目标主机调换位置然后作为ICMP回送应答消息回复给目标主机,目标主机收到后经校验成功便认为连接畅通。
traceroute
侦测源主机到目的主机之间所经过路由的情况,即记录下从源主机到目标主机之间经过的每个路由器。
原理主要是利用三个东西:ICMP超时消息,ICMP目标不可达消息,以及IP数据报中的TTL
开始发送 TTL = 1的UDP数据报
这样经过第一个路由器跳一次之后就会发送超时,该路由器会回复源主机一个ICMP超时消息,这样就记录了路径中的第一个路由器。
第二次发送一个 TTL = 2 的UDP数据报
这样经过第二个路由器跳之后就会发生超时,第二个路由器会回复源主机一个ICMP超时消息,这就记录了路径中第二个路由器
..................
依次类推,每次给TTL加1,就能记录下路径中最后一个路由器路径
而当到了最后一跳,即最后一个路由器跳到主机的那一步时,由于ICMP报文选择一个不存在的值作为UDP端口,这样目标主机就会回复一个端口不可达的ICMP目标不可达消息。
依次步骤,ICMP可以完成路由路径追踪。
5 不产生ICMP的情况
ICMP差错报文出错不产生差错报文
如果路由器发送给源主机的ICMP差错报文又出了差错,则出了差错的路由器处不会再往反方向回复差错报文,因为这样就可能导致不断循环。因此这种情况下会处查询报文。
目的地址是广播地址或多播地址的IP数据报
作为链路层广播的数据报
不是IP分片的第一片
源地址不是单个主机的数据报
即源地址不能为零地址,环回地址,广播地址或多播地址。
6 与ICMP有关的攻击
主要有三类:泛洪(blood),炸弹(bomb),信息泄露(information disclsure)
泛洪会产生大量流量,导致针对一台或多台计算机的有效Dos攻击。
炸弹是指发送经过特殊构造的报文,导致IP或ICMP的处理失效或崩溃。
信息泄露本身不会造成危害,但是会辅助其它攻击。