2010-04-27 77 views
5

我編寫了一個C++應用程序(在Linux上運行),用於服務約400 kbps的RTP流。對於大多數目的地來說,這可以正常工作,但是有些目的地會經歷丟包。有問題的目的地似乎有一個共同的較慢的連接,但它應該足夠快,足夠我發送的流。如何調試數據包丟失?

因爲這些目的地都能夠收到類似RTP爲無丟包其他應用程序流,我的應用程序可能會出現故障。

我已經驗證的幾件事情: - 在tcpdump的,我看到所有的RTP包走出去送機 上 - 有一個UDP的地方(我試過64KB和300KB之間大小) 發送緩衝區 - 該RTP包大多停留低於1400個字節,以避免碎片

什麼可以發送應用程序做,以儘量減少數據包丟失的可能性,這將是調試這種情況最好的方法是什麼?

回答

9

不要以大突發塊發送數據包。

分組丟失通常是由具有有限包緩衝區的大小緩慢路由器引起的。緩慢的路由器可能能夠處理1 Mbps的就好了,如果有時間接收到另一條10日前發出比如說,10個包,但如果100 Mbps的發送方將其發送50個數據包的一大塊就別無選擇,只能放棄其中40人。

嘗試鋪開發送,讓你只寫了什麼是必要的,每個時間段來寫。如果您必須每五秒鐘寫一個數據包,請按照這種方式進行,而不是每秒寫入5個數據包。

-2

這可能不是你想要的答案,但如果我有丟包的問題我想嘗試改用我的應用程序使用TCP,並且已經採取了我的腦海丟包的大部分憂慮。

+0

RTP的很大一點是利用UDP語義;特別是允許丟失數據包而不會拖延流的其餘部分。 – jesup 2010-05-13 08:15:29

+0

糟糕!我對RTP無知是個不好的因素。我現在就去閱讀。感謝您的領導! – 2010-05-13 09:00:43

1

您應該嘗試降低發送數據包的速率。慢速連接可能意味着各種各樣的事情,並試圖以高速率發送數據包(小或大)不會有幫助。

5

的netstat有幾個有用的選項來調試情況。

第一個是netstat的-su(轉儲UDP統計):

[email protected]:/media> netstat -su              
IcmpMsg:                     
    InType3: 679 
    InType4: 20 
    InType11: 548 
    OutType3: 100 
Udp: 
    12945 packets received 
    88 packets to unknown port received. 
    0 packet receive errors 
    13139 packets sent 
    RcvbufErrors: 0 
    SndbufErrors: 0 
UdpLite: 
    InDatagrams: 0 
    NoPorts: 0 
    InErrors: 0 
    OutDatagrams: 0 
    RcvbufErrors: 0 
    SndbufErrors: 0 
IpExt: 
    InNoRoutes: 0 
    InTruncatedPkts: 0 
    InMcastPkts: 3877 
    OutMcastPkts: 3881 
    InBcastPkts: 0 
    OutBcastPkts: 0 
    InOctets: 7172779304 
    OutOctets: 785498393 
    InMcastOctets: 525749 
    OutMcastOctets: 525909 
    InBcastOctets: 0 
    OutBcastOctets: 0 

通知 「RcvbufErrors」 和 「SndbufErrors」

附加選項是監測接收和發送過程中的UDP緩衝區:

[email protected]:/media> netstat -ua 
Active Internet connections (servers and established) 
Proto Recv-Q Send-Q Local Address   Foreign Address   State 
udp  0  0 *:bootpc    *:* 
udp  0  0 *:40134     *:* 
udp  0  0 *:737     *:* 
udp  0  0 *:mdns     *:* 

在這裏您需要查看您感興趣的連接的Recv-Q和Send-Q列。如果數值較高並且不降爲零,則比進程無法處理負載。

您可以發送和接收上機使用這些命令。

您也可以使用地鐵,它結合了跟蹤路由和ping - 要乒每一跳的路由。 這可能會檢測到您的路線中的慢速跳躍。在其他機器上運行它以檢查與第二個機器的連接。

+1

這裏有一些很好的建議,但我不確定這會對他有幫助。實際的數據包丟失可能發生在ISP路由器上,他無法查看統計信息。 – 2010-04-27 18:50:46

+0

事實上,我發現在發送機器上沒有任何數據包丟失與netstat。不幸的是,到目的地的路徑涉及很多我無法直接訪問的網絡設備。 – 2010-04-27 19:02:37

+0

在這種情況下,netstat不可能顯示任何有用的東西。 – Roddy 2010-04-27 19:34:27

4

RTP通常使用UDP,這本質上是有損的。數據包可能在發送者和接收者之間的任何地方丟失,所以本地調試將告訴你什麼都沒有用。

明顯的事情要做:

  • 一個:降低整體數據速率
  • B:減少「峯值」的數據速率,通過 發送小數據包往往 而不是一個大塊每隔幾 秒。即減少你的UDP發送緩衝區 - 也許只有1400 字節。
  • c:看看您是否可以切換到RTP的TCP 變種。

如果一切都失敗,WireShark是你的朋友。它會給你一個關於多少數據的真實圖像 - 以及你的應用何時發送數據。

+0

UDP發送緩衝區是否意味着一旦發生最輕微的延遲,數據包就會在發送機器上自動丟失? – 2010-04-27 19:50:04

+0

@Gene - 這是最不可能的。儘管UDP並不保證數據包能夠被接收,但它肯定能保證數據包以某種形式被「發送」。如果沒有發送,netstat會告訴你,我想。 [當你說「UDP緩衝區」時,你的意思是什麼?我認爲UDP通常沒有被緩存......?] – Roddy 2010-04-27 20:19:00

+0

每個套接字(這也適用於UDP套接字)都有一個發送緩衝區,用於存儲數據直到網絡堆棧發送出去。應用程序可以通過setsockopt(SO_SNDBUF)影響此緩衝區的大小。當緩衝區滿時,TCP發送例程塊並丟棄UDP。 – 2010-04-27 20:29:23