大家好,又见面了,我是你们的朋友全栈君。
1. ICMP报文种类
ICMP报文的种类分为两种:一种是差错报告报文,另一种是查询报文。
对于差错报告报文来说,ICMP总是把差错报文报告给发送数据源端(源主机)。比如:主机A给主机发送一个数据,结果这个数据在网络传输过程中出错了,然后ICMP协议的机制就会返回一个差错报告给主机A(相当于把数据在传输过程中出错的信息发回给主机A)。
2. 差错报告报文
差错报告报文常见有以下几类:
类型3:终点不可达,当数据包不能发送到目标主机或路由时,就会丢弃该数据包向源点发送终点不可达报文。出错的原因有很多,具体参考错误代码。
类型4:源点抑制,也就是数据在传输过程中,如果源点发送数据很快,而目的地接收数据慢,造成拥塞,这时就会向源点发送源点抑制报文,告知源点应该降低发送数据包的速率。比如主机A给主机B发送数据,可能主机A每次发送数据都比较快,而主机B每次接收数据比较慢,导致主机B可能会造成数据拥塞,这时主机B会发送一个源点抑制的ICMP数据报文告诉主机A:你发送的数据太快,我这边接收的很慢。
类型11:超时,当路由器收到TTL值为0的数据包时,会丢弃该数据包并向源点发送超时报文,也有可能数据分片在进行重组超过规定时间也会丢弃已收到的报文然后向源点发送超时报文。
类型为11,code值为0,说明该数据包在发送时超时原因是TTL值为0造成的,也就是说该数据包可能造成路由环路了,通俗来说就是数据在传输过程中一直在路 由器之间转圈。而Time to live exceeded in transit这句话的大意就是生存时间超时的意思。
类型12:参数问题,可能是IP首部有的字段值是错误的或者IP首部被修改,破坏都有可能,因为IP数据报文有一个首部校验和的字段会对IP首部进行校验。
类型5:改变路由(路由重定向)。主机A在给主机B发送数据时,数据在传输过程中选择的传输路线不是最优的,这时主机B会发送一个改变路由的ICMP数据报文告知主机A下次发送数据时选择另外的路线。
3.查询报告报文
查询报文常见有以下几类:
类型8或0:类型8表示请求,类型0表示回答。比如:经常使用ping命令来ping一个网络是否连通。
类型13或14:类型13表示时间戳请求,类型14表示时间戳回答,。记录数据报文的发送时间和接收时间,一般来说发送时间和接收时间是一样的,比如主机A发送的时间是14点,那么主机B接收的时间是16点,说明这两个时间不同步,是有问题的。
类型17或18:类型17表示地址码请求,类型18表示地址码回答,地址码一般指的是子网掩码,如果主机A不知道自己的子网掩码会发送一个地址码请求,收到请求的主机会发送一个地址码回答,告诉主机A的子网掩码是多少。
c类型10或9:路由器查询通告,一般指的是返回路由的状态信息
4. ICMP数据抓包
下面,我们通过wireshark来抓一个icmp包,如下图所示:request表示这是一个ICMP请求报文,reply表示这个是一个ICMP回答报文。
图1-ICMP请求和响应
图中ICMP数据报的Type字段时8,表示这是一个请求报文,Type字段为0的表示这是一个回答报文。
5.关于ICMP报文的几点
1.对于携带ICMP差错报文的数据报,不再产生ICMP差错报文。
如果主机A发送了一个ICMP的数据报文给主机B,数据在传输过程中经过其中一个路由器出现错误,由于该路由器已经接收到一个ICMP数据报文,所以不会再产生一个ICMP差错报文。
2.对于分片的数据报,如果不是第一个分片,则不产生ICMP差错报文
对于主机A发送了一个分片的数据,如果路由设备或主机接收到的分片数据不是第一个分片数据,不会产生ICMP差错报文。
3.对于具有多播地址的数据报,不产生ICMP差错报文
如果一个ip地址是一个广播地址的话,不会产生ICMP差错报文。
4.对于具有特殊地址如(127.0.0.0或0.0.0.0)的数据报,不产生ICMP差错报文
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/133257.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...