Gen*_*ent 5 c++ linux networking rtp packet
我写了一个C++应用程序(在Linux上运行),它提供大约400 kbps的RTP流.对于大多数目的地,这工作正常,但一些目的地经验包丢失.有问题的目的地似乎有一个较慢的连接,但它应该足够快到我发送的流.
由于这些目的地能够为其他应用程序接收类似的RTP流而不丢包,我的应用程序可能有问题.
我已经验证了一些事情: - 在tcpdump中,我看到所有RTP数据包在发送机器上传出 - 有一个UDP发送缓冲区到位(我尝试了64KB到300KB之间的大小) - RTP数据包大多数保持在1400字节以下避免分裂
发送应用程序可以做些什么来最小化丢包的可能性以及调试这种情况的最佳方法是什么?
不要发送大块突发的数据包.
数据包丢失通常是由数据包缓冲区大小有限的慢速路由器引起的.慢速路由器可能能够处理1 Mbps就好了如果它有时间发送出10个数据包然后再接收10个数据包,但如果100 Mbps发送方向它发送了大量50个数据包它就别无选择但只能掉线其中40个.
尝试扩展发送,以便您只写出每个时间段内写入的内容.如果你必须每五分钟写一个数据包,那就这样做,而不是每秒写5个数据包.
netstat有几个有用的选项来调试情况.
第一个是netstat -su(转储UDP统计信息):
dima@linux-z8mw:/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
Run Code Online (Sandbox Code Playgroud)
注意"RcvbufErrors"和"SndbufErrors"
附加选项是监视进程的UDP缓冲区的接收和发送:
dima@linux-z8mw:/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 *:*
Run Code Online (Sandbox Code Playgroud)
在这里,您需要查看您感兴趣的连接的Recv-Q和Send-Q列.如果值高且不降为零,则过程无法处理负载.
您可以在发送和接收计算机上使用这些命令.
你也可以使用mtr,它结合了traceroute和ping - 它在路由中ping每一跳.这可能会检测到您路线中的慢跳.在其他机器上运行它以检查与第二台机器的连接.
归档时间: |
|
查看次数: |
10025 次 |
最近记录: |