从pcap文件中提取帧(tcpdump输出)而不使用库

时间:2016-09-26 19:07:59

标签: sockets tcp wireshark pcap

我需要解析pcap文件并分别计算数据包(TCP,UDP,IP)。我发现了很多这样的库,比如pcap,jnetpcap,但我想在不使用任何外部库的情况下这样做。我不需要代码,只是一个概念性解释。

Question

在解析pcap文件时,我应该如何区分帧(无论是TCP,UDP,IP)。我尝试阅读有关格式但我不明白的是我如何知道我应该为特定帧读取多少字节以及我怎么知道它是什么类型的帧。因为只有一次我能够分别提取数据包我将能够过滤掉其他信息。

1 个答案:

答案 0 :(得分:0)

您必须单独解析每个帧,并为您要计算的每个值设置一个计数器。假设您正在检查的捕获是pcap / pcapng格式,您可能会发现libpcap很有帮助。

快速运行可能必须做的事情(假设较低级别是没有VLAN标记的以太网)

uint64_t ip_count, tcp_count, udp_count;

void parse_pkt(uint8_t *data, uint32_t data_len) {
    uint8_t *ether_hdr = data;
    uint16_t ether_type = ntohs(*(uint16_t *) (data + 12))

    if (ether_type != 0x800) {
        return;
    }
    ip_count += 1;

    uint8_t *ip_hdr = data + 14;
    protocol = ntohs(*(uint16_t *) (ip_hdr + 9))
    //protocol is either udp/tcp/sctp...etc
    if (protocol == 0x11) {
        udp_count++;
    } else if (protocol == 0x06) {
       tcp_count++;
    }
}

// foreach pkt from libpcap_open call parse_pkt with the data and data_len

这段代码很脆弱。没有适当的长度和类型检查跳转到直接偏移不是一个好主意。