winpcap丢包该如何解决呢?

henrylamada 2011-07-06 11:49:58
最近在利用千兆以太网实现电路板与计算机之间的海量数据传输,遇到了一些棘手的问题。我的具体做法是:
利用FPGA的mac核与外置的PHY芯片实现千兆以太网,PHY与MAC之间的接口采用RGMII接口。计算机向板子发送控制命令,然后开始连续接收板子发送来的数据,利用Winpcap工具包在VC环境下开发的抓包工具获取并存储数据到硬盘。

遇到的问题:
1.计算机有丢包的现象。当开辟大的内核缓存(64MB),而一次发送30MB的数据时也丢包,应该不是内核缓存满了而丢包吧。
2.计算机向板子发送控制帧,有时并不被FPGA的MAC接受,经常是发送了帧,而板子没反应,既不认为是goodframe,也不认为是badframe,而是直接丢弃。(难道是RGMII接口的问题?)


tcp/ip协议在fpga上实现起来就复杂,而且效率又不见得高。我觉得在链路层用winpcap抓包是效率较高的做法了,而计算机存储的速度赶不上板子发来数据的速度。
谁有好的建议能确保不丢包呢?
...全文
1523 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
smilestone322 2014-02-03
  • 打赏
  • 举报
回复
丢包的原因有很多,可以看下我的博客,我对winpcap的源码进行了分析!
xiaohuh421 2014-01-27
  • 打赏
  • 举报
回复
我们用于做网络屏幕监控, 已经达到千兆网的极限速度也没出现丢包问题. 应该是你自己的数据包有问题. 我们使用过程中遇到丢包问题是因为我们自己组的部分raw包, 被网卡认为是"该丢弃"的包, 如果有路由器的情况,则是被路由器丢掉. 我们在这个问题上也是研究了好久, 最终是通过显波器看出来的. 你可以先这样检测: 1. 确定包每个包已经发送的网络上, 即每个包都已经穿过了网卡, 信号已经发到数据线上. 2. 确定接收端有信号进入. 3. 确定包未被接收端网卡丢弃. 4. 接收端先不用硬件接收, 先使用软件模拟接收, 排除你的板子硬件问题.
masterz 2014-01-27
  • 打赏
  • 举报
回复
创建一个Ram Disk,让winpcap写到内存里面,比如ImDisk
UDX协议 2014-01-26
  • 打赏
  • 举报
回复
可以考虑UDX协议.www.goodudx.com 通过缓冲,和重传,保证数据的可靠性,也是一种办法。
Claude_Xiao 2014-01-14
  • 打赏
  • 举报
回复
试过千兆网满速率,会丢包,丢包不仅仅是winpcap抓取速率的问题,也可能是网卡以及其他因素导致的错包直接被网卡丢弃,而不会被winpcap抓到。所以就自己用fpga verilog写了tcp协议,这样才能保证可靠性高速率的传输。
vcorange 2013-01-25
  • 打赏
  • 举报
回复
接收报文 不要每次捕获到1个包 就调用一次,而是 捕获到一定数量才调用一次函数,这样效率能够提高一些 加快报文的处理速度,即便把缓冲区设置得很大,但处理能力不够快,这样反过来,占用来大量内存,又不能尽快处理,反而适得其反,缓冲区 1M 应该够了,太大了 也未必有作用,加快处理速度才是必要的
zz139433 2013-01-21
  • 打赏
  • 举报
回复
首先楼主有没有试过去掉fwrite的动作呢? 我试验过发送980Mb/s 1514字节的数据包使用Winpcap接收不会丢包 瓶颈就是出在写文件上,非SSD硬盘写入速率是400Mbit/s ~ 700Mbit/s,如果使用这样的硬盘写入肯定会丢包 还有2楼居然使用pcap_next_ex()这种方式,这种方式是效率最低的 建议楼主做下面的试验 1.更换成固态硬盘 2.使用回调函数的方式读取数据包 3.使用Winpcap下的savedump file方式写入到硬盘
bluesen 2012-07-07
  • 打赏
  • 举报
回复
可考虑加大缓存,多线程处理
haibiantingtao 2012-07-07
  • 打赏
  • 举报
回复
请问一下什么是握手?
[Quote=引用 5 楼 的回复:]

这个问题已经解决,感谢大家出谋划策。1楼说的很对,但是只能减少丢包率,一旦传输速度很快,数据量很大时,还是会丢包,我增加了握手,每一段数据,发送一次握手,这样,在尽量减少对速度影响的前提下,实现了可靠传输。
[/Quote]
haibiantingtao 2012-07-07
  • 打赏
  • 举报
回复
我也是这么想的,但感觉指标不治本,顺便请教一下,是怎么修改用户缓冲区的?我在网上搜了一些资料,没找到
[Quote=引用 1 楼 的回复:]

我现在也开始处理这个问题,不知道您现在解决了没有。通过查找一些资料了解到,可以通过改变内核缓冲区、用户缓冲区、以及每次从内核到用户缓冲区copy数据大小这些参数来减少丢包。内核缓冲区默认的是1MB,用户缓冲区默认的是256KB。我想丢包有两种可能:一是应用程序没有来得及读取内核缓冲区数据,导致内核缓冲区填满了,数据被冲掉了。还用种可能是用户缓冲区数据被内核缓冲区新复制的数据给冲掉了。第二种可能性……
[/Quote]
haibiantingtao 2012-07-06
  • 打赏
  • 举报
回复
我现在也是遇到了这种问题,很棘手,又完全没有思路
xiao777dong 2012-06-08
  • 打赏
  • 举报
回复
你好,楼主。我想请教一下,我最近也在做这方面的问题。但是我的速度更高,50-60M/S,而且只能是UDP协议。用winpcap抓包,发现30M/S时,就会丢包,45M时,已经严重丢包。请问,不该协议,只在软件上改进的话,可否有什么并行接收数据的方法?
henrylamada 2012-06-06
  • 打赏
  • 举报
回复
这个问题已经解决,感谢大家出谋划策。1楼说的很对,但是只能减少丢包率,一旦传输速度很快,数据量很大时,还是会丢包,我增加了握手,每一段数据,发送一次握手,这样,在尽量减少对速度影响的前提下,实现了可靠传输。
su_guolong 2012-04-09
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]
winpcap不会丢包,是你的处理有问题
[/Quote]

200M以上的数据量你再试试,保证会丢包
taianmonkey 2011-12-28
  • 打赏
  • 举报
回复
winpcap不会丢包,是你的处理有问题
bigblacktree1 2011-12-26
  • 打赏
  • 举报
回复
不知道问题解决了没有,我也遇到同样的问题,关注。。
jiudu0320 2011-08-26
  • 打赏
  • 举报
回复
我现在也开始处理这个问题,不知道您现在解决了没有。通过查找一些资料了解到,可以通过改变内核缓冲区、用户缓冲区、以及每次从内核到用户缓冲区copy数据大小这些参数来减少丢包。内核缓冲区默认的是1MB,用户缓冲区默认的是256KB。我想丢包有两种可能:一是应用程序没有来得及读取内核缓冲区数据,导致内核缓冲区填满了,数据被冲掉了。还用种可能是用户缓冲区数据被内核缓冲区新复制的数据给冲掉了。第二种可能性猜测是基于这样的考虑:一般应用程序调用pcap_next_ex()函数来获取数据包,而这个函数每次只能得到一个数据包,这个数据包应该是从用户缓冲区直接读取的。当读取这个数据包后要对这个数据包进行处理,比如显示到屏幕上或存到硬盘文件中,当这个数据包被处理完后,才进行第二次pcap_next_ex()调用。因为数据包处理过程耗掉了时间,所以有可能用户缓冲区数据已经满了,pcap_next_ex()还没来得及调用,用户缓冲区数据就被内核缓冲区数据给冲掉了。可不可以将用户缓冲区设置的比较大(如512MB),这样可以集中处理用户缓冲区的数据?不知道您现在有什么想法。

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧