gpt4 book ai didi

python - 使用 Python 捕获 TCP 数据包

转载 作者:行者123 更新时间:2023-11-28 18:53:57 27 4
gpt4 key购买 nike

我尝试使用 dpkt 和 pcap 使用 Python 捕获 HTTP 下载。代码看起来像

...
pc = pcap.pcap(iface)
for ts, pkt in pc:
handle_packet(pkt)

def handle_packet(pkt):
eth = dpkt.ethernet.Ethernet(pkt)

# Ignore non-IP and non-TCP packets
if eth.type != dpkt.ethernet.ETH_TYPE_IP:
return
ip = eth.data
if ip.p != dpkt.ip.IP_PROTO_TCP:
return

tcp = ip.data
data = tcp.data

# current connection
c = (ip.src, ip.dst, tcp.sport, tcp.dport)

# Handle only new HTTP-responses and TCP-packets
# of existing connections.
if c in conn:
handle_tcp_packet(c, tcp)
elif data[:4] == 'HTTP':
handle_http_response(c, tcp)
...

handle_http_response()handle_tcp_packet() 中,我读取了 tcp 数据包的数据 (tcp.data) 并将它们写入一份文件。但是我注意到我经常收到具有相同 TCP 序列号 (tcp.seq) 的数据包(在同一连接上),但它们似乎包含相同的数据。此外,似乎并非所有数据包都被捕获。例如,如果我对数据包大小求和,则结果值低于 http header (content-length) 中列出的值。但是在 Wireshark 中我可以看到所有包。

有谁知道为什么我会收到那些重复的数据包以及如何捕获属于 http-response 的每个数据包?

编辑:
您可以在这里找到完整的代码:pastebin.com .运行时它会向标准输出打印类似的内容:

Waiting for HTTP-Audio-responses ...
...
New TCP-Packet, len=1440, tcp-payload=5107680, con-len=5197150 , dups=57 , dup-bytes=82080
New TCP-Packet, len=1440, tcp-payload=5109120, con-len=5197150 , dups=57 , dup-bytes=82080
New TCP-Packet, len=1440, tcp-payload=5110560, con-len=5197150 , dups=57 , dup-bytes=82080
----------> FIN <----------
New TCP-Packet, len=1937, tcp-payload=5112497, con-len=5197150 , dups=57 , dup-bytes=82080
New TCP-Packet, len=0, tcp-payload=5112497, con-len=5197150 , dups=57 , dup-bytes=82080

如您所见,TCP 负载加上重复接收的字节 (5112497+82080=5194577) 小于下载的文件大小 (5197150)。此外,您可以看到我收到了 57 个重复的包(相同的 SEQ 和相同的 TCP 数据),并且在带有 FIN 标志的包之后仍然收到了包。

那么有没有人知道我如何捕获属于该连接的所有数据包? Wireshark 可以看到所有数据包,我认为它也使用 libpcap。

我什至不知道是我做错了什么还是 pcap 库做错了什么。

编辑 2:
好的,看来我的代码是正确的:在 Wireshark 中,我保存了捕获的数据包并在我的代码中使用了捕获文件(pcap.pcap('/home/path/filename') 而不是 pcap.pcap('eth0'))。我的代码完美地读取了所有包(在多次测试中)!由于 Wireshark 也使用 libpcap (afaik),我认为问题是 lib pypcap 没有为我提供所有包。

关于如何测试它有什么想法吗?

我已经自己编译了 pypcap(主干),但这并没有改变任何东西-.-

编辑 3:
好的,我更改了我的代码以使用 pcapy 而不是 pypcap,但遇到了同样的问题:
从之前捕获的文件(使用 Wireshark 创建)读取数据包时一切正常,但是当我直接从 eth0 捕获数据包时,我错过了一些数据包。

有趣:当并行运行两个程序(一个使用 pypcap 和一个使用 pcapy)时,它们捕获不同的数据包。例如一个程序多接收一个数据包。

但我仍然不知道为什么-.-
我认为 Wireshark 使用相同的 base-lib (libpcap)。

请帮忙:)

最佳答案

需要注意以下几点:

  • 确保你有一个大的 snaplen - 对于 pcapy 你可以在 open_live 上设置它(第二个参数)
  • 确保你处理碎片化的数据包——这不会自动完成——你需要检查细节
  • 检查统计数据 - 不幸的是,我认为这不会暴露给 pcapy 接口(interface),但您可能没有处理所有数据包;如果你来不及了,你将不知道你错过了什么(尽管你可以通过跟踪 tcp 流的长度/位置获得相同的信息)libpcap 本身确实公开了这些统计数据,所以你可以为它添加函数

关于python - 使用 Python 捕获 TCP 数据包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7155050/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com