gpt4 book ai didi

libpcap - libpcap 是否总是复制数据包?

转载 作者:行者123 更新时间:2023-12-03 11:01:17 42 4
gpt4 key购买 nike

我正在为一个流量非常大的网络编写监控程序(高清视频通过网络流式传输)。大多数数据包都非常大,我只想查看 header (仅限 IP 和 UDP/TCP)。当然,我想避免复制整个数据的开销。 libpcap 是否一定要给我一份整个数据包的副本?如果是,是否有符合我需求的图书馆?

最佳答案

这里似乎有两个问题:

  • 标题中的那个,听起来好像是在询问 libpcap 是否复制了数据包;
  • 正文中的那个,询问它是否总是复制整个数据包。

  • 对于第一个问题:

    任何代码都可能使用 libpcap 在各种操作系统中运行的机制完成了至少一个副本 - 从 mbufs/skbuff/STREAMS 缓冲区/任何到机制缓冲区的副本。对于 Linux,当不使用 tpacket 机制时,skbuff 可能只是在 PF_PACKET 的接收队列中排队。套接字 libpcap 正在使用。

    可能还有另一个副本 - 从该缓冲区到用户区的副本;如果 libpcap 使用“零拷贝”机制,例如 Linux tpacket 机制(libpcap 1.0 及更高版本默认使用),则不会发生第二次拷贝。如果不使用零拷贝机制,就会发生这种情况。

    但是,如果您使用 pcap_next()pcap_next_ex()在 Linux 系统上,正在使用 tpacket 机制,从内存映射缓冲区到私有(private)缓冲区的单独副本;如果您使用 pcap_dispatch(),则不会发生这种情况或 pcap_loop() .

    对于第二个问题:

    这就是 pcap_open_live() 的“snaplen”参数。和 pcap_set_snaplen()用于 - 它允许您指定不应捕获超过“snaplen”字节的数据包数据,这意味着复制的字节数不超过。

    请注意,此长度包括链路层 header ,并且可以包括“元数据” header ,例如 radiotap您可能会在 802.11 适配器上获得的 header 。此 header 可能是可变长度的(例如,在 802.11 上,802.11 header 是可变长度的,并且,如果您获得 radiotap header ,它们也是可变长度的)。

    此外,IPv4 和 TCP 头都可以有选项,而 IPv6 数据包可以有扩展头,所以 IP 和 TCP 头的长度也可以是可变的。

    这意味着您可能必须确定要使用的“最坏情况”快照长度;没有办法明确地说“不要给我任何超出 TCP/UDP header 的东西”,您只能说“给我不超过 N 个字节”。

    关于libpcap - libpcap 是否总是复制数据包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10371583/

    42 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com