轻松构建并发送ICMP数据包

本文介绍了如何使用NDebug工具构造并发送ICMP数据包,包括设置回显请求和应答消息,以及如何查看Wireshark中的捕获结果。通过此工具,可以简化网络通信中ICMP协议的数据包操作。

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

这里就不细将ICMP协议了,随便一搜都是一堆。一个完整ICMP数据包如下结构。

 

 

 从零构造并发送一个数据包确实不容易,但是我们有更简单的方法。《NDebug》

我们打开NDebug。

它会列出目前正在使用的网卡等一些信息,我们勾选发送数据包(注:不勾选发送数据包 直接点击接口是抓包页面)。如下

 

 而后选择正在使用的网卡 点击,之后我们点击选择协议 选择ICMP下的回显请求包。可以看到它帮我们自动填写了一些参数。长度、首部检验和、ICMP检验和都是自动计算的。并且目光所及都是可以根据自身需要进行修改。

 现在我们把参数填写完整。这里我只填写了 目的MAC地址、源IP 、目的IP与数据。这里填的目的MAC是 11.11.11.11 网关的MAC地址。好 点击发送 然后到Wireshark去看看。

可以看到的确成功了,并且收到了网关的应答消息 数据也是刚才我们输入的。其他参数也分毫不差

 

接下来我们更改ICMP头部类型字段8 -> 0,其他不变 让其从请求消息变成应答消息,点击发送后我们看到真的给网关发送了一个应答消息(reply) 。

此软件如果给到网络专业的老师手里应该嗷嗷的 😄哈哈

 

 

 

### ICMP协议的数据包类型及用途 ICMP(Internet Control Message Protocol)是网络层的重要协议之一,用于在网络中传递控制消息和错误信息。以下是ICMP协议的主要数据包类型及其用途: #### 1. 差错报告 - **目的不可达(Type 3)**:当路由器或目标主机无法将数据包发送到指定的目的地时,会生成此消息。代码字段进一步描述了不可达的具体原因,例如代码0表示网络不可达,代码1表示主机不可达[^2]。 - **超时(Type 11)**:当数据包的TTL(Time to Live)值减为0时,中间路由器会丢弃该数据包返回超时消息给源主机。这种消息通常用于诊断网络路径中的问题[^2]。 - **参数问题(Type 12)**:如果接收到的数据包头部含无效字段或参数,接收端会返回参数问题消息,指出问题的具体位置[^2]。 #### 2. 网络诊断 - **回显请求与应答(Type 8 和 Type 0)**:ping命令基于这两种消息实现。源主机发送回显请求(Type 8),目标主机收到后返回回显应答(Type 0)。通过这一过程可以测试网络连通性,测量数据包往返时间(RTT)[^2]。 - **时间戳请求与应答(Type 13 和 Type 14)**:时间戳请求消息用于获取目标主机的时间信息,目标主机收到后返回时间戳应答消息。这种消息可用于同步网络设备的时间。 #### 3. 路由器发现 - **路由器询问(Type 10)**:主机发送路由器询问消息以查找本地网络中的可用路由器。 - **路由器通告(Type 9)**:路由器定期广播通告消息,向本地网络中的主机提供其存在信息[^2]。 #### 4. 源抑制(Type 4) 当网络出现拥塞时,路由器可以向源主机发送源抑制消息,要求其降低发送速率。这种机制有助于缓解网络拥塞状况[^2]。 #### 5. 数据包重定向(Type 5) 当路由器检测到更优的传输路径时,会向源主机发送重定向消息,建议其使用新的路由地址。这种消息可以帮助优化网络流量的路由选择。 #### 示例代码:构造一个简单的ICMP回显请求数据包 以下是一个Python示例,展示如何使用`socket`模块构造发送ICMP回显请求数据包: ```python import socket import struct # 创建原始套接字 sock = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_ICMP) # 定义目标地址 target_ip = "192.168.1.1" # 构造ICMP头部 type_ = 8 # 回显请求 code = 0 checksum = 0 identifier = 1 sequence = 1 # 计算校验和 def calculate_checksum(data): checksum = 0 for i in range(0, len(data), 2): if i + 1 < len(data): word = (data[i] << 8) + data[i + 1] else: word = data[i] checksum += word checksum = (checksum & 0xFFFF) + (checksum >> 16) return ~checksum & 0xFFFF icmp_header = struct.pack('!BBHHH', type_, code, checksum, identifier, sequence) payload = b'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789' icmp_packet = icmp_header + payload checksum = calculate_checksum(icmp_packet) icmp_header = struct.pack('!BBHHH', type_, code, checksum, identifier, sequence) icmp_packet = icmp_header + payload # 发送数据包 sock.sendto(icmp_packet, (target_ip, 1)) ```
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值