UDP丟包原因總結


丟包檢查方法

  • 給每個UDP包編號,對比收發端的接收到的包。對於UDP協議層上的包,例如RTP包,可以從RTP包中讀出包的序列號進行判斷。
  • 抓包。發送端和接收端分別抓包。linux下可以使用tcpdump,windows下使用wireshark。
  • linux下,可以使用watch netstat -su查看丟包統計。主要看RcvbufErrors和SndbufErrors。如果兩個統計項的數字都在不斷增加,表明網卡有丟包。

發送方丟包

發送的包太大

發送的包比64K大會導致UDP協議sendto返回錯誤。
發送的包比MTU大,UDP包在接收端容易丟包,可查看接收端的網卡統計。可考慮把包切分到MTU一下再發送。

發包速度太快

發包速度太快的話,可能有兩個問題:1.接收端來不及接收導致接收端丟包。2.發送端網卡處理不過來。這個時候sendto沒有返回錯誤,但是用netstat查看會發現SndbufErrors不斷上升,有可能是網卡的輸出隊列太小導致。可以考慮使用ifconfig命令把txqueuelen設置大一些。

UDP包流量太大

同一個端口發送的數據量太大時會導致網卡丟包,這個時候可以用netstat查看會發現SndbufErrors不斷上升。sendto會返回-1.這個時候可以考慮增大/proc/sys/net/core/wmem_max的值。
這種情況尤其是同時給多個客戶端發送音視頻數據時導致。筆者曾經遇到過這么一次情況。一個端口向8個客戶端發送視頻流時,網卡流量大概400M/s,sendto會返回-1,errno 11.程序里也調用setsockopt設置了發送緩沖區為60M,然而還是會丟包。后來將系統參數/proc/sys/net/core/wmem_max設到60M才解決問題。

接收端丟包

接收緩沖區太小

接收緩沖區小於發送客戶端的包的大小,或者接收客戶端recvfrom速度太慢,導致接收緩沖區滿丟棄數據。前一種問題,可以考慮增大接收緩沖區。后一種問題,可以考慮將接收操作和業務處理操作分離到不同的線程來處理。



作者:小怪獸狂毆奧特曼
鏈接:https://www.jianshu.com/p/7f4700a5e970
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM