最近在调试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层传输的时候,出现了这样的问题。请各位帮我分析一下是什么原因。我应该如何解决这个问题。

Denny%20Yang99373:
TCP协议本身就有可能丢包,只要能重传成功就没问题。
如果丢包严重会不会与网络环境有关系?或者是数据吞吐太他CPU负担过重?如果CPU不是456M的可以尝试用高主频版本试试。
gang liu10:
回复 Denny%20Yang99373:
非常感谢您的回复。
网络环境:我是将PC与设备直接连着,环境应该不会干扰。
数据吞吐:总数据量相比还是比较低的。目前测试阶段,除了每150毫秒发送10KByte的数据,其余的时候通信数据基本忽略不计;设备接收的数据也是很少。
CPU主频:目前工作在450MHZ,测试时,已经把其它的任务停了,基本上BIOS的其它线程只是空转;
我发送采用的是jumbo packet,是否是TCP的发送缓冲区不够,在哪里调节这个缓冲区大小,最大能调多大。
谢谢。
luo qi:
回复 gang liu10:
这个问题我之前也研究过
你的截图和我遇到的问题一样,实际上这个重传是这样发生的:
1.arm向PC发了一包数据
2.超过200ms或接近200ms没有收到PC的ACK
3.arm开始发起重传
不同的操作系统现象不一样,xp的话没有问题,win7的话这个问题暂时避免不了
另外这个对数据吞吐影响不大,我的应用带宽到几兆是没问题的
我怀疑修改ndk的超时200ms能解决这个问题,由于对项目没有影响,所以暂时没有尝试
TI中文支持网

