You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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完全可以复刻这个逻辑,下面是具体实现步骤和代码:

核心思路

  1. 定位你要追踪的目标数据包(对应你右键点击的那个包)
  2. 提取该包的TCP四元组信息
  3. 遍历所有数据包,筛选出属于同一TCP流的包(要包含双向的,即A→B和B→A的数据包)
  4. 按数据包的时间顺序,把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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:25:32