一、ICMP 协议

ICMP(Internet Control Message Protocol)即互联网控制报文协议,是TCP/IP协议簇的一个子协议。它主要用于在IP主机、路由器之间传递控制消息,这些消息涉及网络是否通畅、主机是否可达、路由是否可用等关于网络本身的信息。虽然ICMP报文并不传输用户数据,但对于用户数据的传递却起着至关重要的作用。

ICMP报文被封装在IP数据包内部,作为IP数据包的数据部分通过互联网传递。当数据包处理过程中出现差错时,ICMP会向数据包的源端设备报告这个差错,但并不会纠正这个差错,也不会通知中间的网络设备。这是因为ICMP报文只包含源端和最终的目的端的信息,并不记录报文在网络传递中的全部路径。

ICMP协议共有五种常用类型,包括回显请求(Echo Request)、回显应答(Echo Reply)、目标不可达(Destination Unreachable)、参数问题(Parameter Problem)和红牌。此外,还有时间戳、信息等较少使用的类型。

  • 回显请求报文用于测试网络的连通性和延迟。发送方发送一个回显请求报文到目标主机,目标主机收到请求后回复一个回显应答报文。
  • 回显应答报文是目标主机收到回显请求后产生的响应,用于确认网络连通性和延迟。
  • 当网络中的路由器或主机无法将数据包送达目标主机时,会发送目标不可达报文。
  • 当接收方发现数据包中的某个参数错误时,会发送参数问题报文。

ICMP报文格式分为两个部分:首部和数据部分。在数据部分中,前四个字节是统一的格式,第一个字节是类型,占8位;类型的右边是代码,也占8位;检验在最右边,占两个字节,即16位。第二行有4个字节,占32位。第四个字节取决于ICMP报文的类型。

总的来说,ICMP协议在网络通信中扮演着重要的角色,通过传递控制消息来确保数据的正确和有效传输。如需更多关于ICMP协议的详细信息,建议查阅计算机网络技术相关书籍或咨询该领域的专业人士。

二、ICMP 头

以下是ICMP头部结构的表格解析:

字段长度(字节)描述
类型(Type)1用于标识ICMP报文的作用及格式。例如,8表示回送请求(Echo),0表示回送应答(Echo Reply)。
代码(Code)1进一步划分ICMP报文的类型,标识错误的原因。如果一个类型中只有一种功能,代码域置为0。
校验和(Checksum)2用于差错校验,由ICMP头部和数据部分共同计算得出。校验和的计算方法和IP协议校验和算法是一样的。
标识符(Identifier)4如果是ICMP请求报文,该字段在Linux/macOS中用的是进程ID。对于回显请求和回显应答报文,标识符帮助匹配请求和应答。
序列号(Sequence Number)4对于回显请求和回显应答报文,序列号帮助匹配请求和应答,并用来确定回显请求报文的顺序。

需要注意的是,ICMP头部长度为8字节,这包括了上述的字段。后面紧跟的是ICMP报文的数据部分,其长度和内容取决于ICMP报文的类型。ICMP报文实际上还是通过IP层传输,ICMP头部和ICMP数据部分组成完整的报文,然后再添加IP协议头部报文,形成完整的IP报文,最后再通过数据链路层生成以太网帧进行传输。

此外,关于字节和数字的存储顺序,网络存储顺序是从左到右,依次从低位到高位,这与字节和数字的常规存储顺序(从右到左,依次从低位到高位)是相反的。

这个表格提供了一个关于ICMP头部结构的深入解析,有助于理解ICMP报文如何在网络中传输和处理。如需更多关于ICMP协议的详细信息,建议查阅计算机网络技术相关书籍或咨询该领域的专业人士。

三、ICMP 类型和消息

ICMP(Internet Control Message Protocol,互联网控制消息协议)的类型和消息是其核心组成部分,用于在网络中传递各种控制信息。下面我们将深入解析ICMP的类型和消息。

ICMP类型

ICMP类型字段占一字节,用于标识ICMP报文的类型。目前定义了14种类型,取值范围在1到255之间。根据类型值,ICMP报文可以分为差错报文(1~127)和信息报文(128以上)。常见的ICMP类型包括:

  • 回显请求(Echo Request):通常用于测试网络的连通性和延迟。发送方发送一个回显请求报文到目标主机,目标主机收到请求后回复一个回显应答报文。
  • 回显应答(Echo Reply):目标主机对回显请求报文的响应,用于确认网络连通性和延迟。
  • 目标不可达(Destination Unreachable):当路由器或主机无法将数据包送达目标主机时,会发送此报文。这可能是由于多种原因,如主机不可达、协议不可达、端口不可达等。
  • 超时(Time Exceeded):当数据包在传输过程中生存时间(TTL)超时,或在某个节点上停留时间过长时,会发送此报文。

此外,还有重定向、源站抑制、参数问题等其他类型。

ICMP消息

ICMP消息由消息类型、代码、校验和和数据字段组成。其中,消息类型和代码共同决定了ICMP消息的具体功能和用途,而数据字段根据不同的消息类型和代码而有所变化。

ICMP消息主要用于传递网络错误报告和诊断信息,以及支持一些网络工具和应用程序(如ping、traceroute)的正常运行。例如,当数据包无法到达目标主机时,路由器会发送一个目标不可达的ICMP消息,告知发送方错误的原因。这样,发送方就可以根据这些信息调整网络配置或采取其他措施。

总的来说,ICMP的类型和消息是网络通信中不可或缺的一部分,它们通过传递控制信息来确保数据的正确和有效传输。深入理解ICMP的类型和消息对于网络管理员和开发人员来说是非常重要的,有助于他们更好地管理和优化网络性能。

四、请求与响应

在ICMP(Internet Control Message Protocol)协议中,有一些常见的请求和响应类型,用于在网络中进行通信和故障排除。下面是ICMP协议中常见的请求和响应类型:

1. ICMP Echo请求和回应(Ping):ICMP Echo请求是一种常见的网络工具,用于测试主机的可达性和延迟。发送方发送一个Echo请求数据包到目标主机,目标主机接收到请求后,会发送一个Echo回应数据包作为响应。这种请求和响应用于网络诊断和测量网络延迟。

使用 Wireshark 抓包 Ping 命令

请求数据包的结构

响应包

2. ICMP Timestamp请求和回应:ICMP Timestamp请求用于获取目标主机的时间戳信息。发送方发送一个Timestamp请求数据包到目标主机,目标主机接收到请求后,会返回一个带有时间戳信息的Timestamp回应数据包。

3. ICMP Redirect请求和响应:ICMP Redirect用于向主机发送路由重定向信息。当一个主机发送数据包到错误的网关时,网关可以发送一个Redirect请求给主机,指示其将流量发送到更合适的网关。

4. ICMP Destination Unreachable(目的地不可达):当一个主机无法到达目标主机或端口时,目标主机会发送一个Destination Unreachable响应给发送方,通知其无法到达目标。

5. ICMP Time Exceeded(时间超过):当一个数据包在网络中被路由器丢弃或超过最大生存时间(TTL),路由器会发送一个Time Exceeded响应给发送方,通知其数据包的生存时间已过。

6. ICMP Parameter Problem(参数问题):当一个数据包的IP头或上层协议头部有问题时,接收方可以发送一个Parameter Problem响应给发送方,通知其存在参数错误。

这些ICMP请求和响应类型在网络中起着重要的作用,用于网络诊断、故障排除和通信确认。然而,攻击者也可以利用ICMP协议进行攻击,如ICMP洪水攻击(ICMP Flood)和ICMP回显请求攻击(Ping of Death)。为了保护网络免受这些攻击,建议使用防火墙、入侵检测/预防系统(IDS/IPS)和流量过滤等安全措施。

五、路由跟踪

ICMP中的路由跟踪主要通过Traceroute(路由追踪)工具实现。Traceroute利用ICMP报文和IP头部的TTL(Time-to-Live)字段来跟踪IP数据包在网络中的路径。

TTL字段指定了数据包在经过路由器转发时能够经过的最大网段数量。当源主机发送数据包时,会设置一个初始的TTL值。每经过一个路由器,TTL值就会减一。当TTL值减为零时,路由器会丢弃该数据包,并发送一个ICMP超时差错报文给源主机。

Traceroute发送的数据包中包含了特殊的ICMP报文(如超时差错控制报文),并逐渐增加数据包的TTL值。每当数据包经过一个路由器时,TTL值会减一,直到TTL值为零时,路由器会发送ICMP超时差错报文。通过收集这些ICMP报文,Traceroute可以确定数据包经过的路由路径,并显示每个路由器或网络节点的地址。

此外,Traceroute还可以用于分析网络性能,如响应时间、丢包率和响应时延等。它可以帮助网络管理员诊断网络问题,找出网络瓶颈或故障点,从而优化网络配置和性能。

需要注意的是,Traceroute的实现原理可能因不同的操作系统和网络环境而有所差异。一些系统可能不支持所有的Traceroute选项或功能。因此,在实际使用中,需要参考具体系统或工具的文档,并根据实际情况进行配置和使用。

总的来说,ICMP中的路由跟踪是一种强大的网络诊断工具,通过Traceroute等工具可以帮助我们深入了解数据包在网络中的传输路径和性能表现。

使用 Wireshark 抓包 tarcert 命令

TTL 值为 1 的数据包 

因为它的 TTL 值减 1 变为了 0,所以不能继续传输,因此目的不可达 

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐