NetQuickCheck 技術文件
本文說明 NetQuickCheck 的資料來源、計算公式與監測機制,覆蓋無線分析、App 流量、網路探測與報告。
資料來源與網路卡選擇
NetQuickCheck 將系統取樣、主動網路探測和派生統計組合在一起。系統取樣提供介面、無線和程序連線資訊;主動探測獲取目標在本次請求中的回應;派生統計把多次觀測轉換為速率、分位數和變化曲線。
| 資料 | 採集方式 | 用於 |
|---|---|---|
| 網路介面 | macOS 介面與網路設定、路由計數器 | 網路卡狀態、位址、路由、DNS、收發位元組及錯誤計數 |
| 無線網路 | CoreWLAN 連線讀數與掃描結果 | RSSI、噪聲、頻道、頻寬、存取點資訊與頻率覆蓋 |
| 程序連線 | 系統 nettop 統計與程序資訊 | 應用歸屬、遠端位址、連線狀態、收發位元組及其增量 |
| 目標回應 | ICMP、TCP、DNS、HTTP 與測試資料傳輸 | 延遲、解析結果、服務狀態、路徑和吞吐量 |
指定網路卡的任務使用介面繫結:TCP、UDP 與直接 HTTP 請求透過 Network.framework 繫結介面,ICMP 探測使用系統命令的介面引數。自動路由模式交由 macOS 選擇路徑;自動 HTTP 請求沿用系統工作階段與代理策略。介面選擇與探測結果一起保留,方便比較 Wi-Fi、有線網路和其他可用介面。
目前網路與快速檢查
網路卡讀數與收發速率
目前網路頁讀取介面狀態、位址、閘道器與 DNS,並結合已連線 Wi-Fi 的無線讀數。網路卡收發位元組使用系統路由介面提供的 64 位計數器,接收錯誤、傳送錯誤和接收佇列丟棄分別保留。
接收速率(B/s)= 相鄰取樣的接收位元組增量 ÷ 取樣間隔(秒)
傳送速率(B/s)= 相鄰取樣的傳送位元組增量 ÷ 取樣間隔(秒)
位元速率(Mbps)= 位元組速率 × 8 ÷ 1,000,000
速率描述取樣間隔內的平均傳輸量。介面中的 MiB/s 使用 1,048,576 位元組換算,Mbps 使用每秒一百萬位元換算;網路卡計數與按應用匯總的計數各自對應不同的統計物件。
一次檢查的執行順序
快速檢查依次確認本機連線、探測閘道器、查詢 DNS、檢測外網、請求 HTTPS,再檢查出口資訊。目前實現給整輪檢查設定 8 秒預算,每個主動步驟最多使用剩餘預算中的 2 秒,結果隨步驟完成逐項更新。
閘道器步驟嘗試連線閘道器的 TCP 443 連接埠。連線成功和明確的連線拒絕都說明閘道器作出了回應;原始連線結果會同時保留。DNS、外網與 HTTPS 步驟分別記錄各自的返回結果,便於沿連線路徑逐層檢視。
Wi-Fi 掃描與無線指標
無線掃描透過 CoreWLAN 獲取附近存取點的 SSID、BSSID、主頻道、頻段、頻寬與接收訊號強度。可用頻道目錄來自目前無線介面;存取點的廣播資訊元素用於補充安全能力、無線制式、國家代碼等詳情。SSID、BSSID 等標識的讀取遵循 macOS 的位置權限規則。
RSSI、噪聲與訊雜比
RSSI 和噪聲採用 dBm,表示相對於 1 毫瓦的對數功率。RSSI 數值越接近 0,接收到的訊號越強。兩項讀數都有效時,App 計算訊雜比:
SNR(dB)= RSSI(dBm)− 噪聲(dBm)
例如 RSSI 為 −55 dBm、噪聲為 −92 dBm,SNR 為 37 dB。目前計算接受 −127 至 −1 dBm 範圍內的讀數;缺少任一項時,SNR 保持空缺。
無線訊號監測有兩種取樣來源:本機模式定期讀取已連線 Wi-Fi,附近模式重複掃描所選存取點。曲線保留各次讀取的時間;存取點身份用於區分不同無線訊號。
廣播中的頻道利用率
存取點廣播包含有效的 BSS Load 資訊元素時,App 將其中 0 至 255 的頻道利用率欄位換算為百分比:欄位值 × 100 ÷ 255。該欄位保留存取點廣播的含義;頻道重疊圖則使用下一節的頻率覆蓋與功率模型。
頻寬覆蓋與頻道評估
把頻道轉換為頻率範圍
頻道評估先按頻段、主頻道和頻寬建立頻率範圍。2.4 GHz 的 1 至 13 頻道中心頻率為 2407 + 5 × 頻道號,單位 MHz;14 頻道單獨對映為 2484 MHz。5 GHz 使用 5000 + 5 × 頻道號。20 MHz 範圍按中心頻率兩側各 10 MHz 建模,寬頻道由符合目錄的子頻道塊組合。
候選方案按頻段和頻寬生成,組成方案的各個子頻道都需要在本次目錄中。2.4 GHz 評估 20、40 MHz,5 GHz 和 6 GHz 評估 20、40、80、160 MHz 的組合。掃描記錄按頻段與 BSSID 歸併,BSSID 缺失時採用掃描記錄標識作為後備身份,避免同一存取點重複計數。
頻寬或方向資訊不足時,App 分別保留確定覆蓋與可能覆蓋。多個可能位置共有的區間歸入確定覆蓋,其餘區間歸入可能覆蓋;統計存取點數量時,同一個存取點只計一次。
從對數訊號計算重疊功率
訊號強度先從 dBm 轉為相對線性功率,再根據頻率範圍的重疊比例加權。對存取點 i 與候選方案 c,計算方式為:
Pᵢ = 10 ^ ((RSSIᵢ + 100) ÷ 10)
wᵢ,c = 重疊區間總寬度 ÷ 存取點建模區間總寬度
Poverlap,c = Σ (Pᵢ × wᵢ,c)
其中 +100 是統一的相對功率基準。頻寬存在不確定性且與候選範圍重疊時,權重按 1 保守計入。這樣,訊號強度和覆蓋寬度都會參與計算。RSSI 相差 10 dB 時,換算出的線性功率相差 10 倍。
候選方案怎樣排序
能夠識別目前存取點時,排序計算將其排除,以周邊訊號為評估物件;目前候選排序過濾 DFS 方案。2.4 GHz、20 MHz 優先考慮 1、6、11 頻道組,再依次比較缺失 RSSI 的存取點數量、估算干擾功率、存取點總數和頻道序列。
當全部候選都具有可比較的噪聲讀數時,噪聲也轉換為線性功率後加入;否則統一按重疊訊號功率比較。每個候選子頻道取有效噪聲排序後的中間讀數,完整候選採用其中較高的噪聲值。
同頻段、同頻寬下,若目前方案與最佳候選處於相同優先組、缺失 RSSI 的數量相同,且估算功率不超過最佳候選的 2 倍,排序會優先保留目前方案。2 倍線性功率約對應 3 dB,用於減少小差異造成的排序跳動。
重疊曲線怎樣顯示
重疊曲線按各頻道中心附近的 20 MHz 視窗計算加權功率,再用對數壓縮對映到 0 至 1 的相對顯示範圍:
顯示強度 = min(1, max(0, log₁₀(1 + Poverlap) ÷ 7))
這一縱軸表示由掃描讀數推導的相對重疊強度。遇到重疊存取點缺少有效 RSSI 時,該位置保持空缺並切開曲線段;確定與可能覆蓋仍分別保留。
區域網路裝置發現
裝置發現結合 Bonjour、WS-Discovery、SSDP 與 TCP 服務探測。Bonjour 提供廣播的服務執行個體;WS-Discovery 與 SSDP 補充支援相應協議的裝置回應;TCP 探測則檢查目前掃描範圍內位址的服務回應。
目前 TCP 探測連接埠為 80、443、445、22、631 和 9100,分別覆蓋常見網頁、檔案共享、遠端連線及列印服務入口。請求使用所選網路介面,觀測記錄保留來源、位址和實際回應。
發現過程逐批合併各來源的觀測,並按裝置位址與服務證據整理名稱、類型和服務清單。介面不可用、存取被拒絕、逾時和服務回應分別記錄。取消或重新開始掃描時,舊一輪的遲到回呼會被隔離,避免混入新結果。
App 流量與連線歸屬
從系統連線表找到應用
App 流量讀取 nettop 提供的程序、協議、本機與遠端端點、網路卡、連線狀態和位元組計數。App 再結合執行中的應用、程序父子關係和可執行檔案路徑,將輔助程序歸入所屬應用。
歸屬匹配優先查詢程序本身,再沿父程序鏈向上查詢,最多檢查 16 層;仍未匹配時,按可執行檔案所屬的App 套件路徑匹配。程序身份同時結合啟動時間,區分系統重複使用同一 PID 的情況。
逐連線計算增量,再彙總到應用
相鄰取樣按程序、協議、本機端點、遠端端點與網路卡匹配連線。只有同一連線的前後計數可比較時,才計算收發速率,再按所屬應用匯總。
連線下載速率 = (本次接收位元組 − 上次接收位元組) ÷ 時間差
連線上傳速率 = (本次傳送位元組 − 上次傳送位元組) ÷ 時間差
應用速率 = 該應用及其關聯程序的有效連線速率之和
新出現的連線先建立基線;計數回退、網路卡變化或前後取樣間隔超過 15 秒時,重新等待可比較樣本。系統給出多條無法唯一識別的相同連線行時,App 保留這些行,並將其速率留空,避免把連線匹配歧義計算成突發流量。
遠端連線與 ICMP 觀測
App 連線監測保留連線首次與最後出現時間、狀態變化及流量增量,並對發現的遠端 IP 進行獨立 ICMP 探測。流量、連線活動與 ICMP 結果按時間關聯;其中延遲來自目標 IP 的 ICMP 應答。
Ping 與 TCP 探測
ICMP Echo 與無應答比例
Ping 先解析並固定本次目標位址,然後使用 IPv4 ICMP Echo 或 IPv6 ICMPv6 Echo 傳送單次探測。連續監測按設定重複執行,記錄實際傳送、應答、無應答和返回的往返時間。
無應答比例 = 無應答次數 ÷ 實際傳送次數 × 100%
計數以系統輸出確認的傳送量為基礎。解析失敗、權限拒絕或未能發出請求的記錄保留具體狀態,不進入已傳送探測的分母。延遲統計採用有效應答的 RTT。
TCP 連接埠連線
TCP 連接埠監測在解析目標後,對指定連接埠建立連線,用單調時鐘記錄從發起連線到成功或錯誤返回的耗時。域名解析先完成,TCP 建連耗時單獨計時。連線成功、連線被拒絕、逾時和其他系統錯誤分別保留,可用於觀察同一服務連接埠隨時間的變化。
DNS 查詢與回應校驗
DNS 監測按所選伺服器和記錄類型發起查詢,例如 A、AAAA、CNAME、MX、TXT、NS、SOA 與 PTR。系統預設解析與指定伺服器查詢使用各自的路徑;自動路由按請求使用系統解析或 dig,指定網路卡的查詢透過繫結介面的 UDP 53 交換報文。
直接查詢為每次請求生成事務 ID,構造問題名稱、類型與 IN 類別。收到回應後依次校驗報文長度、事務 ID、回應標誌、問題數量、問題名稱、類型及類別,再解析回應碼、資源記錄和 TTL。域名壓縮指標由報文解析器展開。
回應中的 NOERROR 且具有所選類型的記錄、NOERROR 但無相應記錄、NXDOMAIN、報文截斷和傳輸失敗分別記錄。PTR 查詢會先把 IPv4 或 IPv6 位址轉換為對應的反向域名。耗時覆蓋這次查詢及回應解析過程,返回結果保留實際伺服器與記錄內容。
HTTP 回應與階段計時
網站監測傳送 HTTP 或 HTTPS HEAD 請求,記錄服務返回的狀態碼、最終網址和耗時。自動路徑使用 URLSession 的事務指標;指定網路卡或解析路徑時,直接 HTTP 實現使用 Network.framework 的連線報告與請求時間點。
| 階段 | 起點 | 終點 |
|---|---|---|
| DNS | 開始解析目標名 | 完成本次解析 |
| TCP | 開始建立連線 | TCP 建連完成,TLS 單獨計時 |
| TLS | 開始安全握手 | 完成安全握手 |
| 請求傳送 | 開始傳送請求 | 請求傳送完成 |
| 首位元組等待 | 請求傳送完成 | 收到回應首位元組 |
| 回應接收 | 收到回應首位元組 | 本次 HEAD 回應接收結束 |
階段耗時按結束與開始時間之差計算。複用連線時,系統可能不再產生新的 DNS、TCP 或 TLS 階段;缺少有效時間點的階段保持空缺。重定向按各次請求保留階段資訊,整次檢查還包含解析、重定向和排程等實際開銷,因此總耗時單獨計時。
HTTPS 沿用系統憑證信任校驗,並從有效憑證中提取主體、簽發者、有效期與 SHA-256 指紋。HTTP 狀態碼描述服務返回,傳輸錯誤描述連線過程,兩類結果分別儲存。
網路路徑與逐跳探測
網路路徑監測先解析目標並固定目標位址,再從 1 開始逐步增加 IPv4 TTL 或 IPv6 Hop Limit,傳送 ICMP 探測。中間路由節點可能返回跳數到期應答,目標則可能返回 Echo Reply,App 據此整理逐跳位址和可用耗時。
目前每輪最多探測 16 跳。中間某一跳未應答時,繼續檢查後續跳數;收到目標應答後結束本輪。節點返回不可達或策略拒絕時,保留其原始結果。存在節點位址但系統未提供有效耗時時,位址保留、耗時留空。
吞吐量與負載回應性
目前網路頁: Apple networkQuality
目前網路頁呼叫 macOS networkQuality,並解析其結構化結果,包括下載、上傳、空閒延遲及負載下回應性 RPM。RPM 表示每分鐘往返次數,由 Apple 的工具測量;App 保留系統返回值。原始下載與上傳位元速率除以 1,000,000 後顯示為 Mbps。
選擇網路卡時,測速命令攜帶介面引數,並核對結果返回的介面名稱。系統僅返回部分指標時,保留已獲得的欄位,其餘欄位保持空缺。
監測器:節點與系統測速
監測器的每輪網速測試先執行所選 Cloudflare 或 LibreSpeed 節點的下載與上傳,再執行 Apple networkQuality 系統測速,分別保留來源、時間和實際結果。節點下載讀取測試負載,上傳使用 App 臨時生成的資料,按實際完成的位元組數與該階段經過時間計算平均速率:
吞吐量(Mbps)= 實際傳輸位元組 × 8 ÷ 實際耗時(秒)÷ 1,000,000
請求使用明確的測試負載、逾時與快取策略,並分別儲存傳輸進度、目標位元組數和實際傳輸量。階段結果會標明完成、部分完成或失敗;測量記錄同時保留伺服器與網路卡,方便在相同條件下比較。
持續監測、曲線與統計
獨立取樣,共享時間軸
監測器包含 Ping、TCP、DNS、網站、網路路徑、網速、無線訊號、網路卡流量、App 流量與App 連線十類工具。各任務保留自己的目標、引數和取樣時間,共享的時間視窗用於對齊不同觀測,檢視延遲、無線讀數、流量與服務回應在時間上的關係。
主動探測與頻寬傳輸分別申請資源配額,目前預設預算為同時 8 個探測操作、2 個傳輸操作。超過預算的操作進入等待,執行結束後釋放配額;取消時等待實際操作退出再釋放。配額圍繞單次探測或傳輸管理,重複任務在下一輪重新申請。
曲線分段與相對變化
圖表按取樣時間和資料段標識連線曲線,中斷兩側分段顯示,失敗記錄單獨呈現。視口邊界處的線段插值只參與繪製,統計仍採用實際觀測值。
啟用延遲相對尖峰標記時,App 取同一資料段前 5 個樣本的中位數 m。目前延遲超過 max(3 × m,m + 5 ms) 時標記該點;無線訊號變化標記則比較與近期中位數的差,達到 8 dB 時標記。這些規則用於定位相對近期基線的變化位置。
中位數、P95 與變化量
時間視窗中的數值統計先篩選有效有限值,再排序。樣本數為奇數時取中間值,偶數時取兩個中間值的平均數;視窗沒有有效值時,統計值保持空缺。P95 使用最近秩法:
P95 = 升序樣本中第 ceil(0.95 × n) 個值
ICMP 無應答比例 = 無應答探測數 ÷ 實際傳送探測數
ICMP 延遲變化量 = 有效相鄰應答 RTT 差的絕對值之和 ÷ 有效相鄰對數
App 連線的 ICMP 工作階段累計分位數使用 0.1 ms 精度直方圖,與原始歷史保留視窗分開累計。0 至 2000 ms 的有效應答進入分桶,更大值進入溢位計數並參與最大值記錄;分位數落入溢位範圍時保持空缺。延遲變化量只連線同一資料段中間隔不超過 2.5 秒的有效相鄰應答。
監測記錄與報告匯出
監測記錄儲存任務引數、目標、取樣時間、實際結果及相應證據。圖表用於按時間檢視變化,報告則把觀測轉換為適合閱讀或繼續處理的結構。
- HTML
- 生成可閱讀的報告,包含任務摘要、結果與詳情。
- CSV
- 將證據整理為時間、類別、物件、目標、方法、狀態、數值、單位和詳情等列,供表格工具分析。
- JSON
- 保留結構化記錄、設定與結果,適合進一步處理。
App 連線的長工作階段使用分段歸檔。匯出時先固定歸檔的讀取範圍,再流式讀取歸檔與目前記憶體尾部,使一次匯出使用一致的資料邊界。記錄中的空缺值、失敗與取消狀態各自保留,方便回顧時沿用相同的統計口徑。