使用TCP状态转换在我的网络中存储IP地址列表

时间:2012-03-13 09:49:16

标签: libpcap

使用libpcap嗅探数据包后,我想在我的网络中存储一个IP地址列表(连接),并为每个连接存储我想要存储其TCP状态转换的内容。

是否可以使用链表?如果是这样,怎么样?

2 个答案:

答案 0 :(得分:0)

是的,这是可能的

libpcap是一个开源C库,可以以混杂模式访问您的NIC以捕获软件包

知道?知道,我只记得这些:

 - you can developed
 - use tcpdump and write a condition to capture and export to a file
 - use wireshark and write a condition to capture and export to a file

答案 1 :(得分:0)

snifex.c是一个好的开始(http://www.tcpdump.org/pcap.html)

在回调函数中:

got_packet(u_char *args, const struct pcap_pkthdr *header, const u_char *packet);

指针* ip指向ip标头的开头。

ip = (struct sniff_ip*)(packet + SIZE_ETHERNET);

在那里你可以找到IP地址信息。请注意,您必须将对inet_ntoa的调用分开,因为它似乎使用静态缓冲区。因此,如果计划在cmd或文件中显示输出,则应使用两个printf调用。这就是为什么它们在snifex.c中分开排列:

printf("       From: %s\n", inet_ntoa(ip->ip_src));
printf("         To: %s\n", inet_ntoa(ip->ip_dst));

对于TCP信息,您可以使用tcp指针

tcp = (struct sniff_tcp*)(packet + SIZE_ETHERNET + size_ip);

使用TCP标志tcp-> th_flags找出连接状态,例如tcp->th_flags==TH_SYN

一旦知道了标记,就必须检查RFC793 TCP / IP状态图以确定TCP协议的状态。

在实现方面,您可以为每个4元组(srcIP,dstIP,srcPort,dstPort)使用哈希数组,以获得O(1)(最佳情况)。请注意,在某些情况下,您可能会看到中途流量或半开TCP连接等.RFC详细描述了如何处理它们。

最后,如果您不希望实现TCP协议,可以使用模拟Linux 2.0.x的IP堆栈的Libnids库,提供IP碎片整理和TCP流组装。