网络详解 - 网络层(5)ICMP 网络控制管理协议
ICMP 协议的出现用于提供网络中数据报的交付机会,反馈异常数据报告。这个协议包含3个字段,类型,代码,校验和(和之前一样,反码求和运算)。
类型主要有两大类报文ICMP差错控制报文和ICMP询问报文。这里只将常用的列举出来,详细内容可以在查看。
https://en.wikipedia.org/wiki/Internet_Control_Message_Protocol#Control_messages
差错控制
类型值 | 说明 |
---|---|
3 | 终点不可达 |
11 | 超时(跳数到0后还未到重点) |
12 | 参数错误(首部参数有误) |
5 | 改变路由(类似重定向,下次发送数据报的时候,可以选择更好的路由) |
差错控制类型的报文,在头部字段一般会包含,错误数据的IPv4协议头,以及传输层的前8个字节(源端口、目的端口、其他数据|视协议而定)
询问
类型值 | 说明 |
---|---|
8或0 | Echo请求的请求或者应答 |
13或14 | 时间戳请求的请求或者应答 |
每种类型还有有详细的代码来说明具体是什么情况。这里就不一一列举了,如下图。
常见的应用
目前抓包的主机为 192.168.200.155
路由改变
这个数据报得出,之前本机发送的目标地址为17.248.156.12数据报,原先是将该数据报发送给192.168.200.254,现在有更好的选择,发送给192.168.200.14就好了。
触发的条件
* 数据报进入路由器的接口是数据报被发送的同一个接口。
* IP原地址的子网或网络是路由信息包的下一跳IP地址的相同子网或网络。
* 数据包不来源路由。
* 配置允许发送重定向。
ping原理(Echo)
下面两个数据报是本机进行ping命令之后 分别抓到是Echo的请求和应答。
由应答数据报可以的得出,本到192.168.207.120的网络是否通畅和网络状态。
traceroute原理
type=11(超时,ttl耗尽)、3(重点不可达)
在下面举个例子,下面我在本机上命令行输入 traceroute drugs.dxy.cn。
首先出现的是出现一个警告由于我选择的地址有多个IP地址,这里选择了 121.43.176.163 这个地址。
紧接着是有11行数据,表示由本机到该地址,需要经过11个路由器。其中有带*的是匿名路由器,对我们发出去的数据报,并未回应相应的 ICMP 数据报,也可能是数据报丢失了。
原理解析
1.首先构造一个终点不可达的UDP数据报,将 TTL 设置成1。
2.将该数据报发送出去,一共发送 3 次。
3.等待接受 ICMP 数据报,并将受到的数据报打印出来。
4.接受到3个的数据报,或者超时,就进入下一步。
5.如果返回的数据报中有Type = 3的数据报(终点不可达,表示已经到重点了)就终止该程序,否则将 TTL 加一,返回步骤2。
这里是利用了 TTL 的性质来检测中间路由器,因为数据包每被转发的时候 TTL 就会减一,当 TTL 到0的时候,就说明这个数据报时间已经耗尽,不允许继续传输了,路由器就是反馈一个 ICMP 数据报来告知这个错误,由此,将数据包 的 TTL 每次 +1 ,程序就得知中间每层的路由器。
当数据报达到重点后,服务器接受到数据报后发现无法处理,就反馈 type=3 的 ICMP 数据报,程序就知道数据报已经到达终点了,无需在进行发送了。就完成了整个流程。