这是 Pypacker:Python 中最快、最简单的底层数据包操作库。 参见下面的示例,了解您可以用它做什么。
一些示例:
由于复杂的身份验证机制,不再支持 pip/pypi,抱歉。
参见:
协议本身(参见 layerXYZ)通常没有太多文档,因为它们由各自的 RFC / 官方标准记录。
测试执行如下:
cd pypackerexport PYTHONPATH=$(pwd):$PYTHONPATHpython tests/test_pypacker.py性能测试结果:
硬件:Intel CPU,4 核 @ 3.2 GHz
Python:CPython v3.10
nr = 本机上的新结果
每轮测试次数:10000
=====================================
>>> 数据包解析 (Ethernet + IP + UDP + DNS):搜索 UDP 端口
耗时:0.1409761905670166s
nr = 70933 p/s
>>> 数据包解析 (Ethernet + IP + TCP + HTTP):搜索 TCP 端口
耗时:0.3157649040222168s
nr = 31669 p/s
>>> 数据包解析 (Ethernet + IP + TCP + HTTP):读取所有头部
耗时:0.5989120006561279s
nr = 16696 p/s
>>> 解析第一层 (IP + ICMP)
耗时:0.014587163925170898s
nr = 685534 p/s
>>> 创建/直接赋值 (仅 IP 头部)
耗时:0.02884364128112793s
nr = 346696 p/s
>>> 不修改时的 bin() (IP)
耗时:0.013646364212036133s
nr = 732795 p/s
>>> 修改并重新计算校验和后的输出 (IP)
耗时:0.07719659805297852s
nr = 129539 p/s
>>> 基本/第一层解析 (Ethernet + IP + TCP + HTTP)
耗时:0.019113540649414062s
nr = 523189 p/s
>>> 修改 Triggerlist 元素值 (Ethernet + IP + TCP + HTTP)
耗时:0.017654895782470703s
nr = 566415 p/s
>>> 修改动态字段 (Ethernet + IP + TCP + HTTP)
耗时:0.006037473678588867s
nr = 1656321 p/s
>>> 直接赋值与拼接 (Ethernet + IP + TCP + HTTP)
耗时:0.2050457000732422s
nr = 48769 p/s
.>>> pypacker 与 dpkt 与 scapy 的性能对比
比较 pypacker、dpkt 和 scapy 的性能(解析 Ethernet + IP + TCP + HTTP)
nr = 本机上的新结果
每轮测试次数:10000
>> 测试 pypacker 解析速度
nr = 194382 p/s
>> 测试 dpkt 解析速度
无法执行 dpkt 测试:ModuleNotFoundError("No module named 'dpkt'")
>> 测试 scapy 解析速度
nr = 2775 p/s
如有任何疑问,请提交错误(将标记为“问题”)。
问:pypacker 有多快?
答:见上述结果。要查看您机器上的详细结果,请执行测试:
python tests/test_pypacker.py PerfTestCase
问:支持哪些协议?
答:目前最低支持的协议有: Ethernet、Radiotap、IEEE80211、ARP、DNS、STP、PPP、OSPF、VRRP、DTP、IP、ICMP、PIM、IGMP、IPX、 TCP、UDP、SCTP、HTTP、NTP、RTP、DHCP、RIP、SIP、Telnet、HSRP、Diameter、SSL、TPKT、Pmap、Radius、BGP
问:是否计划支持 [xyz]?
答:新功能会在我需要或有人贡献时添加到 Pypacker 中——没有正式的计划在未来的版本中添加特定功能的支持。 贡献的一般指南可以在 HACKING 文件中找到。
问:我如何为此项目做贡献?
答:请使用 Gitlab 错误跟踪器提交错误/功能请求。在提交新问题之前,请阅读错误跟踪器以了解已知问题。补丁可以通过拉取请求发送。
问:Pypacker 在 Windows 3.11/XP/7/8/mobile 等系统上存在 xyz 问题。你能修复吗?
答:基本功能应该适用于任何操作系统。可选功能可能会出现问题(例如 interceptor)。
问:Pypacker 采用什么许可证?
答:采用 GPLv2 许可证(更多信息请参阅 LICENSE 文件)。
问:调用 copy.deepcopy(some_packet) 会引发异常 "TypeError: can't pickle Struct objects"。
答:尝试以下解决方法以能够 pickle Struct 对象:
import struct, copyreg
def pickle_struct(s):
return struct.Struct, (s.format,)
copyreg.pickle(struct.Struct, pickle_struct)
pkt_eth, pkt_ip, pkt_tcp, pkt_http = pkt[
None,
(None, lambda b: b.__class__ in [ip.IP, ip6.IP6]),
(tcp.TCP, lambda c: c.dport==80),
http.HTTP
]
...
pkt = Ethernet() + IP() + TCP()
# 这会解析所有层
packet_print = "%s" % pkt
packet_found = pkt[Telnet]
# 替代方案:使用多值索引符号。这将停止在任何不匹配的层进行解析:
packet_found = pkt[Ethernet,IP,TCP,Telnet]
使用 pypy(完整数据包解析方面比 CPython 快约 3 倍)
为了获得更高性能,禁用自动字段(影响调用 bin(...)):
pkt = ip.IP(src_s="1.2.3.4", dst_s="1.2.3.5") + tcp.TCP()
# 禁用 IP 和 TCP 的校验和计算(以及任何其他更新)(仅此数据包实例)
pkt.sum_au_active = False
pkt.tcp.sum_au_active = False
bts = pkt.bin(update_auto_fields=False)
sysctl -w net.core.rmem_max=12582912
sysctl -w net.core.rmem_default=12582912
sysctl -w net.core.wmem_max=12582912
sysctl -w net.core.wmem_default=12582912
sysctl -w net.core.optmem_max=2048000
sysctl -w net.core.netdev_max_backlog=5000
sysctl -w net.unix.max_dgram_qlen=1000
sysctl -w net.ipv4.tcp_rmem="10240 87380 12582912"
sysctl -w net.ipv4.tcp_wmem="10240 87380 12582912"
sysctl -w net.ipv4.tcp_mem="21228 87380 12582912"
sysctl -w net.ipv4.udp_mem="21228 87380 12582912"
sysctl -w net.ipv4.tcp_window_scaling=1
sysctl -w net.ipv4.tcp_timestamps=1
sysctl -w net.ipv4.tcp_sack=1