过滤pcap转储文件中的数据包

时间:2012-02-25 23:18:01

标签: c pcap

我正在编写网络分析器,我需要过滤保存在文件中的数据包,我已经编写了一些代码来过滤http数据包,但我不确定它是否能正常工作,因为当我在pcap转储上使用我的代码时结果是5个数据包,但是在过滤器中写入http的过滤器给了我2个数据包,如果我使用:

tcpdump port http -r trace-1.pcap
它给了我11包。

好吧,3个不同的结果,这有点令人困惑。

我的代码中的过滤器和数据包处理是:

...
if (pcap_compile(handle, &fcode, "tcp port 80", 1, netmask) < 0)
...
while ((packet = pcap_next(handle,&header))) {
    u_char *pkt_ptr = (u_char *)packet; 

    //parse the first (ethernet) header, grabbing the type field
    int ether_type = ((int)(pkt_ptr[12]) << 8) | (int)pkt_ptr[13];
    int ether_offset = 0;

    if (ether_type == ETHER_TYPE_IP) // ethernet II
        ether_offset = 14;
    else if (ether_type == ETHER_TYPE_8021Q) // 802
        ether_offset = 18;
    else
        fprintf(stderr, "Unknown ethernet type, %04X, skipping...\n", ether_type);

    //parse the IP header
    pkt_ptr += ether_offset;  //skip past the Ethernet II header
    struct ip_header *ip_hdr = (struct ip_header *)pkt_ptr; 
    int packet_length = ntohs(ip_hdr->tlen);

    printf("\n%d - packet length: %d, and the capture lenght: %d\n", cnt++,packet_length, header.caplen);

}

我的问题是为什么在过滤http时有3种不同的结果?和/或者如果我错误地过滤了它,那么我怎么能正确地做到这一点,还有一种方法可以使用除端口号以外的东西来过滤http(或ssh,ftp,telnet ......)数据包吗?

由于

1 个答案:

答案 0 :(得分:0)

所以我已经弄清楚了。它需要一点点搜索和理解,但我做到了。

Wireshark过滤器设置为在tcp端口80中设置的http过滤包以及设置为PSH,ACK的标志。实现这一点后,导致相同数量的数据包的tcpdump命令参数很容易编写。

所以现在wireshark和tcpdump给出了相同的结果

我的代码怎么样?好吧,我认为我的问题实际上是错误的,过滤器

if (pcap_compile(handle, &fcode, "tcp port 80", 1, netmask) < 0)

确实提供了11个数据包(无论tcp标志是什么,src和dst端口设置为80)

现在过滤所需的数据包是一个很好理解过滤器语法的问题 或设置为仅过滤端口80(21,22,...)然后在回调函数或while循环中获取tcp标头并从那里获取标志并使用掩码来查看它是否是正确的数据包(PSH,ACK) ,SYN ...)标志号例如是here