--------------------------------格式-------------------------------------
各种ICMP报文的前32bits都是三个长度固定的字段:type类型字段(8位)、code代码字段(8位)、checksum校验和字段(16位)
8bits类型和8bits代码字段:一起决定了ICMP报文的类型。常见的有:
类型8、代码0:回射请求。
类型0、代码0:回射应答。
类型11、代码0:超时。
16bits校验和字段:包括数据在内的整个ICMP数据包的校验和,其计算方法和IP头部校验和的计算方法是一样的。
下图是一张ICMP回射请求和应答报文头部格式
对于ICMP回射请求和应答报文来说,接下来是16bits标识符字段:用于标识本ICMP进程。
最后是16bits序列号字段:用于判断回射应答数据报。
ICMP报文包含在IP数据报中,属于IP的一个用户,IP头部就在ICMP报文的前面
一个ICMP报文包括IP头部(20字节)、ICMP头部(8字节)和ICMP报文
IP头部的Protocol值为1就说明这是一个ICMP报文
ICMP头部中的类型(Type)域用于说明ICMP报文的作用及格式
此外还有代码(Code)域用于详细说明某种ICMP报文的类型
所有数据都在ICMP头部后面。RFC定义了13种ICMP报文格式,具体如下:
类型代码 类型描述
0 响应应答(ECHO-REPLY)
3 不可到达
4 源抑制
5 重定向
8 响应请求(ECHO-REQUEST)
11 超时
12 参数失灵
13 时间戳请求
14 时间戳应答
15 信息请求(*已作废)
16 信息应答(*已作废)
17 地址掩码请求
18 地址掩码应答
其中代码为15、16的信息报文已经作废。
下面是几种常见的ICMP报文:
1.响应请求
我们日常使用最多的ping,就是响应请求(Type=8)和应答(Type=0),一台主机向一个节点发送一个Type=8的ICMP报文,如果途中没有异常(例如被路由器丢弃、目标不回应ICMP或传输失败),则目标返回Type=0的ICMP报文,说明这台主机存在,更详细的tracert通过计算ICMP报文通过的节点来确定主机与目标之间的网络距离。
2.目标不可到达、源抑制和超时报文
这三种报文的格式是一样的,目标不可到达报文(Type=3)在路由器或主机不能传递数据报时使用,例如我们要连接对方一个不存在的系统端口(端口号小于1024)时,将返回Type=3、Code=3的ICMP报文,它要告诉我们:“嘿,别连接了,我不在家的!”,常见的不可到达类型还有网络不可到达(Code=0)、主机不可到达(Code=1)、协议不可到达(Code=2)等。源抑制则充当一个控制流量的角色,它通知主机减少数据报流量,由于ICMP没有恢复传输的报文,所以只要停止该报文,主机就会逐渐恢复传输速率。最后,无连接方式网络的问题就是数据报会丢失,或者长时间在网络游荡而找不到目标,或者拥塞导致主机在规定时间内无法重组数据报分段,这时就要触发ICMP超时报文的产生。超时报文的代码域有两种取值:Code=0表示传输超时,Code=1表示重组分段超时。
3.时间戳
时间戳请求报文(Type=13)和时间戳应答报文(Type=14)用于测试两台主机之间数据报来回一次的传输时间。传输时,主机填充原始时间戳,接收方收到请求后填充接收时间戳后以Type=14的报文格式返回,发送方计算这个时间差。一些系统不响应这种报文。
--------------------------------种类-------------------------------------
ICMP报文格式
ICMP虽然是网络层的协议,但要将ICMP报文放入IP中发送。
ICMP报文的公共头标由1字节的类型(type)、1字节的
代码(code)和2字节的校验和(checksum)组成。
类型域和代码域用来标识各种ICMP报文。类型域表示ICMP报文的类型,目前已定义了14
种,从类型值来看ICMP报文可分为二大类。
第1 类是取值为1~127的差错报文,
第2类是取值128以上的是信息(informational)报文。
1不能到达信宿(Destination Unreachable)差错报文
2分组过大(Packet Too Big)差错报文
3超时(Time Exceeded)差错报文
4参数问题(Parameter Problem)差错报文
128返回请求(Echo Request)报文
129返回应答(Echo Reply)报文
130组成员查询(Group Membership Query)
131组成员报告(Group Membership Report)
132组成员结束(Group Membership Termination)
133路由器请求(Router Solicitation)
134路由器公告(Router Advertisement)
135邻机请求(Neighbor Solicitation)
136邻机公告(Neighbor Advertisement)
137 重定向(Redirect)
分享到:
相关推荐
了解ICMP报文的格式和种类对于网络管理和故障排查至关重要。 #### ICMP报文的基本结构 ICMP报文位于IP数据报的数据部分,由以下三部分构成: - **类型(Type)字段**:占用8位,定义了ICMP报文的具体类型。 - **...
ICMP报文格式包括类型、代码、校验和等字段,其中类型字段定义了报文的种类,如回送请求/应答报文、目的不可达报文和超时报文等。 传输层中的TCP报文段格式用于保证数据的可靠传输。TCP头包括源端口地址、目的端口...
ICMP报文通常由路由器或主机发送,用于传递网络诊断信息,如网络不可达、超时、参数错误等。本主题聚焦于如何使用C语言来接收并解析ICMP ECHO(回显)报文,这通常是ping命令的工作原理。 首先,理解ICMP ECHO报文...
1. **类型字段**:8位,定义了ICMP报文的种类,如回显请求(ping)、回显应答(pong)、时间超时、参数问题等。 2. **代码字段**:8位,进一步细化类型,每个类型可能有多个不同的代码值。 3. **校验和字段**:16位...
- Type(类型):表示ICMP报文的种类,如回显请求、回显应答、目标不可达等。 - Code(代码):进一步细化类型,比如目标不可达报文有多种具体原因(网络不可达、主机不可达、端口不可达等)。 - Checksum(校验和)...
ICMP报文分为两大类:差错报告报文和查询报文。差错报告报文用于向源主机报告在网络中遇到的问题,如目标不可达、超时、参数问题等。查询报文则用于获取网络状态信息,如回显请求(ping)和回显应答(pong)。 要...
ICMP报文结构简单,主要包括类型、代码和校验和字段,有时还携带部分原始IP数据报的信息,以便于定位问题。类型字段定义了报文的种类,代码字段则进一步细化了具体的问题或请求类型。校验和字段用于确保报文在传输...
【ICMP报文格式】: 每个ICMP报文都有一个固定的头部,包含4个字节:类型、代码和检验和。根据ICMP报文的类型,后续的4个字节会有所不同。这些字段用于标识报文的种类和处理方式。 【ICMP报文类型】: 分为两大类:...
例如,定义ICMP头部的结构体,声明发送和接收ICMP报文的函数。 综上所述,"icmp源代码 TCP/IP协议栈 C语言实现"项目涉及到构建一个能够处理ICMP协议的底层网络组件。通过理解ICMP协议的工作原理,以及如何在C语言中...
#### 三、ICMP报文种类 - **ICMP差错报告报文**: - 包括五种类型的差错报告报文: 目标不可达、源点抑制、时间超过、参数问题、重定向。 - 这些报文用于报告网络中的错误情况,如无法到达的目的地或数据包过期等。...
`sizeof(struct icmp6_hdr)`则表示ICMPv6头部的大小,ICMPv6头部通常包含类型、代码、校验和字段,以及可能根据不同类型报文而变化的数据字段。类型字段定义了报文的种类,如错误消息或信息查询;代码进一步细化了...
1. ICMP报文类型和代码:了解ICMP报文如何分类,每种类型下又有哪些特定的代码,以及它们分别对应哪些网络问题。 2. ICMP报文结构:理解ICMP报文的基本构成,包括报文头和数据字段。 3. ICMP报文的生成和处理:学习...
2. ICMP报文分类 ICMP报文分为两大类:差错报文(56字节)和询问报文(40字节)。差错报文用于报告错误,如目的不可达、源抑制、超时等;询问报文主要包括ICMP Echo请求和应答,即我们熟知的Ping命令。 3. ICMP ...
ICMP报文有两类:差错报告报文和询问报文。它们都包含一个固定的头部和可变长度的数据部分。头部由4个字节组成,包括类型(8位)、代码(8位)和检验和(16位)。类型字段区分不同的报文种类,代码字段则进一步细分...
ICMP报文的格式包括一个8字节的固定头部和可变长度的数据部分。头部包含了消息类型、代码、校验和以及特定于消息类型的数据。其中,消息类型定义了报文的用途,代码进一步细化了具体问题或查询的种类。校验和用于...
它覆盖整个ICMP报文,包括原始IP数据包的IP首部和ICMP头部。 4. **剩余字段**:根据类型和代码的不同,可能包含额外的信息,如时间戳、序列号、IP地址等。 ### ICMP与TCP/IP协议栈的关系 ICMP不是传输层协议,...
1. IP数据报:包含IP首部和ICMP报文。 2. ICMP报文:由固定部分(前4个字节)和可变部分组成。固定部分包括类型字段、代码字段和校验和字段。类型字段指示报文的种类,代码字段进一步细化类型,校验和用于确保数据...