Go语言ICMP协议:向主机发送消息
ICMP 是用来对网络状况进行反馈的协议,可以用来侦测网络状态或检测网络错误。
ICMP 协议介绍
ICMP(Internet Control Message Protocol)因特网控制报文协议。它是 IPv4 协议族中的一个子协议,用于 IP 主机、路由器之间传递控制消息。控制消息是网络是否畅通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然不传输用户数据,但是对于用户数据的传递起着重要的作用。
ICMP 协议是一种面向无连接的协议,用于传输出错报告控制信息,它是一个非常重要的协议,对于网络安全具有极其重要的意义。ICMP 属于网络层协议,主要用于在主机与路由器之间传递控制信息,包括报告错误、交换受限控制和状态信息等。当遇到 IP 数据无法访问目标、IP 路由器无法按当前的传输速率转发数据包等情况时,会自动发送 ICMP 消息。
ICMP 是 TCP/IP 模型中网络层的重要成员,与 IP 协议、ARP 协议、RARP 协议及 IGMP 协议共同构成 TCP/IP 模型中的网络层。ping 和 tracert 是两个常用网络管理命令,ping 用来测试网络可达性,tracert 用来显示到达目的主机的路径。ping 和 tracert 都利用 ICMP 协议来实现网络功能,它们是把网络协议应用到日常网络管理的典型实例。
从技术角度来说,ICMP 就是一个“错误侦测与回报机制”,其目的就是让我们能够检测网络的连线状况﹐也能确保连线的准确性。当路由器在处理一个数据包的过程中发生了意外,可以通过 ICMP 向数据包的源端报告有关事件。
其功能主要有:侦测远端主机是否存在,建立及维护路由资料,重导资料传送路径(ICMP 重定向),资料流量控制。ICMP 在沟通之中,主要是透过不同的类别(Type)与代码(Code)让机器来识别不同的连线状况。
ICMP 协议大致可以分为两类,一种是查询报文,一种是差错报文。其中查询报文有以下几种用途:
- ping 查询;
- 子网掩码查询(用于无盘工作站在初始化自身的时候初始化子网掩码);
- 时间戳查询(可以用来同步时间)。
而差错报文则产生在数据传送发生错误的时候。
ICMP消息类型
ICMP 报告无法传送数据报的错误,且无法帮助对这些错误进行疑难解答。例如 IPv4 不能将数据报传送到目标主机,路由器或目标主机上的 ICMP 会向主机发送一条“无法到达目标”消息。
下表为最常见的 ICMP 消息。
ICMP 消息类型 | 用途说明 |
---|---|
回显请求 | Ping 工具通过发送 ICMP 回显消息检查特定节点的 IPv4 连接以排查网络问题,类型值为 0 |
回显应答 | 节点发送回显答复消息响应 ICMP 回显消息,类型值为 8 |
重定向 | 路由器发送“重定向”消息,告诉发送主机到目标 IPv4 地址更好的路由,类型值为 5 |
源抑制 | 路由器发送“源结束”消息,告诉发送主机它们的 IPv4 数据报将被丢弃,因为路由器上发生了拥塞,于是发送主机将以较低的频度发送数据报,类型值为 4 |
超时 | 这个消息有两种用途。当超过 IP 生存期时向发送系统发出错误信息;如果分段的 IP 数据报没有在某种期限内重新组合,这个消息将通知发送系统,类型值为 11 |
无法到达目标 | 路由器和目标主机发送“无法到达目标”消息,通知发送主机它们的数据无法传送,类型值为 3 |
其中无法到达目标消息中可以细分为一下几项
无法到达目标消息 | 说明 |
---|---|
不能访问主机 | 路由器找不到目标的 IPv4 地址的路由时发送“不能访问主机”消息 |
无法访问协议 | 目标 IPv4 节点无法将 IPv4 报头中的“协议”字段与当前使用的 IPv4 客户端协议相匹配时会发送“无法访问协议”消息 |
无法访问端口 | IPv4 节点在 UDP 报头中的“目标端口”字段与使用该 UDP 端口的应用程序相匹配时发送“无法访问端口”消息 |
需要分段但设置了 DF | 当必须分段但发送节点在 IPv4 报头中设置了“不分段(DF)”标志时,IPv4 路由器会发送“需要分段但设置了 DF”消息 |
ICMP 协议只是试图报告错误,并对特定的情况提供反馈,但最终并没有使 IPv4 成为一个可靠的协议。ICMP 消息是以未确认的 IPv4 数据报传送的,它们自己也不可靠。
ICMP 的报文格式
ICMP 报文包含在 IP 数据报中,IP 报头在 ICMP 报文的最前面。一个 ICMP 报文包括 IP 报头(至少 20 字节)、ICMP 报头(至少八字节)和 ICMP 报文(属于 ICMP 报文的数据部分)。当 IP 报头中的协议字段值为 1 时,就说明这是一个 ICMP 报文。
ICMP 报头如下图所示:
发表评论