ICMP

ICMP(Internet Control Message Protocol)因特网控制报文协议。它是IPv4协议族中的一个子协议,用于IP主机、路由器之间传递控制消息。控制消息是在网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然不传输用户数据,但是对于用户数据的传递起着重要的作用。

  • ICMP允许主机或路由报告差错情况和提供有关异常情况。ICMP是因特网的标准协议,但ICMP不是高层协议,而是IP层的协议。通常ICMP报文被IP层或更高层协议(TCP或UDP)使用。一些ICMP报文把差错报文返回给用户进程。

  • 它是TCP/IP协议族的一个子协议,属于网络层协议,主要用于在主机与路由器之间传递控制信息,包括报告错误、交换受限控制和状态信息等。当遇到IP数据无法访问目标、IP路由器无法按当前的传输速率转发数据包等情况时,会自动发送ICMP消息ICMP提供一致易懂的出错报告信息。发送的出错报文返回到发送原数据的设备,因为只有发送设备才是出错报文的逻辑接受者。发送设备随后可根据ICMP报文确定发生错误的类型,并确定如何才能更好地重发失败的数据报。但是ICMP唯一的功能是报告问题而不是纠正错误,纠正错误的任务由发送方完成。

  • RFC792 的开头部分里写着“ICMP 是IP 的不可缺少的部分",所有的IP 软件必须实现ICMP协议

  • 涉及的命令有 ping、traceroute/tracert

icmp报文的场景

ICMP用途

icmp用途

  • 错误通知: 到IP 数据包被对方的计算机处理的过程中,发生了什么错误时被使用。不仅传送发生了错误这个事实,也传送错误原因等消息
  • 信息询问: 在送信方的计算机向对方计算机询问信息时被使用, 常见的有是否存在,查询子网掩码,查询时间

ICMP作为IP的上层协议在工作

ICMP报文作为IP层数据报的数据,加上数据报的首部,组成数据报发送出去。ICMP报文是封装在IP数据包内
icmp是承载在ip数据报上

报文格式

icmp报文格式

  • 类型: 1字节,标识ICMP报文的类型,从类型值看ICMP报文可分为两大类。 大致可分为查询报文和差错报文两大类。

  • 代码: 1字节,标识对应ICMP报文的代码,它与类型字段一同标识了ICMP报文的详细类型。 如果一个类型中只有一种功能,代码域置为 0。

  • 校验和: 这是对包括ICMP报文数据部分在内的整个ICMP数据报的校验和,以检验报文在传输过程中是否出现了差错 应该为16的整数倍

类型
类型代码表

差错报文 大部分是差错报文

差错报文的格式
所有的ICMP差错报告报文中的数据字段都具有同样的格式。将收到的需要进行差错报告IP数据报的首部和数据字段的前8个字节提取出来,作为ICMP报文的数据字段。再加上响应的ICMP差错报告报文的前8个字节,就构成了ICMP差错报告报文。提取收到的数据报的数据字段的前8个字节是为了得到运输层的端口号(对于TCP和UDP)以及运输层报文的发送序号(对于TCP)

报文分析

信息询问 如ping

信息询问
echo request报文

08 表示回显请求类型
00 表示代码
e3cf 表示校验和
e651 0000 后4个字节

echo reply 报文

00 表示 回显应答
00 表示代码
ebcf 表示校验和
e651 0000 选项数据 可变长度

不可达报文

不可达报文

4 ip版本
5 ip首部长度 5 * 4 = 20 字节
00 tos
0070 总长度 为 7*16 = 112 字节
4510 标识
0000 前三位为000 表示不分片 后13为表示偏移
33 ttl 3*16+3 = 51
01 表示icmp协议
28d3 首部校验和
276a 3034 源ip地址 39.106.48.52
c0a8 0164 目的ip地址
=== 接下来为ICMP数据部分
=== 第一部分为icmp的前8字节
03 表示目标不可达类型
03 端口不可达
fcfc 校验和
0000 0000 空的8字节
=== 第二部分为原始ip数据报首部+原始数据前8字节
4514 0054 087f 0000 3401 646c c0a8 0164 276a 3034
0800 回显请求
4756 校验和
da4f 0000 后4个字节

ECHO 报文

ICMP回显请求与回显应答

报文格式:
报文格式

常见的其他报文的格式

地址掩码请求与应答

地址掩码请求与应答

时间戳请求和应答报文

时间戳请求和应答报文

超时报文

超时报文

重定向报文

重定向报文

路由器请求报文

路由器请求报文

路由器通告报文

路由器通告报文

源站抑制差错报文

源站抑制差错报文

代码实现

请查看章节 相关章节

  • c/go 实现ping
  • c/go 实现traceroute
  • c/go 实现tcp/udp端口扫描
文档更新时间: 2021-02-05 09:48   作者:周国强