1

我有一个非常大的 tcpdump 文件,我将其分成 1 分钟的间隔。我可以使用 tshark 使用循环代码提取每个 1 分钟文件的 TCP 统计信息,并将结果保存为 CSV 文件,以便我可以在 Excel 中执行进一步分析。现在我希望能够计算所有 1 分钟文件的每个 1 分钟文件中的 TCP 流数,并将数据保存在 CSV 文件中。此处的 TCP 流表示从特定源到特定目的地的一组数据包。每个流都有统计信息,例如源 IP、目标 IP、来自 A->B 的#pcakets、来自 A->B 的#bytes、来自 B->A 的#packets、来自 B->A 的#bytes、总数据包、总字节数、等等,我只想计算每个 1 分钟文件中的 TCP 流数。从我目前所读到的,看来我需要创建一个解剖器来做到这一点。谁能给我有关如何开始的指示或代码?谢谢。

4

2 回答 2

0

Tshark 有一个命令可以转储所有必要的信息:tshark -qz conv,tcp -r FILE. 这会为每个流写入一行(加上页眉和页脚),因此要计算流,只需计算行数并减去页眉/页脚。

于 2014-05-26T20:57:56.340 回答
0

不是解剖器,而是水龙头。请参阅 Wireshark README.tapping文档,并查看TShark iousers tap以获取一个可悲的是,这在 C 语言中一点也不简单。

也可以在 Lua 中编写水龙头;例如,请参见Wireshark Wiki 中的Lua/Taps页面和Wireshark 用户手册的 Wireshark中的Lua 支持部分。

为每个数据包传递给 TCP 分路器的 C 结构是:

/* the tcp header structure, passed to tap listeners */
 typedef struct tcpheader {   
        guint32 th_seq;
        guint32 th_ack;   
        gboolean th_have_seglen;        /* TRUE if th_seglen is valid */
        guint32 th_seglen;
        guint32 th_win;   /* make it 32 bits so we can handle some scaling */
        guint16 th_sport;  
        guint16 th_dport;
        guint8  th_hlen;
        guint16 th_flags;
        guint32 th_stream; /* this stream index field is included to help differentiate when address/port pairs are reused */
        address ip_src;
        address ip_dst;

        /* This is the absolute maximum we could find in TCP options (RFC2018, section 3) */
        #define MAX_TCP_SACK_RANGES 4
        guint8  num_sack_ranges;
        guint32 sack_left_edge[MAX_TCP_SACK_RANGES];
        guint32 sack_right_edge[MAX_TCP_SACK_RANGES];
} tcp_info_t;

因此,对于 C 语言点击,点击侦听器的“数据包”例程的“数据”参数指向该类型的结构。

对于 Lua taps,作为第三个参数传递给 tap listener 的“packet”例程的“tapinfo”表被描述为“基于 Listener 类型或 nil 的信息表”。对于 TCP 分路,表中的条目包括该结构中的所有字段,除了sack_left_edgesack_right_edge; 表中的键是结构成员名称。

th_stream字段标识连接;每次 TCP 解析器找到一个新连接时,它都会分配一个新值。如注释所示,“包含此流索引字段以帮助区分何时重用地址/端口对”,因此如果给定连接已关闭,并且稍后的连接使用相同的端点,则th_stream即使两个连接具有不同的值它们具有相同的端点。

因此,您将拥有一个使用该th_stream值作为键的表。该表将存储端点(地址和端口)以及每个方向的数据包和字节数。对于传递给侦听器的“数据包”例程的每个数据包,您将th_stream在表中查找值,如果找不到,您将创建一个新条目,从零开始计数,并使用它新条目; 否则,您将使用您找到的条目。然后,您将确定数据包是从 A 到 B 还是从 B 到 A,并增加适当的数据包计数和字节计数。

您还需要跟踪时间戳。对于第一个数据包,您将存储该数据包的时间戳。对于每个数据包,您将查看时间戳,如果它比存储的时间戳晚一分钟或更长时间,您将:

  • 从连接表中转储统计信息;
  • 清空连接表;
  • 存储新数据包的时间戳,替换之前存储的时间戳。
于 2014-05-26T22:39:53.080 回答