网络层-ICMP(互联网消息控制协议)

Internet Control Message Protocol

网络层-ICMP(互联网消息控制协议)
ICMP本身是网络层协议,但是他的报文不是直接传送给数据链路层,实际上,ICMP报文首先封装成IP数据报,然后再传送给下一层。
在IP数据报中的协议字段值是1就表示其IP数据是ICMP报文。如下图,IP协议中ICMP为1。
网络层-ICMP(互联网消息控制协议)

IP缺点

设想一下三个问题:

  • PCA发送的报文走到某个路由器此路由器不寻址了;
  • PCA发送的报文还没到PCB,TTL(生存时间)就减到0了,报文将被丢弃;
  • 报文切割后,PCB接收到99条报文,PCA实际发送了100条,报文不够则99条将被丢弃。

显而易见,IP协议有如下缺点:

  • 无差错报告和差错纠正机制
  • 缺少一种为主机管理和查询的机制

ICMP报文结构

网络层-ICMP(互联网消息控制协议)
类型、代码8位
校验和16位
首部总共64位
下图为实际抓包
网络层-ICMP(互联网消息控制协议)

ICMP报文种类

差错报告报文:ICMP总是把差错报文报告给原始的数据源

注意以下几点:

  • 对于携带ICMP差错报文的数据报,不再产生ICMP差错报文
  • 对于分片的数据报,如果不是第一个分片,则不产生ICMP差错报文
  • 对于具有多播地址(目标地址为224.0.0.0~239.255.255.255)的数据报,不产生ICMP差错报文
  • 对于具有特殊地址如(127.0.0.0(回环地址)或0.0.0.0)的数据报,不产生ICMP差错报文。

类型3:终点不可达

当路由器不能够给数据包找到路由或主机不能够交付数据报时,就丢弃这个数据报,然后这个路由器或主机就向发出这个数据报的源主机发回终点不可达报文。

ICMP消息类型及子类型编码

网络层-ICMP(互联网消息控制协议)
网络层-ICMP(互联网消息控制协议)
网络不可达与目标不可达的区别:
网络不可表示路由器不知道要去的网段在哪
主机不可达表示路由器知道要去的网段在哪,不知道怎么找到主机。
网络不可达与目的网络不认识的区别:(目标不可达与目的网络不认识区别与此同理)
网络不可达相当于我知道去找谁但是不知道怎么走;
目的网络不认识相当于我都不认识找的那是谁。

终点不可达报文格式

网络层-ICMP(互联网消息控制协议)
终点不可达实际抓包
网络层-ICMP(互联网消息控制协议)

类型4:源点抑制

IP协议是无连接协议,没有流量控制机制,容易产生拥塞
源点抑制报文就是给IP增加一种流量控制而设计的,因阻塞丢弃一个报文发送一个源点抑制报文。这个报文有两个目的:

  • 它通知源点,数据报因阻塞已经被丢弃。
  • 它警告源点,在路径中的某处出现了拥塞,因而源点必须放慢(抑制)发送过程。
源点抑制报文的格式

网络层-ICMP(互联网消息控制协议)

类型11:超时

超时报文在以下两种情况下产生:

  • 当路由器收到生存时间字段为零的数据报时,就丢弃这个数据报,并向源点发送超时报文。
  • 当最后的终点在规定的时间内没有收到所有的分片时,它就丢弃已有的分片,并向源点发送超时报文。
  • 在超时报文中,代码0只给路由器使用,表示生存时间字段值为0。代码1只由目的主机使用,表示在规定的时限内,不是所有的分片都到达了。
超时报文数据格式

网络层-ICMP(互联网消息控制协议)
超时实际抓包
网络层-ICMP(互联网消息控制协议)

类型12:参数问题

  • 当数据报在因特网上传输时,在其首部出现的任何二义性都可能会产生严重的问题。
  • 如果路由器上或者目的主机上发现了这种二义性,或在数据报的某个字段中缺少某个值,就丢弃这个数据报,并发送参数问题报文。
  • 如果头部出现二义性,代码为0;
  • 如果数据传输过程中IP数据报应该有可选字段而实际没有,代码为1。
    参数问题报文的格式

网络层-ICMP(互联网消息控制协议)

类型5:改变路由(路由重定向)

网络层-ICMP(互联网消息控制协议)
如图,A要给B发送报文,先发给了R1路由器,R1查看了自己的路由表后觉得A应该直接发给R2更合适。于是它向A发送改变路由报文,告诉A你以后就别发给我了,发给R2吧,这次这段报文我也帮你转发给R2。
改变路由报文的格式
网络层-ICMP(互联网消息控制协议)
代码0表示对特定网络路由的改变。对应之前的举例就是R2到B整个LAN。
代码1表示对特定主机路由的改变。对应之前的举例就是主机B。
代码2表示基于指明的服务类型对特定网络路由的改变。
代码3表示基于指明的服务类型对特定主机路由的改变。

查询报文

类型8或0:回送请求或回答(主要使用ping命令,主要用于检查网络连通性)

请求:request,类型8
应答:reply,类型0
回送请求和回送应答报文格式
网络层-ICMP(互联网消息控制协议)

类型13或14:时间戳请求或回答

  • 发送时间 = 接收时间戳的值 - 原始时间戳的值(接收时间戳的值表示目的主机刚接收到还未处理的时刻,原始时间戳指源主机发送那一刻的时间)
  • 接收时间 = 发送时间戳的值 - 原始时间戳的值(即从源主机开始发送的时刻到目的主机准备回复的时刻之间的一段时间)
  • 往返时间 = 发送时间 + 接收时间+源主机处理时间
    时间戳请求或应答报文格式
    网络层-ICMP(互联网消息控制协议)
    原始时间戳:源主机发送的时刻
    接收时间戳:目的主机接收的时刻(未处理)
    发送时间戳:目的主机处理完毕准备回复的时刻

类型17或18:地址掩码请求或回答

单播(主机知道找谁要掩码,对应类型17)
广播(主机不知道找谁要掩码,对应类型18)
地址掩码请求及回答格式
网络层-ICMP(互联网消息控制协议)

类型10或9:路由器查询通告(源主机不知道怎样发到目的主机,有时不用查询自动通告)

广播
多播
路由器询问报文的格式
网络层-ICMP(互联网消息控制协议)
***理解为生存期,生存期理解为路由返回给源主机的通告有生存时间,超时无效。