利用Python中Scapy库分析网络性能
通常网络监控的关键指标:
- 带宽利用率:很亮网络资源的使用情况,避免带宽瓶颈。
- 延时:数据包从源到目的地的传输时间,影响用户体验。
- 丢包率:数据包在传输过程中丢失的比例,影响通信质量。
- 抖动:延迟的变动程度,影响实时应用的稳定性。
常见网络监控技术
- 被动监控:监听网络流量,分析数据包,使用流量分析和异常检测,对网络本身运行不产生影响。
- 主动监控:发送探测信号,主动测试网络设备和路径的可达性和相应时间,适用于性能监控和故障排查。
- 混合监控:结合被动和主动监控,全面检查网络状态。
网络探测工具开发:
有很多工具可用于网络监控,本文探讨的是用Python的库,进行网络探测的方法,检测网络设备的可达性和响应时间,评估网络性能。
一、Scapy
- 安装
pip install scapy
- 调用
from scapy.all import *
- 抓包
使用Scapy中sniff函数可以抓包,例:以下抓取20个数据包并显示其摘要信息。
# 捕获20个数据包
packets = sniff(count=20)
# 显示捕获的数据包摘要
packets.summary()
- 分析包
抓包后,要对数据包进行分析,分析各个字段的详细信息。
for packet in packets:
packet.show()
- 过滤包
过滤数据包,使用BPF(Berkeley Packet Filter)语法过滤所抓取数据包,例:以下捕获TCP数据包。
# 只捕获TCP数据包
tcp_packets = sniff(filter='tcp', count=20)
tcp_packets.summary()
- 保存和读取包
# 保存包到文件
wrpcap('packets.pcap', packets)
# 从文件读取包
packets_from_file = rdpcap('packets.pcap')
packets_from_file.summary()
-
构建和发送数据包
使用Scapy自定义数据包并将其发送到网络。例:以下构建并发送一个ICMP(ping)数据包。
# 构建ICMP数据包
icmp_packet = IP(dst='8.8.8.8') / ICMP()
# 发送数据包并等待响应
response = sr1(icmp_packet)
# 显示响应数据包
response.show()
- 数据包实时嗅探和处理
例:定义回调函数捕获并处理HTTP请求数据包。
# 定义回调函数
def packet_callback(packet):
if packet.haslayer(HTTP):
print(packet[HTTP].summary())
# 实时捕获HTTP数据包
sniff(filter='tcp port 80', prn=packet_callback, store=0)
完整示例:
from scapy.all import *
# 捕获数据包
packets = sniff(count=10)
print("Captured packets:")
packets.summary()
# 显示每个数据包的详细信息
for packet in packets:
packet.show()
# 仅捕获TCP数据包
tcp_packets = sniff(filter='tcp', count=10)
print("Captured TCP packets:")
tcp_packets.summary()
# 保存数据包到文件
wrpcap('packets.pcap', packets)
# 从文件读取数据包
packets_from_file = rdpcap('packets.pcap')
print("Packets read from file:")
packets_from_file.summary()
# 构建并发送ICMP数据包
icmp_packet = IP(dst='8.8.8.8') / ICMP()
response = sr1(icmp_packet)
print("ICMP packet response:")
response.show()
# 实时嗅探并处理HTTP请求数据包
def packet_callback(packet):
if packet.haslayer(HTTP):
print(packet[HTTP].summary())
print("Real-time HTTP packet capture:")
sniff(filter='tcp port 80', prn=packet_callback, store=0)