NetQuality脚本架构解析:深入理解代码实现原理

【免费下载链接】NetQuality A script for network quality detection 【免费下载链接】NetQuality 项目地址: https://gitcode.com/gh_mirrors/ne/NetQuality

NetQuality是一款功能强大的网络质量检测脚本,它能够全面评估网络性能,包括BGP信息检测、本地网络策略分析、三网延迟测试、路由追踪以及国际互连性能评估等。本文将深入解析NetQuality脚本的架构设计和实现原理,帮助开发者和用户更好地理解其工作机制。

一、脚本整体架构设计

NetQuality采用模块化设计,将不同的功能封装在独立的函数中,通过主流程控制各模块的执行。脚本的整体架构可以分为以下几个核心部分:

1.1 初始化与环境检测

脚本首先进行环境检测,确保系统满足运行要求。check_bash函数检查Bash版本是否高于4.3,这是因为脚本使用了许多高级Bash特性。

check_bash(){
    current_bash_version=$(bash --version|head -n 1|awk '{for(i=1;i<=NF;i++) if ($i ~ /^[0-9]+\.[0-9]+(\.[0-9]+)?/) print $i}')
    major_version=$(echo "$current_bash_version"|cut -d'.' -f1)
    minor_version=$(echo "$current_bash_version"|cut -d'.' -f2)
    if [ "$major_version" -lt 4 ]||{ [ "$major_version" -eq 4 ]&&[ "$minor_version" -lt 3 ];};then
        echo "ERROR: Bash version is $current_bash_version lower than 4.3!"
        echo "Tips: Run the following script to automatically upgrade Bash."
        echo "bash <(curl -sL https://raw.githubusercontent.com/xykt/NetQuality/main/ref/upgrade_bash.sh)"
        exit 0
    fi
}

1.2 参数解析与配置

get_opts函数负责解析命令行参数,根据用户输入配置脚本的运行模式,如指定IPv4/IPv6检测、设置输出文件、隐私模式等。

get_opts(){
    # 参数解析逻辑
    # 设置各种运行模式变量
}

1.3 核心功能模块

脚本的核心功能通过一系列独立函数实现,主要包括:

  • 网络信息获取get_ipv4get_ipv6获取公网IP地址
  • BGP信息检测db_bgptoolsdb_henet从不同来源获取BGP数据
  • NAT类型检测get_nat分析网络NAT类型
  • TCP配置检测get_tcp检查TCP相关配置
  • 延迟测试get_delay执行三网延迟测试
  • 路由追踪get_routenexttrace_test分析网络路由
  • 速度测试speedtest_testiperf_test进行网速测试

1.4 结果展示与输出

show_headshow_bgpshow_local等函数负责将检测结果以友好的方式展示给用户,同时支持将结果输出为JSON格式或保存到文件。

二、关键功能模块实现原理

2.1 网络质量检测流程

NetQuality的核心检测流程在check_Net函数中实现,该函数协调整个检测过程:

check_Net(){
    IP=$1
    ibar_step=0
    # 初始化网络数据存储结构
    # 依次调用各检测模块
    [[ $mode_skip != *"1"* || $mode_skip != *"3"* ]]&&db_bgptools $2
    [[ $mode_skip != *"1"* ]]&&db_henet $2
    [[ $mode_skip != *"1"* && $2 -eq 4 && -n ${bgp[prefixnum]} ]]&&get_neighbor
    # ... 其他检测步骤
    # 生成并输出报告
}

2.2 BGP信息收集与解析

BGP(边界网关协议)信息是评估网络质量的重要指标。NetQuality通过db_bgptoolsdb_henet两个函数从不同来源获取BGP数据:

db_bgptools(){
    local temp_info="$Font_Cyan$Font_B${sinfo[bgp]}${Font_I}BGP.TOOLS $Font_Suffix"
    # 从bgp.tools获取BGP数据
    local RESPONSE=$(curl $CurlARG -$1 --user-agent "$UA_Browser" --max-time 10 -Ls "https://bgp.tools/prefix/$IP")
    # 解析BGP前缀、ASN、组织信息等
    bgp[prefix]=$(echo "$RESPONSE"|sed -n 's/.*<p id="network-name" class="heading-xlarge">\([^<]*\)<\/p>.*/\1/p')
    bgp[asn]=$(echo "$RESPONSE"|awk -v RS='<strong>' '/Originated by/ {getline; print $0}'|sed 's/<[^>]*>//g'|head -n 1)
    # ... 更多解析逻辑
}

2.3 延迟测试实现

延迟测试是网络质量评估的核心功能之一。get_delay函数通过多线程方式执行TCP延迟测试:

get_delay(){
    local temp_info="$Font_Cyan$Font_B${sinfo[delay]}$Font_Suffix"
    ((ibar_step+=1))
    show_progress_bar "$temp_info" $((50-${sinfo[ldelay]}))&
    bar_pid="$!"&&disown "$bar_pid"
    trap "kill_progress_bar" RETURN
    # 设置最大线程数和内存限制
    local max_threads=93
    local available_memory=1024
    [[ "$(uname)" != "Darwin" ]]&&available_memory=$(free -m|awk '/Mem:/ {print $7}')
    local max_threads_by_memory=$(echo "$available_memory / 8"|bc)
    ((max_threads_by_memory<max_threads))&&max_threads=$max_threads_by_memory
    # 多线程执行ping测试
    local current_threads=0
    local tmpresult=$(for i in $(seq 1 $ping_test_count)
    do
        for province in $(echo "${!pcode[@]}"|sort -n);do
            for j in 1 2 3;do
                ping_test "${pdm[$province$j$1]}" "TCP" 1400 "$i" "$province" "$j" "$1"&
                ((current_threads++))
                if ((current_threads>=max_threads));then
                    wait -n
                    ((current_threads--))
                fi
            done
        done
    done
    wait)
    process_pingtestresult "$tmpresult"
}

2.4 路由追踪实现

路由追踪功能通过nexttrace_testmtr_test函数实现,支持TCP和UDP两种协议:

nexttrace_test(){
    local domain="$1"
    local rmode="$2"
    local rnum="$3"
    local ipv="$4"
    local response
    local max_retries=10
    local retry_delay=5
    local retry_count=0
    # 执行nexttrace命令
    while [[ $retry_count -lt $max_retries ]];do
        response=$(timeout -s SIGKILL 50 nexttrace -p 80 -q 8 -"$ipv" --"$rmode" --raw --psize 1400 "$domain" 2>/dev/null)
        [[ $response != *"*please try again later*"* && $response == *"traceroute to"* ]]&&break
        retry_count=$((retry_count+1))
        [[ $retry_count -lt $max_retries ]]&&sleep "$retry_delay"
    done
    # 解析路由信息
    # ...
}

三、数据处理与可视化

NetQuality不仅能够收集网络数据,还能对数据进行处理和可视化展示,帮助用户直观了解网络状况。

3.1 延迟可视化

calculate_delay函数将延迟数据转换为直观的可视化字符:

calculate_delay(){
    local delay=0x2800
    local num1=$1
    local num2=$2
    # 根据延迟值设置不同的Unicode字符
    if [[ $(echo "$num1 > 0 && $num1 <= 80"|bc) -eq 1 ]];then
        delay=$((delay+0x40))
    elif [[ $(echo "$num1 > 80 && $num1 <= 160"|bc) -eq 1 ]];then
        delay=$((delay+0x44))
    # ... 更多延迟区间判断
    fi
    # 设置颜色
    if [[ $(echo "$num1 > 240"|bc) -eq 1 || $(echo "$num2 > 240"|bc) -eq 1 || $(echo "$num1 == 0"|bc) -eq 1 || $(echo "$num2 == 0"|bc) -eq 1 ]];then
        echo "$Font_Red$unicode_char"
    elif [[ $(echo "$num1 > 150"|bc) -eq 1 || $(echo "$num2 > 150"|bc) -eq 1 ]];then
        echo "$Font_Yellow$unicode_char"
    # ... 更多颜色判断
    fi
}

3.2 结果展示

show_delay函数将延迟测试结果以表格形式展示:

show_delay(){
    local count=0
    local resu_per_line=$(((display_max_len+1)/(ping_test_count*3/2+12)))
    if [[ $mode_ping -eq 1 ]];then
        resu_per_line=1
        echo -ne "\r${sdelay[pingmode]}\n"
    else
        count=2
        echo -ne "\r${sdelay[title]}"
    fi
    # 循环输出各地区延迟结果
    for key in $(echo "${!pcode[@]}"|tr ' ' '\n'|sort -n);do
        ((count++))
        if ((resu_per_line==1));then
            echo -ne "\r${presu[$key]}\n"
        elif ((count%resu_per_line==0));then
            echo -ne "${presu[$key]}\n"
        elif ((count%resu_per_line==1));then
            echo -ne "\r${presu[$key]} "
        else
            echo -ne "${presu[$key]} "
        fi
    done
    ((count%resu_per_line!=0))&&echo
}

四、网络质量检测结果分析

NetQuality提供了丰富的网络质量检测结果,包括BGP信息、NAT类型、TCP配置、三网延迟、路由信息和网速测试等。下面是一个典型的检测结果示例:

NetQuality网络质量检测结果

该图表展示了不同地区到三网(电信、联通、移动)的延迟测试结果,使用不同颜色和字符直观表示延迟情况,绿色表示延迟较低,黄色表示延迟中等,红色表示延迟较高。

4.1 路由分析

NetQuality能够追踪网络路由,帮助用户了解数据包的传输路径。下面是一个IPv4路由追踪结果示例:

IPv4路由追踪结果

从图中可以看出数据包从本地网络经过哪些节点到达目标地址,以及每个节点的延迟情况,这对于分析网络瓶颈非常有帮助。

4.2 国际互连性能

对于需要访问国际网络的用户,NetQuality提供了国际互连性能测试:

国际网络性能测试结果

该测试展示了到不同国家和地区的网络延迟和吞吐量,帮助用户评估国际网络访问质量。

五、高级功能与扩展

5.1 命令行参数

NetQuality支持丰富的命令行参数,用户可以根据需要定制检测内容:

Parameters 参数运行: bash <(curl -sL https://Net.Check.Place) [-4] [-6] [-f] [-h] [-j] [-l language] [-n] [-o outputpath] [-p] [-y] [-E] [-L] [-M] [-P] [-R province] [-S chapters]
    -4                             Test IPv4                                  测试IPv4
    -6                             Test IPv6                                  测试IPv6
    -f                             Show full IP on reports                    报告展示完整IP地址
    -h                             Help information                           帮助信息
    -j                             JSON output                                JSON输出
    -l cn|en                       Specify script language                    指定报告语言
    -n                             No OS or dependencies check                跳过系统检测及依赖安装
    -o /path/to/file.ansi          Output ANSI report to file                 输出ANSI报告至文件
    -p                             Privacy mode - no generate report link     隐私模式:不生成报告链接
    -y                             Install dependencies without interupt      自动安装依赖
    -E                             Specify English Output                     指定英文输出
    -L                             Low data mode                              低数据模式(跳过测速环节)
    -M                             Run with Interactive Interface             交互界面方式运行
    -P                             Ping mode                                  三网延迟模式
    -R [Province]                  Route mode [Specify Province]              三网完整路由模式[可选指定省份]
    -S 1234567                     Skip sections by number                    跳过相应章节

5.2 交互模式

使用-M参数可以启动交互模式,通过菜单选择检测功能:

bash <(curl -sL https://Net.Check.Place) -M

5.3 结果输出

NetQuality支持多种结果输出格式,包括终端显示、JSON文件和ANSI报告文件,方便用户进行后续分析和分享。

六、总结

NetQuality作为一款功能全面的网络质量检测脚本,通过模块化设计和多线程技术,实现了对网络性能的全方位评估。其核心优势包括:

  1. 全面的检测功能:覆盖BGP信息、NAT类型、TCP配置、延迟测试、路由追踪和网速测试等多个方面。
  2. 直观的可视化展示:通过颜色编码和Unicode字符,将复杂的网络数据转化为直观的可视化结果。
  3. 灵活的参数配置:支持多种命令行参数,用户可以根据需求定制检测内容。
  4. 跨平台支持:适用于各种Linux发行版和macOS系统。

通过深入理解NetQuality的架构设计和实现原理,用户可以更好地使用该工具评估网络质量,诊断网络问题,优化网络配置。对于开发者而言,NetQuality的模块化设计和丰富的功能实现也提供了很好的学习参考。

无论是网络管理员、开发者还是普通用户,NetQuality都是一个值得尝试的网络质量检测工具。通过定期运行NetQuality,用户可以全面了解自己的网络状况,及时发现和解决网络问题,提升网络体验。

【免费下载链接】NetQuality A script for network quality detection 【免费下载链接】NetQuality 项目地址: https://gitcode.com/gh_mirrors/ne/NetQuality

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐