ICMP报文

ICMP报文的种类分为两种:一种是差错报告报文,另一种是查询报告报文

ICMP报文

ICMP报文

ICMP封装在IP数据报内部

ICMP报文详细

ICMP报文本报

差错报文

1.终点不可达

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

什么是终点不可达?

终点不可达

举个例子:主机A给主机B发送一个邮件,在网络中传输时中间可能要经过很多台路由器,主机A先把这个邮件发送给路由R1,路由R1收到这个邮件后,此时路由R1发生了故障,它不知道这封邮件下一步该发给哪个路由设备或者那台主机设备,也就是说这封邮件不能发送到目的地主机B,这时路由R1会把这个数据报丢弃并向主机A发回一个终点不可达的数据报文。

终点不可达2
可以看出,终点不可达的数据报文的类型标号为3,表示这是终点不可达错误类型,代码标号是0 - 15,表示引发终点不可达错误类型的具体错误原因有16种可能,其中标识符和序列号全都用0来填充。

终点不可达3

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

2.端口不可达

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

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

3.源点抑制

由于ip协议是面向无连接的,没有流量控制机制,数据在传输过程中是非常容易造成拥塞的现象。

而ICMP源点抑制报文就是给ip提供一种流量监控的机制,因为ICMP源点抑制机制并不能控制流量的大小,但是能根据流量的使用情况,给源主机提供一些建议。这个报文的作用就是通知数据报在拥塞时被丢弃了,另外还会警告源主机流量出现了拥塞的情况,然后源主机根据反馈的ICMP源点抑制报文信息作出处理,至于源主机怎么就不管它的事了。

还是用举例子来说明:比如主机A给主机B传输一个视频数据,主机A这边传输的非常快,而主机B这边在接收的非常慢的话,这可能会导致数据在传输过程中都拥塞在某一台路由设备上,假设拥塞在路由设备A,如果主机B接收数据一直比较慢的话,路由设备A解决不了拥塞问题,会给源主机发送一个源点抑制报文反馈给源主机,目的是告诉源主机数据报造成拥塞了,再发送就会丢弃数据报了,另一个是警告源主机放慢发送数据的速度。

另外需要注意的是如果路由设备A一直都是拥塞的话,就会一直给源主机发送ICMP源点抑制报文,直到路由设备A不再拥塞,也就不向源主机发送ICMP源点抑制报文,源主机A又会恢复原来的发送数据的速度。

源点抑制报文
源点抑制报文的类型值是4,代码标号为0,未使用的部分还是全部以0填充。

4.超时

ICMP差错报告报文主要在以下几种情况中,会发送ICMP超时报文:

  1. 当路由器接收到的数据报的TTL生命周期字段值为0时,路由器会把该数据报丢弃掉,并向源主机发回一个ICMP超时报文。

  2. 另外,当目标主机在规定时间内没有收到所有的数据分片时,会把已经收到的所有数据分片丢弃,并向源主机发回一个ICMP超时报文。在超时报文中,代码0只能给路由器使用,表示生存周期字段值为0,代码1只能给目的主机使用,它表示在规定的时间内,目的主机没有收到所有的数据分片。

超时报文
ICMP超时报文的类型值是11,code的值有可能是0或者是1,其中标识符和序列号全部填充为0

123
当主机A给主机B发送一个数据报文时,该数据报文在网络中会有一个TTL生存时间字段,就是数据报文每经过一台路由器,TTL字段值就会减1,当路由器收到数据报文后TTL字段值减1后为0的话,那么该路由器就会把数据报丢弃并向主机A发回一个ICMP超时报文,这种机制有效的防止了路由环路,也就是解决了数据报在路由器之间一直转圈的问题

超时

1
2
3
4
5
Internet Control Message Protocol
Type: 11 (Time-to-live exceeded) //ICMP超时报文的type值就是11,Time-to-live exceeded就是生存时间超时的意思
Code: 0 (Time to live exceeded in transit) //code的值有可能是1有可能是0,Time to live exceeded in transit就是表示路由器收到的ICMP数据报文的TTL值为0
Checksum: 0xf4ff [correct] //表示校验和是正确的
[Checksum Status: Good] //校验和状态是好的

不同类型的差错报文

TYPE CODE Description Query Error
0 0 Echo Reply——回显应答(Ping应答) o
3 0 Network Unreachable——网络不可达 o
3 1 Host Unreachable——主机不可达 o
3 2 Protocol Unreachable——协议不可达 o
3 3 Port Unreachable——端口不可达 o
3 4 Fragmentation needed but no frag. bit set——需要进行分片但设置不分片比特 o
3 5 Source routing failed——源站选路失败 o
3 6 Destination network unknown——目的网络未知 o
3 7 Destination host unknown——目的主机未知 o
3 8 Source host isolated (obsolete)——源主机被隔离(作废不用 o
3 9 Destination network administratively prohibited——目的网络被强制禁止 o
3 10 Destination host administratively prohibited——目的主机被强制禁止 o
3 11 Network unreachable for TOS——由于服务类型TOS,网络不可达 o
3 12 Host unreachable for TOS——由于服务类型TOS,主机不可达 o
3 13 Communication administratively prohibited by filtering——由于过滤,通信被强制禁止 o
3 14 Host precedence violation——主机越权 o
3 15 Precedence cutoff in effect——优先中止生效 o

参考

ICMP差错报告报文
ICMP查询报告报文
有类型和代码对应的错误:TCP/IP——ICMP传递差错报文