0

我已经按照这里的代码解决了打印 IP 地址的问题。当它从我的机器读取捕获的文件时,我的工作非常完美,结果与 tcpdump 相同。但是,当我读取另一个 pcap 文件(从大型网络的边界路由器捕获)时,它给了我完全不同的 IP 地址。我发现这些 pcap 在以太网帧中包含 VLAN。如何检测数据包是否包含 vlan 标头?

4

1 回答 1

0

您必须检查物理层协议(现在最有可能是以太网)并确定以太网类型(以太网标头的第 13 和第 14 个字节)。您可以在此处查看可能的以太网类型的示例列表。

如果类型是 0x0800 (IPv4),那么一切都应该按预期工作。

但是,如果 ethertype 是 0x8100 (802.1Q),您必须从 VLAN 标头(第 17 和第 18 字节)中提取实际有效负载类型

这是一个非常粗略的代码,可以绕过从指向以太网开头的基地址开始的上层

char *get_ip_hdr(char *base) {

    // If frame is not ethernet retun NULL

    uint16_t ether_type = ntohs(*(uint16_t *) (base + 12));
    if (ether_type == 0x0800 ) {
        return base + 14;
    } else if (ether_type == 0x8100 ) {
        // VLAN tag
        ether_type = ntohs(*(uint16_t *) (base + 16));
        if (ether_type == 0x800)  {
            return base + 18;
        }
    }

    return NULL
}

请注意双重VLAN 标记,并采取必要的类似步骤来跳过它。

于 2016-09-29T16:22:06.310 回答