Network Utility Kit 开发实录:网络工具的打造

Network Utility Kit 是我开发的一款网络工具套件,集成了多种常用的网络诊断和查询功能。本文将深入探讨这个项目的架构设计、技术实现以及开发过程中的思考和决策。

项目背景

在日常工作和学习中,我经常需要使用各种网络工具来诊断和调试网络问题。这些工具通常分散在不同的命令行工具或在线服务中,使用起来不够方便。我想打造一个统一、易用的网络工具套件,将这些功能集成到一个应用中。

功能规划

经过调研和需求分析,我确定了以下核心功能:

  • Ping - 检测网络连通性
  • Traceroute - 追踪网络路径
  • NSLookup - DNS 查询
  • Whois - 域名信息查询
  • Port Scanner - 端口扫描
  • Speed Test - 网络速度测试
  • IP Calculator - IP 地址计算器

架构设计

采用了分层架构设计:

1. 表示层

使用 WinUI 3 构建用户界面,采用 MVVM 模式:

  • Views - 包含各种工具的视图页面
  • ViewModels - 业务逻辑和状态管理
  • Models - 数据模型

2. 服务层

封装各种网络功能的服务类:

public interface INetworkService
{
    Task<PingResult> PingAsync(string host, int count = 4);
    Task<TracerouteResult> TracerouteAsync(string host);
    Task<DnsQueryResult> NsLookupAsync(string domain);
    // ... 其他方法
}

3. 核心层

实现各种网络功能的核心逻辑:

  • PingService - ICMP Ping 实现
  • TracerouteService - 路由追踪实现
  • DnsService - DNS 查询实现
  • PortScannerService - 端口扫描实现

关键技术实现

Ping 功能实现

使用 .NET 的 Ping 类实现:

public async Task<PingResult> PingAsync(string host, int count = 4)
{
    var ping = new Ping();
    var replies = new List<PingReply>
    
    for (int i = 0; i < count; i++)
    {
        try
        {
            var reply = await ping.SendPingAsync(host, 5000);
            replies.Add(reply);
        }
        catch (PingException ex)
        {
            // 处理异常
        }
    }
    
    return new PingResult(replies);
}

Traceroute 实现

通过发送 TTL 递增的 ICMP 包实现路由追踪:

public async Task<TracerouteResult> TracerouteAsync(string host)
{
    var hops = new List<HopInfo>();
    const int maxHops = 30;
    
    for (int ttl = 1; ttl <= maxHops; ttl++)
    {
        var ping = new Ping();
        var options = new PingOptions(ttl, true);
        
        try
        {
            var reply = await ping.SendPingAsync(host, 5000, new byte[32], options);
            hops.Add(new HopInfo(ttl, reply.Address, reply.RoundtripTime));
            
            if (reply.Status == IPStatus.Success)
                break;
        }
        catch (PingException)
        {
            hops.Add(new HopInfo(ttl, null, -1));
        }
    }
    
    return new TracerouteResult(hops);
}

DNS 查询实现

使用 Dns 类进行 DNS 查询:

public async Task<DnsQueryResult> NsLookupAsync(string domain)
{
    try
    {
        var hostEntry = await Dns.GetHostEntryAsync(domain);
        var addresses = hostEntry.AddressList.Select(ip => ip.ToString()).ToList();
        
        return new DnsQueryResult(domain, addresses);
    }
    catch (SocketException ex)
    {
        throw new DnsException("DNS查询失败", ex);
    }
}

端口扫描实现

使用 TcpClient 进行端口扫描:

public async Task<PortScanResult> ScanPortsAsync(string host, int startPort, int endPort)
{
    var openPorts = new List<int>();
    var tasks = new List<Task>();
    
    for (int port = startPort; port <= endPort; port++)
    {
        tasks.Add(Task.Run(async () =>
        {
            using var client = new TcpClient();
            try
            {
                await client.ConnectAsync(host, port, 100);
                lock (openPorts)
                {
                    openPorts.Add(port);
                }
            }
            catch
            {
                // 端口关闭
            }
        }));
    }
    
    await Task.WhenAll(tasks);
    return new PortScanResult(host, openPorts);
}

UI/UX 设计

在设计 UI 时,我注重以下几点:

1. 统一的界面风格

所有工具都采用一致的设计语言,包括配色、字体、布局等。

2. 清晰的结果展示

使用表格、图表等多种方式展示结果,便于用户理解。

3. 实时反馈

对于长时间运行的操作,提供进度指示和取消功能。

4. 历史记录

保存用户的查询历史,方便重复使用。

性能优化

1. 异步操作

所有网络操作都使用 async/await,避免阻塞 UI 线程。

2. 并发控制

使用 SemaphoreSlim 控制并发数量,避免过度消耗资源。

private readonly SemaphoreSlim _semaphore = new SemaphoreSlim(10);

public async Task<PortScanResult> ScanPortsAsync(...)
{
    var tasks = new List<Task>();
    
    for (int port = startPort; port <= endPort; port++)
    {
        tasks.Add(ScanPortAsync(host, port));
    }
    
    await Task.WhenAll(tasks);
    // ...
}

private async Task ScanPortAsync(string host, int port)
{
    await _semaphore.WaitAsync();
    try
    {
        // 扫描端口
    }
    finally
    {
        _semaphore.Release();
    }
}

3. 结果缓存

对于 DNS 查询等结果,实现缓存机制。

测试与质量保证

  • 单元测试:对核心逻辑进行单元测试
  • 集成测试:测试各种网络功能
  • 性能测试:测试大规模扫描的性能
  • 兼容性测试:在不同网络环境下测试

遇到的挑战

1. 跨平台网络访问

Windows UWP 环境下网络访问有一定限制,需要正确配置网络能力。

2. 端口扫描性能

大量端口扫描时需要注意性能优化和资源管理。

3. 结果解析

不同网络工具返回的结果格式各异,需要统一处理。

未来计划

  • 添加更多网络工具(如 Netstat、Route 等)
  • 支持自定义命令组合
  • 添加网络监控功能
  • 支持结果导出和报告生成

总结

开发 Network Utility Kit 是一个充满挑战但也很有成就感的过程。通过这个项目,我深入学习了网络编程、异步编程、UI 设计等多个领域的知识。希望这款工具能够帮助更多的开发者和网络管理员提高工作效率。