摘自:《深入理解计算机网络》 王达著 机械工业出版社
相关知识链接
1. IPV4数据报头部格式请点击这里
2. IPv6数据报头部格式请点击这里
3. IPv4数据报的封装与解封装请点击这里
4. IPv4数据报的分段与重组请点击这里
5. ARP协议报文格式及ARP表
6. ARP地址解析原理

ICMP协议及报文格式

ICMP(Internet Control Message Protocol)因特网控制报文协议。它是IPv4协议族中的一个子协议,用于IP主机、路由器之间传递控制消息。控制消息是在网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然不传输用户数据,但是对于用户数据的传递起着重要的作用。
ICMP协议与ARP协议不同,ICMP靠IP协议来完成任务,所以ICMP报文中要封装IP头部。它与传输层协议(如TCP和UDP)的目的不同,一般不用来在端系统之间传送数据,不被用户网络程序直接使用,除了想Ping和Tracert这样的诊断程序。

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报头如下图所示。

各字段说明

  • 类型:占一字节,标识ICMP报文的类型,目前已定义了14种,从类型值来看ICMP报文可以分为两大类。第一类是取值为1~127的差错报文,第2类是取值128以上的信息报文。
  • 代码:占一字节,标识对应ICMP报文的代码。它与类型字段一起共同标识了ICMP报文的详细类型。
  • 校验和:这是对包括ICMP报文数据部分在内的整个ICMP数据报的校验和,以检验报文在传输过程中是否出现了差错。其计算方法与在我们介绍IP报头中的校验和计算方法是一样的。
  • 标识:占两字节,用于标识本ICMP进程,但仅适用于回显请求和应答ICMP报文,对于目标不可达ICMP报文和超时ICMP报文等,该字段的值为0。

常见的ICMP报文

相应请求

我们日常进行的Ping操作中就包括了相应请求(类型字段值为8)和应答(类型字段值为0)ICMP报文。一台主机向一个节点发送一个类型字段值为8的ICMP报文,如果途中没有异常(如果没有被路由丢弃,目标不回应ICMP或者传输失败),则目标返回类型字段值为0的ICMP报文,说明这台主机存在。

目标不可达,源抑制和超时报文

这三种报文的格式是一样的。目标不可到达报文(类型值为3)在路由器或者主机不能传递数据时使用。例如我们要连接对方一个不存在的系统端口(端口号小于1024)时,将返回类型字段值3、代码字段值为3的ICMP报文。常见的不可到达类型还有网络不可到达(代码字段值为0)、主机不可达到(代码字段值为1)、协议不可到达(代码字段值为2)等等。
源抑制报文(类型字段值为4,代码字段值为0)则充当一个控制流量的角色,通知主机减少数据报流量。由于ICMP没有回复传输的报文,所以只要停止该报文,主机就会逐渐恢复传输速率。最后,无连接方式网络的问题就是数据报回丢失,或者长时间在网络游荡而找不到目标,或者拥塞导致主机在规定的时间内无法重组数据报分段,这时就要触发ICMP超时报文的产生。
超时报文(类型字段值为11)的代码域有两种取值:代码字段值为0表示传输超时,代码字段值为1表示分段重组超时。

时间戳请求

时间戳请求报文(类型值字段13)和时间戳应答报文(类型值字段14)用于测试两台主机之间数据报来回一次的传输时间。传输时,主机填充原始时间戳,接受方收到请求后填充接受时间戳后以类型值字段14的报文格式返回,发送方计算这个时间差。有些系统不响应这种报文。

ICMP协议及报文格式相关推荐

  1. 计算机网络考试数据包格式,计算机网络实验 分析ICMP协议数据包格式.doc

    计算机网络实验 分析ICMP协议数据包格式 实 验 报 告 实验课程名称 计算机网络实验 实验项目名称 分析ICMP协议数据包格式 年 级 08 专 业 电子信息科学与技术 学生姓名 郎子龙 学 号 ...

  2. 常用应用层协议的报文格式

    常见应用层协议的报文格式 1.常用应用程序的端口号 2.HTTP的报文格式 1.常用应用程序的端口号 名称 应用层协议 端口 运输层协议 说明 超文本传输协议 HTTP 80 TCP 域名解析系统 D ...

  3. ARP协议的报文格式

    结构ether_header定义了以太网帧首部:结构arphdr定义了其后的5个字段,其信息 用于在任何类型的介质上传送ARP请求和回答:ether_arp结构除了包含arphdr结构外, 还包含源主 ...

  4. MQTT协议 -- 消息报文格式

    虽然学习协议是枯燥的,但是熟悉协议本身却是很重要的事情.如果能把其细节弄清楚,并且配合一些实验来学习,就不会那么枯燥了. 消息报文格式 MQTT协议是应用层协议,需要借助TCP/IP协议进行传输,类似 ...

  5. HTTP协议【报文格式】

    文章目录 HTTP协议 什么是HTTP协议 HTTP协议格式 抓包工具的使用 HTTP请求 URL URL的组成 URL encode HTTP请求的报文格式 HTTP响应的报文格式 HTTP方法 G ...

  6. ICMP协议及报文类型含义

    1.ICMP简述 ICMP是因特网控制报文协议的简称,它与IP协议同属于OSI结构的第三层网络层,用于传送有关通信问题的消息.例如,数据报不能到达目标站,路由器没有足够的缓存空间,或路由器向发送主机提 ...

  7. 互联网协议 — TCP — 报文格式

    目录 文章目录 目录 TCP 传输控制协议 TCP Header TCP 的分段与拼接 基于硬件卸载的分段与组装 TSO(TCP Segmentation Offload) GSO(Generic S ...

  8. 互联网协议 — UDP — 报文格式

    目录 文章目录 目录 UDP 协议 UDP Header IP & UDP Header UDP Fragment UDP 协议 UDP(User Datagram Protocol,用户数据 ...

  9. ICMP Internet控制报文协议(四)

    (参考文献)TCP/IP详解,卷1:协议 ICMP经常被认为是IP层的一个组成部分.它传递差错报文以及其他需要注意的信息.ICMP报文通常被IP层或更高层协议(TCP和UDP)使用. ICMP报文是在 ...

最新文章

  1. java三段式if_Java几种常用的断言风格你怎么选?
  2. (0108)iOS开发之Xcode11: 删除默认Main.storyBoard、自定义根控制器
  3. 关于ShapeDrawable应用的一些介绍(下)
  4. python字典改键_python 字典修改键的几种方法
  5. java画虚线_java cansvas 画虚线要怎么设置?
  6. 用UIpickView实现省市的联动
  7. 如何割教育培训机构的韭菜?
  8. 常用的Opencv函数汇总(持续更新...)
  9. for循环与求值 学习笔记
  10. Linux -- 特殊权限 (转)
  11. 操作系统 第二部分 进程管理(一)
  12. 7-8-无向图的关节点-图-第7章-《数据结构》课本源码-严蔚敏吴伟民版
  13. 计算机毕业设计Java文档资料管理系统(源码+系统+mysql数据库+Lw文档)
  14. 电商管理系统微服务架构图
  15. Linux内核之 module_init解析 (下)
  16. 分门别类刷leetcode——链表 1
  17. 增大mysql修改表空间_扩充数据库表空间
  18. Pycharm中用Appium框架编写第一个自动化脚本
  19. 使用Charles做弱网测试入门篇
  20. 微信支付SDK(python版)

热门文章

  1. 理解CPU/寄存器/内存之间的关系
  2. linux ip_tos,IP_TOS选项
  3. RTOS 操作系统学习笔记
  4. PS文字调整为复印字效果
  5. (20191231)免费下载论文的方法汇总
  6. unity3dk帧_Unity K帧动画
  7. 变量定义、赋值、初始化
  8. 免费!在线WORD转PDF的方法分享
  9. 学会Python就能做游戏脚本开发?别天真了!
  10. TAPA认证辅导,TAPA全球委员会正式发布了《运输供应商最低安全要求》