ICMP协议

本文深入探讨ICMP协议在网络层的作用、数据发送方式、分类及其应用,如ping命令与traceroute命令的原理与工作过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

(1) ICMP协议工作在网络层

(2) 提出的目的:为了更加有效地转发IP数据报提高交付成功的机会

(3) 作用:

<1> 简单点说:当转发IP数据报出现错误时,给出原因。

<2> 具体点说:当路由器或者主机发送IP数据报出现错误时,路由器或者主机会向源点发送原因。

注意:ICMP是网络层的自我检测,用来检测信息是否到达目的地。若没到达,在提供原因。

(4) 怎么发送数据:以IP数据报为载体发送

具体来说:ICMP差错报文的数据字段:IP数据报的首部和数据字段的前八个字节(包含端口号和发送序号)

(5) 分类:

<1> ICMP差错报告报文 -- 都是由发现问题的主机或路由器向源点发送。

1)终点不可达:找不到目的主机

2)源点抑制:网络拥塞

3)时间超过:收到的数据报生存时间为0(没有在预定时间内收到数据报)

4)参数问题:数据报首部出现问题。

5)改变路由:到达目的地址的最佳路径不经过默认路由,要改变路由表中的表相。

<2> ICMP询问报文

1)回送请求和回答:检测网络性能,通不通

2)时间戳请求和回答:请某个主机或者路由回答当前时间。用于同步。

(6) ICMP协议的应用:

<1> ping命令:判断两个主机之间的连通性

原理:向目的主机发送回送请求和回答报文,之后根据目的主机的回复,就可以检测。

<2> Traceroute命令:获得源点到终点的路径

原理:向目的主机发送一连串IP数据报,IP数据报中包含的是无法交付发的UDP数据报(端口非法)。

具体来说,分两种数据报。

工作原理:Traceroute从源主机向目的主机发送一连串的IP数据报,数据报中封装的是无法交付的UDP用户数据报。

<1> 第一个数据报P1的生存时间TTL设置为1。当P1到达路径上的第一个路由器R1时,路由器R1先收下它,接着把TTL的值减1。由于TTL等于零了,R1就把P1丢弃了,并向源主机发送一个ICMP时间超过差错报告报文

<2> 源主机接着发送第二个数据报P2,并把TTL设置为2。P2先到达路由器R1,R1先收下后把TTL减1再转发给路由器R2。R2收到P2时的TTL为1,但减1后TTL变为零了。R2就丢弃P2,并向源主机发送一个ICMP时间超过差错报告报文。这样一直继续下去。

<3> 当最后一个数据报刚刚到达目的主机时,数据报的TTL是1。主机不转发数据报,也不把TTL值减1。但因IP数据报中封装的是无法交付的运输层的UDP用户数据报,因此目的主机要向源主机发送ICMP终点不可达差错报告报文。这样,源主机达到了自己的目的,因为这些路由器和最后目的主机发来的ICMP报文正好给出了源主机想知道的路由信息——到达目的主机所经过的路由器的IP地址,以及其中的每一个路由器的往返时间。

### ICMP协议的介绍与使用方法 ICMP(Internet Control Message Protocol,互联网控制消息协议)是TCP/IP协议族中的一个重要成员,主要用于在IP网络中传递控制消息和错误信息。ICMP报文作为IP数据报的数据部分进行传输[^1]。它不仅与IP协议紧密相关,还与TCP和UDP等传输层协议协同工作,提供更全面的网络服务。 #### ICMP的基本用途 ICMP的主要功能包括以下几个方面: - **错误报告**:当网络通信中发生错误时,ICMP会生成相应的错误消息并发送给源主机。例如,目标不可达(Type=3)、超时(Type=11)等。 - **诊断工具**:ICMP为网络诊断提供了重要支持。常见的网络诊断工具有ping和traceroute,它们依赖ICMP实现其功能。 - **流量控制**:通过源抑制报文(Source Quench),ICMP可以通知发送方减少数据包的发送速率,以缓解网络拥塞问题[^1]。 #### ICMP协议结构 ICMP报文的格式较为简单,主要包括类型字段(Type)、代码字段(Code)、校验和字段(Checksum)以及根据具体类型定义的额外数据。以下是ICMP报文的基本结构: - **Type**:标识ICMP消息的类型。 - **Code**:进一步细化Type字段的具体含义。 - **Checksum**:用于检测ICMP报文的完整性。 - **剩余数据**:根据不同的ICMP消息类型,这部分内容可能包含IP头部或数据部分的信息。 #### 使用场景 1. **MTU探测**:通过接收“需要分片”差错报文(Type=3, Code=4),动态调整数据包大小,避免分片带来的性能损失[^2]。 2. **网络连通性测试**:使用ping命令向目标主机发送ICMP回显请求(Echo Request)报文,并等待回显应答(Echo Reply)报文。 3. **路径跟踪**:使用traceroute命令结合ICMP时间超过(Time Exceeded)报文来确定数据包到达目标主机的路径。 #### 示例代码 以下是一个简单的Python脚本,演示如何使用`socket`库发送ICMP回显请求报文: ```python import socket import struct import os import time def create_packet(id): # Header is type (8), code (8), checksum (16), id (16), sequence (16) header = struct.pack("bbHHh", 8, 0, 0, id, 1) data = struct.pack("d", time.time()) my_checksum = checksum(header + data) header = struct.pack("bbHHh", 8, 0, my_checksum, id, 1) return header + data def checksum(source_string): count_to = (int(len(source_string) / 2)) * 2 sum_ = 0 count = 0 while count < count_to: this_val = source_string[count + 1] * 256 + source_string[count] sum_ += this_val sum_ &= 0xffffffff count += 2 if count_to < len(source_string): sum_ += source_string[-1] sum_ &= 0xffffffff sum_ = (sum_ >> 16) + (sum_ & 0xffff) sum_ += (sum_ >> 16) answer = ~sum_ & 0xffff answer = socket.htons(answer) return answer def send_ping(dest_addr): try: with socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_ICMP) as sock: packet_id = os.getpid() & 0xFFFF packet = create_packet(packet_id) sock.sendto(packet, (dest_addr, 1)) received, _ = sock.recvfrom(1024) print(f"Received: {received}") except PermissionError: print("Raw sockets require administrative privileges.") if __name__ == "__main__": send_ping("8.8.8.8") ``` #### 安全须知 在实际应用中,需要注意ICMP的安全性问题。例如,合理配置防火墙规则以防止ICMP被用于网络侦察;警惕ICMP Flood攻击,限制请求频率;在某些云环境中,ICMP可能被禁用,此时可考虑使用TCP Ping等替代方案[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值