首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >编写Wireshark解析器来计算TCP流的数量

问编写Wireshark解析器来计算TCP流的数量
EN

Stack Overflow用户
提问于 2014-05-27 04:47:11
回答 2查看 2K关注 0票数 1

我有一个非常大的tcpdump文件,我将其拆分为1分钟的间隔。我能够使用tshark通过循环代码提取每个1分钟文件的TCP统计信息,并将结果保存为CSV文件,以便我可以在Excel中执行进一步的分析。现在,我希望能够计算所有1分钟文件的每个1分钟文件中的TCP流的数量,并将数据保存在CSV文件中。这里的TCP流表示从特定源到特定目的地的一组数据包。每个流都有诸如源IP、目标IP、来自A->B的#pcakets数、来自A->B的#字节数、来自B->A的#包数、来自B->A的#字节数、总包数、总字节数等统计数据。我只想统计每个1分钟文件中的TCP流的数量。根据我到目前为止所读到的,我似乎需要创建一个解析器来做这件事。有没有人能给我一些指点或代码告诉我如何入门?谢谢。

EN

回答 2

Stack Overflow用户

发布于 2014-05-27 04:57:56

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

票数 0
EN

Stack Overflow用户

发布于 2014-05-27 06:39:53

不是解剖器,而是窃听器。请参阅Wireshark README.tapping文档,并查看TShark iousers tap以获取一个用C语言编写的简单示例。

也可以用Lua编写Lua Support in Wireshark;例如,请参阅Wireshark Wiki中的taps页面和Wireshark用户手册中的taps部分。

对于每个数据包,传递给TCP TCP的C结构为:

代码语言:javascript
复制
/* 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语言的tap,tap监听器的"packet“例程的"data”参数指向这种结构。

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

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

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

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

将connections;

  • empty表中的统计数据转储出新数据包的时间戳,替换以前存储的时间戳。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23877516

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档