Go 中的高速数据包传输:从 net.Dial 到 AF_XDP

主要观点:作者开发了一个 Go 程序用于向数百万 IP 地址发送 ICMP ping 消息,旨在快速高效地完成,为此研究了多种与网络栈交互和发送数据包的方法。
关键信息

  • 介绍了不同的网络数据包发送方法,如 net.Dial 方法(速度最慢,约 697277 pps)、Raw Socket(比 net.Dial 快,约 793781 pps)、AF_INET Syscall 方法(比 Raw Socket 快,约 861372 pps)、Pcap 方法(性能较好,约 1354087 pps)、af_packet 方法(性能与 Pcap 相似)、AF_XDP Socket(性能最好,约 2647936 pps)。
  • 展示了各方法的代码实现及示例代码链接(https://github.com/atoonk/go-...)。
  • 进行了基准测试,不同方法在每秒发送数据包数量(PPS)上有差异,AF_XDP 表现最佳。
  • 提及了一些注意事项,如 Pcap 方法在运行多个流时性能不佳,AF_XDP 库在多数硬件 NIC 上表现不佳,AF_PACKET 的零拷贝模式在 Go 实现中未起作用等。
    重要细节
  • 使用 net.Dial 建立双向通信,写入字节到连接。
  • 创建 Raw Socket 需进行系统调用,设置选项以手动包含 IP 头。
  • AF_INET Syscall 方法创建 UDP 套接字,无需手动构建完整数据包。
  • Pcap 方法创建 Pcap 句柄,手动创建数据包并写入。
  • AF_PACKET 直接访问网络设备层,手动创建以太网帧。
  • AF_XDP 利用 XDP 框架提高数据包发送接收速度,需使用特定库并提供 NIC 队列。
  • 基准测试工具可在 Linux 系统上运行,默认使用一个 CPU 和一个 NIC 队列,用户可选择使用更多 CPU 并行测试。
  • 包含对各方法性能的具体数据展示及相关图表。
阅读 39
0 条评论