编写Wireshark Lua / Tap来计算TCP流的数量

时间:2014-05-30 16:22:23

标签: lua wireshark packet-sniffers tshark

我之前发布了一个题为“编写Wireshark解析器来计算TCP流数量”的问题。我得到一些反馈使用Lua / Tap,所以我开始写一个,但我需要协助代码。我目前有以下功能,水龙​​头必须具备:     Listener.new,     listener.packet,     listener.draw,     listener.reset。

为了更好地了解我想要做的事情,请在此处查看我之前的问题:

Writing a Wireshark dissector to count number of TCP flows

我的新问题是,我是否需要编写代码来执行与tshark命令相同的操作:

tshark -r 1min.pcap -q -n -z conv,tcp 
在我继续编写代码来计算TCP流量之前,在Lua / Tap中

首先提取统计信息?或者我需要做的就是在Lua / Tap中编写代码以提取TCP流量计数。在任何一种情况下,有人可以帮我处理代码吗?我在网上搜索但找不到我正在寻找的示例,所以我可以自定义以适应我想要实现的目标。感谢。

1 个答案:

答案 0 :(得分:0)

我没有时间为您编写代码,但此处的一些信息是从我对您的其他问题的答案所做的编辑中复制的:

传递给每个数据包的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水龙头," tapinfo" table作为第三个参数传递给tap tapner" s" packet"例程被描述为"基于Listener的类型的信息表,或者nil。"。对于TCP抽头,表中的条目包括该结构中除sack_left_edgesack_right_edge之外的所有字段;表中的键是结构成员名称。

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

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

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

  • 从连接表中转储统计信息;
  • 清空连接表;
  • 存储新数据包的时间戳,替换之前存储的时间戳。