This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

NDK丢帧的问题



最近在调试NDK的时候,发现NDK会出现丢帧的问题,最后重传数据(TCP Retransmission).具体的现象如下:

1.使用OMAPL138处理器,NDK在ARM端,网络芯片为KSZ8863LL。使用TCP传输,socket专用一个线程,100M网络芯片,整个网络数据量不大。另外Bios/NDK/NSP的版本,我测试过各种不同的BIOS/NDK/NSP的版本,均出现此问题。

2.应用层在某一时刻发送数据量较大,例如,每150ms发送一次数据,数据量大小约为10K Byte.应用层将这10K的数据分4次发送,即调用4次sendto函数。

3.使用wireshark对数据进行抓包分析。如图所示。偶尔会出现数据丢帧现象,抓包数据显示几秒后重传丢失的数据。

4.每丢一帧数据,EMAC的寄存器-TXUNDERRUN(0x01e2325c)计数增加,其值等于重传数据帧数(wireshark所抓到的重传数据包)。

分析:

1.因为后面还能够重传成功,证明TCP/IP能够确实保存了应用层传过来的数据;

2.TXUNDERRUN寄存器计数在不断增长,其值等于wireshark抓到的重传数据包,是否可以认定在数据发送出网口之前就发生了丢帧现象。

因此我猜测是IP向ETH层传输的时候,出现了这样的问题。请各位帮我分析一下是什么原因。我应该如何解决这个问题。

  • TCP协议本身就有可能丢包,只要能重传成功就没问题。

    如果丢包严重会不会与网络环境有关系?或者是数据吞吐太他CPU负担过重?如果CPU不是456M的可以尝试用高主频版本试试。

  • 非常感谢您的回复。

    网络环境:我是将PC与设备直接连着,环境应该不会干扰。

    数据吞吐:总数据量相比还是比较低的。目前测试阶段,除了每150毫秒发送10KByte的数据,其余的时候通信数据基本忽略不计;设备接收的数据也是很少。

    CPU主频:目前工作在450MHZ,测试时,已经把其它的任务停了,基本上BIOS的其它线程只是空转;

    我发送采用的是jumbo packet,是否是TCP的发送缓冲区不够,在哪里调节这个缓冲区大小,最大能调多大。

    谢谢。

  • 这个问题我之前也研究过

    你的截图和我遇到的问题一样,实际上这个重传是这样发生的:

    1.arm向PC发了一包数据

    2.超过200ms或接近200ms没有收到PC的ACK

    3.arm开始发起重传

    不同的操作系统现象不一样,xp的话没有问题,win7的话这个问题暂时避免不了

    另外这个对数据吞吐影响不大,我的应用带宽到几兆是没问题的

    我怀疑修改ndk的超时200ms能解决这个问题,由于对项目没有影响,所以暂时没有尝试