c - 当我在C中读取pcap时,如何绕过vlan头?

标签 c pcap vlan

我已经按照here中的代码进行操作并修复了打印IP地址的问题。当它从我的机器读取捕获的文件并且结果与 tcpdump 相同时,我工作得很好。然而,当我读取另一个 pcap 文件(从大型网络的边界路由器捕获)时,它给了我完全不同的 IP 地址。我发现这些 pcap 在以太网帧中包含 VLAN。如何检测数据包是否包含 vlan header ?

最佳答案

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

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

但是,如果以太网类型为 0x8100 (802.1Q),则必须从 VLAN header (第 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
}

注意警惕double VLAN tagging并采取必要的类似步骤来跳过它。

关于c - 当我在C中读取pcap时,如何绕过vlan头?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39281503/

相关文章:

c - 使用 libcurl 在 PUT 请求中发送字符串

c - 为什么套接字读取的数据多于实际发送的数据?

C:将文件作为参数传递

Java PCAP 文件解析器库

c - 在C中包含头文件

python - dpkt 在有效的 pcap 上抛出 NeedData

python - 在 python 3.4 上寻找 pcap 模块

c - 使用 NETLINK 的 VLAN 信息

linux - 如何添加 Vxlan 标签来隔离不同的 Docker 容器组