
透過 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_queue
或rx_queue
列是否增長),然後使用 sudosysctl -w 'net/ipv4/udp_mem=xxx yyy zzzz'
、 orsysctl -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)。