如何測量和最小化 UDP 資料包遺失

如何測量和最小化 UDP 資料包遺失

透過 VOIP 應用程式撥打電話時,我有時會遇到語音中斷的情況。由於所有VOIP應用程式都使用UDP進行資料傳輸,Linux中是否有任何工具可以測量資料包遺失量並測量網路的效能。

UDP丟包的一般原因是什麼?

答案1

UDP 遺失(尤其是在 LAN 中)的主要原因之一是緩衝區溢位。這些可能發生在交換器、發送或接收伺服器。在 Linux 上可以使用的一種驗證封包遺失的機制是執行以下命令:

watch -n 1 -d 'cat /proc/net/udp'

這將顯示類似於以下內容的輸出,其中最後一列是丟棄的資料包數:

Every 1.0s: cat /proc/net/udp                                                                                                                                 Mon Sep 28 15:01:00 2015

  sl  local_address rem_address   st tx_queue rx_queue tr tm->when retrnsmt   uid  timeout inode ref pointer drops
11362: 00000000:3443 00000000:0000 07 00000000:00000000 00:00000000 00000000     0        0 18224 2 ffff880808040000 0
19543: 00000000:D438 00000000:0000 07 00000000:00000000 00:00000000 00000000     0        0 3809742 2 ffff8808060c8400 0
30819: 00000000:0044 00000000:0000 07 00000000:00000000 00:00000000 00000000     0        0 12644 2 ffff88100f2b0400 0

然後,您可以嘗試多種不同的技巧來嘗試解決這些問題(再次以 Linux 為例):

  • 確保使用數據的應用程式有足夠的可用CPU,
  • 確保執行 I/O 的執行緒盡可能靠近網路設備
  • 確保 udp 緩衝區大小都足夠大以容納資料(同樣,您可以觀察 watch 命令的輸出以查看tx_queuerx_queue列是否增長),然後使用 sudo sysctl -w 'net/ipv4/udp_mem=xxx yyy zzzz'、 or sysctl -w 'net/core/rmem_default=????'、 or增加 udp 緩衝區sysctl -w 'net/core/wmem_default=????'(注意,xxx ,yyyy,zzz 已定義這裡

在無恥的自我推銷中,我創建了一個名為Pontus Vision 執行緒管理器不斷地自動調整。

答案2

UDP 丟包的一般原因可能是什麼

擁塞(資料包過多)且缺少 QOS(隨機資料包丟棄、VoIP 未優先處理)和/或設備故障(線路品質等)。 )因為不好。

對於互聯網連接,您需要在兩端都有 QOS 路由器 - 但您不會擁有(除非您的供應商提供 VoIP,那麼他可能已經擁有適當的基礎設施)。也就是說,由於下行通道通常比上行通道大得多,因此僅優先考慮下行通道的本地路由器通常「足夠好」。

然而,線路品質差是一個很難處理的問題。

答案3

如果您遇到 UDP 封包遺失問題,那麼幾乎肯定也會遇到 TCP 封包遺失問題。不同之處在於 TCP 會重新傳輸遺失的資料包,而 UDP 則不會。 VoIP 應用程式無法重新傳輸,因為如果這樣做,資訊將不再有任何用處。

我假設您的 VoIP 通話是透過網路進行的。 QoS 可能是必要的,但如果您的網路連線無法正常運作,它不會有任何好處。用這個丟包測試檢查一下。它會告訴您是否發生了資料包遺失,即在 ISP 或您的本地站點。

如果它在您的本地站點發現問題,那麼就需要檢查您的電纜或 DSL 數據機是否具有良好的信噪比、輸出功率和衰減 (DSL)。

相關內容