丟包檢查方法
- 給每個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
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。