如何用Python 2.7结合pyshark实现Wireshark的Follow TCP stream功能?
使用Python 2.7的pyshark实现Wireshark的Follow TCP Stream功能
当然可以做到!而且完美适配你没法通过HTTP层过滤的场景——毕竟非合法HTTP方法可能不会被Wireshark的HTTP解析器识别,直接基于TCP流追踪才是最靠谱的方式。
Wireshark的「Follow TCP Stream」本质上是通过**TCP四元组(源IP、目的IP、源端口、目的端口)**来关联同一条双向数据流的所有数据包,然后把这些包的TCP载荷按时间顺序拼接起来展示。用pyshark完全可以复刻这个逻辑,下面是具体实现步骤和代码:
核心思路
- 定位你要追踪的目标数据包(对应你右键点击的那个包)
- 提取该包的TCP四元组信息
- 遍历所有数据包,筛选出属于同一TCP流的包(要包含双向的,即A→B和B→A的数据包)
- 按数据包的时间顺序,把TCP载荷拼接成完整的流内容,甚至可以模拟Wireshark的双向标记(比如用
>表示本地发送,<表示远端回复)
Python 2.7代码示例
import pyshark def follow_tcp_stream(pcap_path, target_packet_index): # 读取pcap文件 cap = pyshark.FileCapture(pcap_path) # 获取目标数据包 target_packet = None for idx, pkt in enumerate(cap): if idx == target_packet_index: target_packet = pkt break if not target_packet or 'TCP' not in target_packet: print("目标数据包不存在或不包含TCP层") return # 提取TCP四元组 src_ip = target_packet.ip.src dst_ip = target_packet.ip.dst src_port = target_packet.tcp.srcport dst_port = target_packet.tcp.dstport # 重置捕获器,重新遍历所有包 cap.reset() tcp_stream = [] for pkt in cap: if 'TCP' in pkt and 'IP' in pkt: # 判断当前包是否属于目标TCP流(双向匹配) is_same_stream = ( (pkt.ip.src == src_ip and pkt.ip.dst == dst_ip and pkt.tcp.srcport == src_port and pkt.tcp.dstport == dst_port) or (pkt.ip.src == dst_ip and pkt.ip.dst == src_ip and pkt.tcp.srcport == dst_port and pkt.tcp.dstport == src_port) ) if is_same_stream: # 记录方向、时间和载荷 direction = ">" if (pkt.ip.src == src_ip and pkt.tcp.srcport == src_port) else "<" try: payload = pkt.tcp.payload.binary_value # 获取原始二进制载荷 # Python 2.7中直接处理二进制内容,转十六进制或文本 payload_str = payload.encode('hex') tcp_stream.append(f"{direction} [{pkt.sniff_time}] {payload_str}") except AttributeError: # 没有载荷的包(比如SYN、ACK),标记说明 tcp_stream.append(f"{direction} [{pkt.sniff_time}] 无TCP载荷") # 拼接并打印完整流内容 print("\n".join(tcp_stream)) return tcp_stream # 调用示例:假设你的pcap文件是test.pcap,目标数据包是第5个(索引从0开始) follow_tcp_stream("test.pcap", 4)
关键说明
- 四元组双向匹配:TCP流是双向的,所以要同时匹配正向(A→B)和反向(B→A)的四元组,不然会漏掉一半的数据包
- 载荷处理:如果需要查看可读文本内容,可以把
payload.encode('hex')换成payload(注意Python 2.7的编码兼容性,非ASCII内容可能需要额外处理) - 无载荷包:像SYN、ACK这类握手包没有TCP载荷,代码里做了标记,你也可以根据需要直接跳过这类包
- 实时抓包适配:如果是实时抓包,把
FileCapture换成LiveCapture,逻辑基本一致,只是需要额外处理包的捕获停止逻辑
这个实现完全复刻了Wireshark「Follow TCP Stream」的核心逻辑,不管你的HTTP方法是否合法,只要是TCP流里的内容都能完整提取出来。
内容的提问来源于stack exchange,提问作者Elias Shourosh
相关产品推荐
相关产品推荐

