logo

网络协议性能测试与抓包工具比较分析

Published on

HTTP 协议

设置 JMeter 进行压力测试

  1. 配置 HTTP 请求:在 JMeter 中创建一个测试计划,添加 HTTP 请求以模拟大量的并发流量。
Maple 图 1

如图,我设置为 5000 个用户同时发起请求,并设置他们的间隔为 3s,循环次数为 10 次。

  1. 运行测试计划:执行测试计划以生成 HTTP 流量。

  2. 捕获数据:同时启动上述抓包工具,进行60秒钟内的数据捕获。

数据分析

  • 抓取包数量:统计每种工具在五秒内捕获的 HTTP 包的数量。
  • 丢包率:通过比较实际流量量和捕获包数来估算丢包率。
  • 性能指标:记录每种工具的 CPU 使用率、内存占用以及捕获延迟。

HTTP 实验结果

Scapy

Scapy captured 296322 HTTP packets
Scapy captured 296322 packets

tcpdump

500488 packets captured
647412 packets received by filter
146924 packets dropped by kernel

tshark

Capturing on 'enp0s8'
493473
101804 packets dropped

总共包的数量:588402

DNS 协议

准备 DNS 查询文件

利用 python 脚本语言创建含有100 个域名的queries.txt 的文件,包含要发送的 DNS 查询:

import random
import string
import argparse

def generate_random_domains(n):
    domains = []
    tlds = ['com', 'net', 'org', 'io', 'tech']  # 顶级域名列表

    for _ in range(n):
        # 随机生成域名长度在 5 到 10 个字符之间
        domain_length = random.randint(5, 10)
        # 随机生成域名
        domain_name = ''.join(random.choices(string.ascii_lowercase + string.digits, k=domain_length))
        # 随机选择顶级域名
        tld = random.choice(tlds)
        # 生成完整的域名
        full_domain = f"{domain_name}.{tld}"
        domains.append(full_domain)

    return domains

def main():
    parser = argparse.ArgumentParser(description="Generate random domain names.")
    parser.add_argument('-n', type=int, default=100, help="Number of domains to generate (default: 100)")

    args = parser.parse_args()
    n = args.n

    random_domains = generate_random_domains(n)

    # 将域名写入文件
    with open('queriers.txt', 'w') as f:
        for domain in random_domains:
            f.write(f"www.{domain} A\n")

    print(f"{n} domains have been written to queriers.txt")

if __name__ == "__main__":
    main()

使用 dnsperf 进行 DNS 压力测试

运行以下命令进行 DNS 压力测试:

dnsperf -s 8.8.8.8 -d queries.txt -c 5000 -l 60

这个命令的含义是:

  • -s 8.8.8.8: 使用 Google 的公共 DNS 服务器
  • -d queries.txt: 使用我们创建的查询文件
  • -c 5000: 并发查询数为 5000
  • -l 60: 测试持续时间为 60 秒

DNS 实验结果

DNS Performance Testing Tool
Version 2.14.0

[Status] Command line: dnsperf -s 8.8.8.8 -d queries.txt -c 5000 -l 60
[Status] Sending queries (to 8.8.8.8:53)
[Status] Started at: Tue Aug 13 02:02:03 2024
[Status] Stopping after 60.000000 seconds
Warning: requested number of clients (-c 5000) per thread (-T) exceeds built-in maximum 256, adjusting

[Timeout] Query timed out: msg id 12397
[Timeout] Query timed out: msg id 16636
[Status] Testing complete (time limit)

Statistics:

  Queries sent:         53685
  Queries completed:    53683 (100.00%)
  Queries lost:         2 (0.00%)

  Response codes:       NOERROR 537 (1.00%), NXDOMAIN 53146 (99.00%)
  Average packet size:  request 33, response 105
  Run time (s):         61.576547
  Queries per second:   871.809197

  Average Latency (s):  0.110460 (min 0.034284, max 2.582434)
  Latency StdDev (s):   0.142849

scapy

Scapy captured 6 DNS packets
Scapy captured 6 packets

tcpdump

6 packets captured
8 packets received by filter
0 packets dropped by kernel

tshark

Capturing on 'enp0s8'
8
0 packets dropped

ICMP 协议

准备ip文件

利用 python 脚本语言创建含有100 个ip地址的host.txt 的文件:

# -*- coding: utf-8 -*-

# sudo systemd-resolve --flush-caches
#  systemd-resolve --statistics

import random
import string
import argparse

def generate_random_domains(n):
    domains = []

    for _ in range(n):
        domain = '.'.join(str(random.randint(0, 255)) for _ in range(4))
        domains.append(domain)

    return domains

def main():
    parser = argparse.ArgumentParser(description="Generate random domain names.")
    parser.add_argument('-n', type=int, default=100, help="Number of domains to generate (default: 100)")

    args = parser.parse_args()
    n = args.n

    random_domains = generate_random_domains(n)

    # 将域名写入文件
    with open('hosts.txt', 'w') as f:
        for domain in random_domains:
            f.write(f"{domain}\n")

    print(f"{n} domains have been written to hosts.txt")

if __name__ == "__main__":
    main()

使用 fping 进行压力测试

fping 支持同时对多个主机发送 ICMP 请求,非常适合进行大规模测试:

fping -f hosts.txt -p 10 -c 100
  • -f hosts.txt:指定包含要测试的主机 IP 地址的文件。
  • -p 10:设置发送间隔为 10 毫秒。
  • -c 1000:发送 1000 个 ICMP 请求。

ICMP 实验结果

tcpdump

tcpdump: listening on enp0s3, link-type EN10MB (Ethernet), capture size 262144 bytes
5250 packets captured
5250 packets received by filter
0 packets dropped by kernel

tshark

Capturing on 'enp0s3'
5246

结果评估

工具协议抓取包数量丢包率CPU使用率内存占用优点缺点适用场景
ScapyHTTP296,32249.64%- 灵活性高,可自定义数据包
- CPU和内存占用低
- 可进行深度数据包分析和操作
- 抓包效率低,丢包率高
- 需要Python编程知识
- 对大规模数据处理可能不够高效
- 网络安全测试和渗透测试
- 协议分析和开发
- 小规模网络流量分析
DNS少量-- 可自定义DNS查询和响应
- 适合DNS协议分析和测试
- 对大量DNS请求的处理可能不够高效- DNS协议研究和开发
- 安全测试(如DNS隧道检测)
ICMP--- 可自定义ICMP数据包
- 适合网络诊断和测试
- 对高频率ICMP流量可能处理不够快- 网络故障排查
- 网络扫描和发现
TcpdumpHTTP500,48814.94%- 高效的数据包捕获
- 轻量级,适合在服务器上长期运行
- 支持复杂的过滤规则
- CPU使用率高
- 输出格式相对简单,需要进一步处理
- 服务器流量监控
- 网络故障排查
- 大规模网络流量捕获
DNS少量-- 可靠地捕获DNS流量
- 支持详细的DNS报文过滤
- 解析和分析DNS数据需要额外处理- DNS服务器监控
- DNS流量分析
ICMP5,25047.50%- 高效捕获ICMP数据包
- 适合长时间运行的网络监控
- 深入分析ICMP数据需要额外工具- 网络性能监控
- 故障排查(如ping测试)
TsharkHTTP493,47316.13%- 强大的协议分析能力
- 丰富的输出格式选项
- 与Wireshark共享解析引擎
- CPU和内存占用中等
- 比tcpdump更复杂,学习曲线较陡
- 深入的协议分析
- 网络故障排查
- 安全分析
DNS少量-- 详细的DNS协议解析
- 支持高级DNS分析
- 对大规模DNS流量处理可能不如专用工具高效- DNS协议分析
- DNS安全审计
ICMP5,24647.54%- 详细的ICMP协议解析
- 可与其他协议数据关联分析
- 对于简单ICMP监控可能过于复杂- 复杂网络环境下的ICMP分析
- 网络性能评估

结论

  • scapy:提供灵活的捕获功能,适合小规模捕获和定制化需求,但在高负载下可能出现较高的丢包率。
  • tshark:在处理大量流量时表现稳定,性能较好,适合大规模流量分析。适用于需要精确解析和分析复杂网络流量的场景,特别是在需要提取特定协议信息或生成详细报表时。
  • tcpdump:功能全面,适合高负载环境,但可能会消耗较多资源。适用于需要快速抓取数据包、检查网络故障、或需要在资源有限的系统上运行。

基础抓包: 如果你只需要基础的抓包功能,并打算之后用其他工具(如 Wireshark)进行详细分析,那么 tcpdump 更加轻量、高效。

高级分析: 如果你需要在抓包时对数据包进行实时解码、提取特定字段、或需要支持更多协议的解析,tshark 是更全面的选择。