是用sr发送的icmp数据包
时间: 2025-05-10 09:28:47 浏览: 30
在 Python 中使用 ICMP 协议发送数据包通常不是直接通过标准库完成的,因为这涉及到较低级别的网络编程。ICMP(Internet Control Message Protocol)主要用于在网络设备之间传递控制消息,如路由不可达、主机不可达等通知。为了发送和接收 ICMP 数据包,你需要利用一些专门为此目的设计的第三方库或工具。
一种常见的做法是在 Linux 或 macOS 上使用 `ping` 命令行工具来进行简单的 ICMP 回显请求测试,并可以通过系统的 subprocess 模块调用这个命令来间接实现。但是这种方法并不适合所有平台也不够灵活。
另一种更好的选择是借助像 **scapy** 这样的强大而灵活的 Python 包。Scapy 允许用户构建自定义的数据包并在底层协议栈上工作,包括但不限于 IP、TCP、UDP 和 ICMP 等多种协议。下面是一个简化的例子展示如何创建一个 ICMP Echo Request 并将其发送出去:
### 使用 Scapy 发送 ICMP 数据包
首先需要安装 scapy:
```bash
pip install scapy
```
接下来是一份基本示例代码:
```python
from scapy.all import *
import sys
def send_icmp(destination_ip, count=4):
for i in range(count): # 默认发送四个 ping 请求
packet = IP(dst=destination_ip)/ICMP() / "Hello World"
reply = sr1(packet, timeout=2) # 发送单个 ICMP echo request
if reply is None:
print(f"No response from {destination_ip} [Timeout]")
elif reply.type == 0: # 如果收到的是 ICMP Echo Reply 类型的消息,则表示目标可达
print(f"Reply from {reply.src}: time={reply.time - packet.sent_time:.3f}s")
if __name__ == "__main__":
dest_ip = input("Enter destination IP address:")
try:
send_icmp(dest_ip)
except KeyboardInterrupt:
print("\nPing interrupted by user.")
sys.exit(0)
```
在这个脚本中,我们定义了一个函数 `send_icmp()` 来接受目的地 IP 地址以及可选次数参数,默认情况下会向指定地址发送 4 次 ICMP Echo Requests (即“ping”),并将每次得到的结果打印出来。请注意,运行此脚本可能需要管理员权限才能建立原始套接字并访问低层网络功能。
另外需要注意的一点是,在 Windows 上由于安全限制可能会比较难做到这一点,因此建议在 Unix-like 操作系统环境下试验上述代码。
最后提醒一点,尽管 Scapy 提供了很多强大的特性用于深入研究网络流量,但在实际生产环境中应当谨慎部署,确保遵守所在国家及地区的法律法规,尊重他人的隐私权和服务条款。
阅读全文
相关推荐


















