代码之家  ›  专栏  ›  技术社区  ›  kocica

DPDK中IPv4数据包大小错误

  •  1
  • kocica  · 技术社区  · 7 年前

    我将这些数据包保存在pcap文件中(如wireshark所示)

    enter image description here

    Iam使用DPDK解析这些数据包,由于某些原因,我无法使用mbufs。要分析它们,iam使用 struct ipv4_hdr struct ether_hdr 如下所示:

    eth_hdr = (struct ether_hdr *) pckt;
    ip_hdr = (struct ipv4_hdr *)((unsigned char *) pckt + sizeof(struct ether_hdr));
    

    这个 total_length 在里面 ipv4_hdr 是ipv4标头的大小+数据的大小。以太标头的大小应该是数据包的总长度,对吗?

    size = rte_bswap16(ip_hdr->total_length) + sizeof(struct ether_hdr);
    

    这给了我这6个数据包的输出:

    54, 54, 54, 54, 54, 54
    

    对于第一个、第三个和第五个数据包,它是正确的,但对于其他数据包,它比应该的小6个字节。

    Iam询问数据包中的这6个字节是什么,以及如何使用ipv4和ether标头找出正确的大小:

    54, 60, 54, 60, 54, 60
    

    在wireshark中,所有这些数据包 总长度\u 40字节和 sizeof(ether_hdr) 为14字节->应该是54。

    1 回复  |  直到 7 年前
        1
  •  4
  •   Andriy Berestovskyy    7 年前

    我想根本原因是以太网帧的最小长度。像 Wikipedia says ,最小帧长度为64字节。

    在每个以太网帧的末尾,我们添加了帧检查序列(FCS,4个八位字节),因此它为以太网报头和负载生成了至少60个八位字节。

    现在回答您的问题:

    我在问数据包中的这6个字节是什么

    这些是零填充,使以太网帧(带有FCS)至少有64个八位字节。

    对于 传出数据包 ,还没有填充,它们将稍后由驱动程序或NIC本身添加。因此Wireshark显示了未添加的帧,即40字节的IP+14字节的以太网报头(无FCS)生成 54字节。

    对于 传入数据包 ,发送部分已添加填充。因此Wireshark显示带填充的帧,即64个八位字节-4个八位字节FCS= 60个八位字节。

    如何使用ipv4和ether标头找出正确的大小

    你的方法完全正确。帧末尾的那些零只是填充,应该忽略。如果我们真的需要一个正确的长度,我们应该考虑如上所述的最小帧长度。