我有一个非常大的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流数。从我到目前为止所读到的,似乎我需要创建一个解剖器来做到这一点。任何人都可以给我指示或代码如何开始?感谢。
答案 0 :(得分:0)
Tshark有命令转储所有必要的信息:tshark -qz conv,tcp -r FILE
。这会为每个流写入一行(加上页眉和页脚),以便计算流量,只计算行数并减去页眉/页脚。
答案 1 :(得分:0)
不是解剖器,而是水龙头。请参阅Wireshark README.tapping文档,并在C中查看TShark iousers tap,遗憾的是,不是一个简单的示例。
也可以在Lua中编写水龙头;例如,请参阅Wireshark Wiki中的Lua/Taps页面和Wireshark用户手册的Lua Support in Wireshark部分。
传递给每个数据包的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侦听器的“packet”例程的“tapinfo”表被描述为“基于Listener的类型的信息表,或者nil。”。对于TCP抽头,表中的条目包括该结构中除sack_left_edge
和sack_right_edge
之外的所有字段;表中的键是结构成员名称。
th_stream
字段标识连接;每次TCP解析器找到新连接时,它都会分配一个新值。正如注释所示,“包含此流索引字段以帮助区分何时重用地址/端口对”,因此,如果给定连接已关闭,并且后续连接使用相同端点,则两个连接具有不同{{1即使它们具有相同的端点,也可以使用值。
因此,您有一个使用th_stream
值作为键的表。该表将存储端点(地址和端口)以及每个方向上的数据包和字节数。对于传递给侦听器“数据包”例程的每个数据包,您将在表中查找th_stream
值,如果找不到,则创建一个新条目,开始计数零,并使用新的条目;否则,你会使用你找到的条目。然后,您将确定数据包是从A到B还是从B到A,并增加适当的数据包数和字节数。
您还会跟踪时间戳。对于第一个数据包,您将存储该数据包的时间戳。对于每个数据包,您将查看时间戳,如果它比存储的时间戳晚一分钟或更长时间,您将: