# 以統計觀點看電腦網路傳輸品質 > 資料整理: [jserv](https://wiki.csie.ncku.edu.tw/User/jserv) 本文從統計觀點,衡量電腦網路傳輸品質,將多項網路指標轉換為「陽性特徵」,並結合 sigmoid 函數與統計分佈,構建統一的指數圖像系統,從而協助精準診斷如擁塞、突發抖動與隨機封包遺失等傳輸異常狀況。 > 本文改寫[傳輸品質評估系統簡介](https://blog.csdn.net/dog250/article/details/143164573) ## 衡量電腦網路傳輸品質 在衡量電腦網路傳輸品質以進行預測時,我們會運用多種指標,而這些指標彼此之間存在差異:它們擁有不同的單位、不同的作用範圍、不同的平均與採集方式。因此,我們仰賴統一的方法來彙整這些複雜的資訊,以因應以下需求: - 跨指標評估 - 跨主體比較與基準 - 僅區分正向與負向影響 - 強化關鍵特徵的判斷力 其主軸目的是為了取得早期預警信號,並輔助決策制定。 時間與空間具有漸變性,而世界因其時間與空間的局部性,也呈現出漸變的特徵,在經濟學領域,常藉由「指數」描述。指數消除量綱 (dimension),使得使用單一的指數曲線來描繪趨勢變得十分便利。在任何以統計學為基礎的領域中,如氣象學、社會學與網際網路,主體想法大致相同。 相較於單一指標,指數的穩定性更高,因為它是多項因素共同作用的結果。當所有因素同步變動時,往往顯示某種深層原因正在產生具體效應;反之,單一或少數指標的異常波動通常無法顯著影響整體指數,因此可合理視為雜訊予以忽略。 本文將電腦網路傳輸的頻寬及延遲,作為整體效能衡量依據,並延伸為一種「指數」,藉此建立一套電腦網路傳輸品質評價機制,作為改善網路傳輸的依據,甚至影響通訊協定的行為。 ## 建構指數的步驟 在此簡述如何設定並應用此評價機制中的指數,步驟如下: 1. 抽取指標的顯式特徵,例如在擁塞狀態下延遲一定偏高,但延遲的變異程度 (variance,變異數) 卻不一定如此,也就是說,延遲為顯式特徵,延遲變異數則否。 2. 將那些「越小越好」的顯式特徵,藉由 [sigmoid 函數](https://en.wikipedia.org/wiki/Sigmoid_function)轉換為「越大越好」,並將度量值映射至 $[0, 1]$ 區間 3. 經過轉換的「越大越好」的特徵稱為「陽性特徵」 4. 選擇一個數學函數 $f(\ldots)$,使其滿足這特性:當所有陽性特徵皆「足夠大」時,$f(\ldots)$ 顯著上升,否則維持在較低值 該方法的依據在於,唯有當所有顯式特徵皆轉化為陽性特徵時,方可合理地判斷成因。為了驗證概念,採用以下修改過的 sigmoid 函數: ![image](https://hackmd.io/_uploads/ryECbD-p1l.png) 為了讓第三步所提到的函數 $f(\ldots)$ 發揮更強烈的效應,本文刻意讓 $y$ 在 $x \ge 0$ 的區間內,其最大值略微超過 1。其背後的想法是: - 僅當所有 $v_1, v_2, v_3, \ldots$ 均足夠大時,$f(v_1, v_2, v_3, \ldots)$ 才會顯著提升; - 因此,我們需要拉大數值之間的區別,讓小的更小、大的更大; - 換言之,將大於 1 的視為「大」,小於 1 的視為「小」; 舉例來說,可以使用如下形式來構建 $f(\ldots)$: $$ f(\ldots) = \left( \prod a_i \right)^n $$ 或 $$ f(\ldots) = \left( \sum a_i \right)^n - \sum a_i $$ 可將 $f(\ldots)$ 的圖像視為一種「指數圖像」,當圖像凸起即代表異常出現,其幅度則反映嚴重程度。 以下說明該案例的情境與特徵: | 狀況 | 延遲時間 | 延遲時間變異數 | 頻寬 | 頻寬變異數 | |-----------|------|----------|------|----------| | 穩定擁塞 | 大 | 小 | N/A | N/A | | 突發性擁塞 | 大 | 大 | N/A | N/A | | 隨機封包遺失(高)| 小 | 小 | 小 | 大 | | 隨機封包遺失(低)| 小 | 小 | 大 | 小 | 低延遲時間與高頻寬幾乎是端到端 (end-to-end) 傳輸所追求的最終目標,本文以此為基礎建立評價指標。仍可透過更細緻的圖像進一步產生指數,或為現有的圖像指數新增指標,範例如下: - 封包遺失間隔 - 封包遺失間隔變異數 - 連續兩次封包遺失時的 [TCP 壅塞視窗](https://en.wikipedia.org/wiki/TCP_congestion_control) (congestion window, cwnd) 比值 - `bw / delay` 及其變異數 - 通用 QoE ([Quality of experience](https://en.wikipedia.org/wiki/Quality_of_experience)) 映射模型 藉由上方表格,以下是模擬用的 Python 程式碼: ```python if n > 500 and n <= 1000: # 隨機突發擁塞 Buff = random.randint(0, 20) elif n > 1500 and n <= 2000: # 持續擁塞 Buff = 20 elif n > 2500 and n <= 3000: # 逐漸擁塞 Buff += 0.04 elif n > 3500 and n <= 4000: # 隨機高封包遺失率(無擁塞) Buff = 0 if random.random() < drate: wx[n] = wx[n]/2 wy[n] = wy[n]/2 elif n > 4200 and n <= 4600: # 隨機低封包遺失率(無擁塞) Buff = 0 if random.random() < drate/50: wx[n] = wx[n]/2 else: # Good Buff = 0 while wx[n] + wy[n] + Buff > 1.2 * C * R: wx[n] = wx[n]/2 wy[n] = wy[n]/2 ``` 其目標是藉由觀察「擁塞指數」、「突發指數」與「隨機封包遺失指數」,成功區分出突發性抖動、常規擁塞與隨機封包遺失等不同現象。藉由這些指數,能夠精確診斷頻寬下降的具體原因,進而有效引導通訊協定的行為調整。 以下針對前述模擬場景,加入上述指數圖像後的實作結果,並以 [matplotlib](https://matplotlib.org/) 繪製的展示: ![image](https://hackmd.io/_uploads/B1FeXwZpJx.png) 注意最後的 Good 區段,它成功濾除出真正「有問題」且需要處理的區間,唯獨低封包遺失率的隨機封包遺失區段未被標示,這表示在目前這個濾波器的靈敏度範圍內,該區段不構成需要處理的異常。接下來,我們用低通特性更明顯的濾波器 (low-pass filter) 來觀察其效果: ![image](https://hackmd.io/_uploads/ByQX7P-6Jl.png) 透過觀察此圖來診斷傳輸效能的方法相當直觀: - 將每個指標對應的指數圖像,與實際測得的頻寬變化圖像一同排列顯示,並保持一致的時間尺度; - 當發現頻寬出現異常時,針對該時間區段逐一檢視各個指標的指數圖像; - 若某個指數圖像在該時間區段呈現明顯的陽性凸起,則可判定該指標在該區段為陽性特徵; ![image](https://hackmd.io/_uploads/Bkr8mvbaye.png) 藉由上述方法,便可清楚識別出傳輸異常的成因。 在任何時刻,我們都可檢視這些指數圖像,以改善通訊協定的表現。由於現實世界具有時間與空間的局部性,並呈現漸變特性,這類圖像能夠準確反映真實情況,具備高度可信度。 不過,在變化剛開始出現的邊緣地帶,務必謹慎,切勿輕率預測。行為應與變化本身保持一致,其策略如下: - 若已偵測到處於持續性擁塞階段,則應維持保守的擁塞控制策略 - 若首次偵測到異常,應假設其為潛在災難的起點,轉為保守模式,直到圖像顯示這只是短暫的毛刺,才可恢復積極策略 - 持續關注指數圖像中出現的早期異常始終是正確的,關鍵在於如何做出反應 上述展示更像是一幅素描、甚至僅是輪廓,用來說明這套評價體系的基本工作原理。未來仍可引入更多指標,並透過 sigmoid 函數提取「陽性特徵」,圖像愈豐富、表現愈細緻,其指數圖像就愈接近真實,一如從素描走向油畫級的精緻程度。 在實際應用層面,這套評估體系可以部署於任何作為傳送導向的伺服器上,並以背景程式的形式持續執行。它會不斷蒐集傳輸流的資料來產生指數圖像,通訊協定則可隨時參考這些圖像,以獲得即時的決策指引。 舉例來說,可用阿里雲發布的 TCP 傳輸工具 [TCP-RT](https://www.alibabacloud.com/help/en/alinux/user-guide/tcp-rt-configurations),取用其資料蒐集模組,透過背景程式主動拉取,或由通訊協定主動推送的方式獲取原始資料,便可即時產生指數圖像。 ## 回顧 sigmoid 函數 sigmoid 函數是種極為實用的工具,能輸入的高低或大小變化,映射至固定且歸一化的數值區間,從而簡化並統一後續的分析流程。該特性與類神經網路中的「激勵」(activation) 機制相似:當輸入強度超過某個臨界值,輸出便迅速上升,對應為一種「陽性特徵」。 只有當某一特徵對應的所有 Sigmoid 輸出皆為陽性(邏輯上的 AND 關係)時,該特徵才能被整體判定為陽性,如持續擁塞、突發擁塞、隨機封包遺失等情境,皆可藉此準確識別。 這類具備相似特性的函數被統稱為「邏輯函數」,其中標準邏輯函數亦稱為 S 函數 (Sigmoid 即代表其「S 形」曲線)。Sigmoid 函數常以 $\sigma(x)$ 或 $\text{sig}(x)$ 表示,其圖像為一條平滑的 S 形曲線,如下圖中的綠線所示,而其導數則如圖中的粉紅線。 ![image](https://hackmd.io/_uploads/HyJEOPWakl.png) 不過,稍早圖示所用的 Sigmoid 函數,其實伴隨著一系列參數的調整: $$ f(x) = \frac{a}{1 + e^{bx}} + c $$ 也就是說,真正使用這類函數之前,必須先透過大量資料來校準參數 $a$, $b$, $c$,Sigmoid 函數的計算也涉及冪運算,在某些情境下實作困難,尤其是在 Linux 核心中,這類運算成本極高,即便採用泰勒展開近似,也仍屬於重計算。 事實上,我們真正需要的,只是某種「從 0 到某個上界 a 為定義域,輸出值域為 0 到 1 的遞增函數 $f(x)$」,且其遞增幅度 $g(x)$ 最好是 $f(x)$ 的導數。現成的替代方案早已存在,也就是機率密度函數(PDF)和累積分佈函數(CDF)。PDF 描述資料的分佈情況,不需要額外參數調整,而在電腦網路持續蒐集到的大量資料,可直接用來產生 PDF,隨後藉由透過積分取得 CDF,該 CDF 就可視為自訂化的 sigmoid 函數來運用。 這種做法的理論依據在於:既然大量資料來自於日常環境下的穩定蒐集,其分佈自然能代表未來局部時間段的趨勢。PDF 的產生過程本質上是一種擬合過程,而由此得到的預測模型,其精準性遠高於參數調整所得的 sigmoid 函數。 ## 真實網路資料分佈實例 RTT (封包來回時間,Round-Trip Time) 主要與傳送路徑的實體距離有關,無論訊號是透過電還是光進行傳輸,其理論速度相近,若路徑條件一致,距離越遠,RTT 理應越大。但若網路路徑相同,RTT 卻出現差異,問題多半出在中途設備處理所產生的額外延遲,也就是封包被接收、處理再送出所耗費的時間。 藉由 [ping](https://man7.org/linux/man-pages/man8/ping.8.html) 或 [traceroute](https://man7.org/linux/man-pages/man8/traceroute.8.html) 等命令可測量 RTT,這些工具藉由傳送 ICMP 回應封包並計算往返時間,能大致反映網路延遲狀況。當封包目的地為路由器本身時,該封包需經由程序交換處理,即由處理器讀取並回應封包內容。然而,路由器設計的主要任務是轉發封包,回應 `ping` 僅屬於「盡力而為」(best effort) 的服務。 以下為實際範例,從 Router1 對 Router2 執行 `ping`: ``` Router1# ping 172.16.0.12 Sending 5, 100-byte ICMP Echos to 172.16.0.12: !!!!! Success rate is 100 percent (5/5), round-trip min/avg/max = 4/4/4 ms ``` 當在 Router2 上啟用大量運算操作後再次執行: ``` Router1# ping 172.16.0.12 !!!!! Success rate is 100 percent (5/5), round-trip min/avg/max = 24/25/28 ms ``` RTT 顯著上升,原因是 Router2 資源繁忙,降低回應 `ping` 的優先權。 ![image](https://hackmd.io/_uploads/S1CeBOb6yx.png) 相較之下,評估路由器效能更準確的方法是觀察「通過路由器」的實際流量。封包在此情境下會經過快速交換(fast switching),由高優先順序的處理機制完成。 ![image](https://hackmd.io/_uploads/Hk3rHdbaJx.png) 舉例:從 Router1 `ping` Router3,封包需經過中間的 Router2: ``` Router1# ping 10.0.3.23 !!!!! Success rate is 100 percent (5/5), round-trip min/avg/max = 32/32/32 ms ``` 此時在 Router2 啟用高負載功能後再次測試: ``` Router1# ping 10.0.3.23 !!!!! Success rate is 100 percent (5/5), round-trip min/avg/max = 32/32/36 ms ``` 幾乎無明顯變化。這是因為通過型封包在 Router2 是藉由核心網路層級進行,不受使用層級程式所影響,效能相對穩定。由上可知,針對網路延遲的分析,需區分封包「目的地」與「轉發路徑」,才能得出正確結論。 > 延伸閱讀: [瞭解 Ping 和 Traceroute 命令](https://www.cisco.com/c/zh_tw/support/docs/ios-nx-os-software/ios-software-releases-121-mainline/12778-ping-traceroute.html) 電腦網路連線的平均 RTT 通常呈現常態分佈,電腦網路範圍越大,PDF 越矮胖。若要判定 RTT 是否構成陽性特徵,只需持續蒐集 RTT 資料,產生其 PDF,進而求得 CDF。這個 CDF 就能直接當作 sigmoid 函數使用。例如,當 RTT 超過 $\mu + 3\sigma$ 時,即可視為顯著陽性。 ![image](https://hackmd.io/_uploads/SyqNHwW6yl.png) 至於網路吞吐量,因為網路中通常存在多個頻寬各異的瓶頸,加上分散式路由的特性,其統計分佈往往呈現多峰,甚至是雙峰特徵。在這種情況下,可使用 CDF 作為指數圖像工具,並將超出最後一個主要峰值 $3\sigma$ 區間以外的吞吐量視為陽性特徵予以凸顯。 ![image](https://hackmd.io/_uploads/H1NwHPZ6Jx.png) 再來看 jitter(延遲時間抖動),這項指標對尾端延遲時間([tail latency](https://en.wikipedia.org/wiki/Long-tail_traffic),如 P99)有顯著影響。當平均延遲時間較小時,網路中的突發性通常較強,分佈形態更接近 [Pareto 分佈](https://en.wikipedia.org/wiki/Pareto_distribution);反之,若延遲時間較高,則傾向於常態分佈,且分佈峰值會向右偏移。在這種情況下,可將 CDF 的 P90 作為判斷陽性特徵的閾值,超過此值即凸顯為陽性。 ![image](https://hackmd.io/_uploads/BJ5KSPZTkl.png) 諸如此類的應用,皆可直接利用統計特徵,將原本繁瑣的參數調整過程自然地展現於資料的分佈之中,也就是說,參數調整實際上早已在 PDF 的產生過程中完成。 ## 從數學函數到資料驅動 換個視角來看 PDF、CDF 與 Sigmoid 的關係:雖然 sigmoid 在數學上是一種常見的激勵函數,常用於神經網路中將輸入映射到 0 到 1 的區間,用以模擬「激勵」的過程;但 CDF 本身就是在描述一個隨機變數落在某個值以下的累積機率。當我們想知道「某事件是否值得注意」時,本質上就是在問:發生的機率是否已「超過某個臨界點」。 從這個角度來看,「激勵」、「陽性」這類判斷,其實就是在檢查某件事的出現是否已達成某種累積的臨界量,亦即從量變邁向質變。其過程本質上是種機率意義上的轉換。因此,sigmoid 函數的形狀與 CDF 極為相似並非巧合,而是源自它們在功能上的高度一致性:兩者皆可用來描述現象的演變。使用 CDF 作為自適應激勵函數,不僅保留 sigmoid 的數學性質,還可真實反映資料的統計特徵,避免過度依賴參數調整,從而提升系統在變化環境中的自我適應能力。該思維也體現從「建模」到「資料驅動」的分析轉向。