c++ - 用于捕获 10 Gbps NIC 的 libpcap

标签 c++ networking

我想从 10Gbps 网卡抓包,丢包率为 0。 我正在为 100Mbps NIC 使用 lipcap,它工作正常。 libpcap 能否处理 10Gbps 的 NIC 流量? 如果不是,还有什么其他替代方法可以实现这一目标?

最佳答案

libpcap 是否能以 0 丢包处理 10Gbps 取决于您使用的机器和 libpcap 版本。如果机器、CPU 和 HDD I/O 足够快,您可能会得到 0 丢包。否则您可能需要执行以下操作:

  • 将您的 libpcap 更新到最新版本。 Libpcap 1.0.0 或更高版本支持零拷贝(内存映射)机制。这意味着在内核地址空间和应用程序地址空间中都有一个缓冲区,因此不需要复制数据 从内核模式缓冲区到用户模式缓冲区。数据包仍然从 skbuff (Linux) 复制到共享缓冲区,所以它实际上更像是“一个拷贝”,但仍然少了一个拷贝,这样可以减少接收捕获数据包所需的 CPU 时间。此外,每个应用程序唤醒调用可以从缓冲区中获取更多数据包。

  • 如果您观察到 CPU 使用率很高,则可能是您的 CPU 无法处理数据包到达率。您可以使用 xosview(系统负载可视化工具)在捕获期间检查您的系统资源。

  • 如果 CPU 丢包,可以使用 PF_RING。 PF_RING 是带有循环缓冲区的 libpcap 的扩展:http://www.ntop.org/products/pf_ring/ .它速度更快,并且可以使用商用 NIC http://www.ntop.org/products/pf_ring/hardware-packet-filtering/ 以 10Gbps 的速度捕获.

  • 另一种方法是获取具有板载内存和特定硬件设计的 NIC,用于数据包捕获,请参阅 http://en.wikipedia.org/wiki/DAG_Technology .

  • 如果CPU不再是你的问题,你需要测试磁盘数据传输速度。 hdparm 是 Linux 上最简单的工具。一些发行版带有 GUI,否则: $ sudo hdparm -tT/dev/hda

如果您正在基于 libpcap 开发自己的应用程序:

  • 使用 pcap_stats 来识别 (a) 丢弃的数据包数量,因为当它们到达时操作系统的缓冲区中没有空间,因为数据包的读取速度不够快; (b) 网络接口(interface)或其驱动程序丢弃的数据包数。

  • Libpcap 1.0.0 有一个 API,允许应用程序在可以设置缓冲区大小的平台上设置缓冲区大小。 b) 如果您觉得很难设置缓冲区,您可以使用 Libpcap 1.1.0 或更高版本,其中默认捕获缓冲区大小已从 32K 增加到 512K。 c) 如果您只是使用 tcpdump,请使用 4.0.0 或更高版本并使用 -B 标志作为缓冲区大小

关于c++ - 用于捕获 10 Gbps NIC 的 libpcap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7763321/

相关文章:

python - 使用单个终端接口(interface)处理多个客户端请求

c++ - 在 const char* 上分配了两次

c++ - c++中读取函数的一个问题

c++ - (C++) 将十六进制字符串写入文件

c++ - 我的 C++ 程序会从世界各地的计算机(在我的 LAN 之外)连接到本地 MySQL 数据库吗?

java - Kindle 中的技术和标准

c++ - 我可以在 C++ 中将类作为对象处理吗

c++ - 有没有办法用 clang 在 VisitCallExpr 方法中获取 CallExpr* 的调用者?

java - RMI 和异常

java - 为什么 HTTP 响应没有给我指定的数据范围?