python icmp socket
时间: 2023-10-11 22:08:10 浏览: 171
python icmp socket 是一个socket模块中的函数,用于发送和接收ICMP数据包。ICMP(Internet Control Message Protocol)是一种网络协议,用于在IP网络上传输错误消息和操作性消息。通过使用python icmp socket函数,可以实现对ICMP数据包的发送和接收。
相关问题
python icmp
以下是一个使用 Python 发送 ICMP 消息的例子,使用 Python 标准库 socket 实现:
```python
import socket
import struct
import select
import time
# 构造 ICMP 报文
def create_packet():
# type 8 表示发送 Echo Request 请求
# code 0 表示无差错
# checksum 先填 0,后面计算
# id 和 sequence number 都随便填一个数字
header = struct.pack("bbHHh", 8, 0, 0, 12345, 1)
data = b"hello, world!"
checksum = calculate_checksum(header + data)
header = struct.pack("bbHHh", 8, 0, checksum, 12345, 1)
packet = header + data
return packet
# 计算校验和
def calculate_checksum(data):
if len(data) % 2 != 0:
data += b"\x00"
checksum = 0
for i in range(0, len(data), 2):
word = (data[i] << 8) + data[i+1]
checksum += word
checksum = (checksum >> 16) + (checksum & 0xffff)
checksum = checksum + (checksum >> 16)
return ~checksum & 0xffff
# 发送 ICMP 报文并等待响应
def ping(destination, timeout=1):
# 创建 socket
icmp_socket = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.getprotobyname("icmp"))
icmp_socket.settimeout(timeout)
# 构造 ICMP 报文
packet = create_packet()
# 发送 ICMP 报文
icmp_socket.sendto(packet, (destination, 0))
# 等待响应
start_time = time.time()
while True:
# select 可以等待多个文件描述符就绪
# 第一个参数是需要等待的文件描述符列表,第二个参数是超时时间(单位秒)
ready_to_read, _, _ = select.select([icmp_socket], [], [], max(0, start_time + timeout - time.time()))
if ready_to_read:
# 收到响应
reply_packet, address = icmp_socket.recvfrom(1024)
time_cost = (time.time() - start_time) * 1000
# 解析响应报文
icmp_type, _, checksum, _, sequence = struct.unpack("bbHHh", reply_packet[20:28])
if icmp_type == 0 and checksum == calculate_checksum(reply_packet[20:28]):
print(f"Reply from {address}, time={time_cost:.3f} ms, sequence={sequence}")
return True
else:
# 超时
print("Request timed out.")
return False
# 测试
ping("www.google.com")
```
这个例子中,我们首先构造了一个 ICMP 报文,包含 Echo Request 请求和一些数据。然后,我们使用 socket 发送这个报文,等待响应。在等待响应的过程中,我们使用 select 函数来等待文件描述符就绪,以避免阻塞。如果收到响应,我们解析响应报文并打印出 ICMP 序列号、时间等信息。如果超时没有收到响应,则打印 "Request timed out."。
掌握 ICMP 协议的报文格式 2.理解不同类型 ICMP 报文的具体意义 3.了解常见的网络故障 4.理解 TraceRoute 的工作机制 5.掌握基于 Python 的 ICMP 报文的编辑与发送 6.掌握基于 Python 的 ICMP 活动主机扫描
1. ICMP协议报文格式
ICMP协议的报文格式如下:
```
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| type | code | checksum |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| identifier | sequence number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| data (variable length) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
```
其中,各字段的含义如下:
- Type:报文类型,占1个字节,表示ICMP报文的类型。
- Code:报文代码,占1个字节,表示具体的错误类型。
- Checksum:校验和,占2个字节,校验ICMP报文是否损坏。
- Identifier:标识符,占2个字节,用于在请求和响应报文之间进行匹配。
- Sequence number:序列号,占2个字节,用于标识请求和响应报文之间的顺序。
- Data:数据,可变长度,可以是原始报文或者错误信息等。
2. 不同类型ICMP报文的具体意义
ICMP报文包含多种类型,常见的有以下几种:
- Echo Request和Echo Reply:用于Ping测试,通过发送Echo Request报文到目的主机,然后等待目的主机的Echo Reply报文,来检测网络是否正常。
- Destination Unreachable:表示目的主机不可达。
- Source Quench:表示发送方发送数据过快,导致网络拥塞,需要发送方减缓发送速度。
- Time Exceeded:表示数据包在路由器上转发时TTL值为0,导致数据包被丢弃。
- Redirect:表示需要更改路由器的默认路由,以便更好地到达目的主机。
- Router Advertisement和Router Solicitation:用于IPv6网络,用于路由器自动配置。
3. 常见的网络故障
常见的网络故障有以下几种:
- 网络连接故障:包括物理连接故障、IP地址冲突等。
- 路由问题:包括路由器设置错误、路由器故障等。
- DNS问题:包括DNS服务器故障、DNS缓存问题等。
- 网络安全问题:包括黑客攻击、病毒攻击等。
4. TraceRoute的工作机制
TraceRoute是一种网络诊断工具,用于检测数据包从本地主机到目的主机经过的路径。它的工作原理是发送UDP数据包到目的主机,并在每个路由器上增加TTL值,这样每个路由器都会丢弃TTL值为0的数据包,并发送一个ICMP Time Exceeded报文给源主机。通过分析这些ICMP报文,TraceRoute可以确定数据包的路径。
5. 基于Python的ICMP报文的编辑与发送
可以使用Python的socket库来编辑和发送ICMP报文。具体步骤如下:
- 创建socket:使用socket.socket()函数创建一个socket对象,指定socket类型为SOCK_RAW。
- 构建ICMP报文:使用struct.pack()函数将ICMP报文的各字段打包成二进制字符串。
- 计算校验和:对整个ICMP报文计算校验和,使用Python的checksum函数可以快速计算校验和。
- 发送报文:使用socket.sendto()函数将ICMP报文发送到目的主机。
6. 基于Python的ICMP活动主机扫描
可以使用Python的socket库和ICMP协议来实现活动主机扫描。具体步骤如下:
- 遍历IP地址:使用Python的ipaddress模块遍历指定网段内的所有IP地址。
- 构建ICMP Echo Request报文:按照ICMP报文格式构建ICMP Echo Request报文。
- 发送报文:使用socket.sendto()函数将ICMP Echo Request报文发送到目标主机。
- 接收响应:使用socket.recvfrom()函数接收目标主机的响应报文。
- 解析响应:对接收到的ICMP Echo Reply报文进行解析,判断目标主机是否在线。
阅读全文